From 7d698a13ec079a12c7681ce236abf4aa9ea765fa Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 17 Mar 2026 13:27:06 +0000
Subject: [PATCH 01/14] fix(pydantic): do not pass `by_alias` unless set
---
src/vitable_connect/_compat.py | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/vitable_connect/_compat.py b/src/vitable_connect/_compat.py
index 786ff42..e6690a4 100644
--- a/src/vitable_connect/_compat.py
+++ b/src/vitable_connect/_compat.py
@@ -2,7 +2,7 @@
from typing import TYPE_CHECKING, Any, Union, Generic, TypeVar, Callable, cast, overload
from datetime import date, datetime
-from typing_extensions import Self, Literal
+from typing_extensions import Self, Literal, TypedDict
import pydantic
from pydantic.fields import FieldInfo
@@ -131,6 +131,10 @@ def model_json(model: pydantic.BaseModel, *, indent: int | None = None) -> str:
return model.model_dump_json(indent=indent)
+class _ModelDumpKwargs(TypedDict, total=False):
+ by_alias: bool
+
+
def model_dump(
model: pydantic.BaseModel,
*,
@@ -142,6 +146,9 @@ def model_dump(
by_alias: bool | None = None,
) -> dict[str, Any]:
if (not PYDANTIC_V1) or hasattr(model, "model_dump"):
+ kwargs: _ModelDumpKwargs = {}
+ if by_alias is not None:
+ kwargs["by_alias"] = by_alias
return model.model_dump(
mode=mode,
exclude=exclude,
@@ -149,7 +156,7 @@ def model_dump(
exclude_defaults=exclude_defaults,
# warnings are not supported in Pydantic v1
warnings=True if PYDANTIC_V1 else warnings,
- by_alias=by_alias,
+ **kwargs,
)
return cast(
"dict[str, Any]",
From 4f315a4488437d128364f288ae1a2e526aceb639 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 17 Mar 2026 13:33:33 +0000
Subject: [PATCH 02/14] fix(deps): bump minimum typing-extensions version
---
pyproject.toml | 2 +-
uv.lock | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 05b20b6..c021b62 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -11,7 +11,7 @@ authors = [
dependencies = [
"httpx>=0.23.0, <1",
"pydantic>=1.9.0, <3",
- "typing-extensions>=4.10, <5",
+ "typing-extensions>=4.14, <5",
"anyio>=3.5.0, <5",
"distro>=1.7.0, <2",
"sniffio",
diff --git a/uv.lock b/uv.lock
index 972d5ba..a9b4c92 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1653,7 +1653,7 @@ requires-dist = [
{ name = "httpx-aiohttp", marker = "extra == 'aiohttp'", specifier = ">=0.1.9" },
{ name = "pydantic", specifier = ">=1.9.0,<3" },
{ name = "sniffio" },
- { name = "typing-extensions", specifier = ">=4.10,<5" },
+ { name = "typing-extensions", specifier = ">=4.14,<5" },
]
provides-extras = ["aiohttp"]
From 96b210d9f4ace8c61d48775f1cf840e8fcb18d44 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 17 Mar 2026 13:37:34 +0000
Subject: [PATCH 03/14] chore(internal): tweak CI branches
---
.github/workflows/ci.yml | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 294da0c..e493e5f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,12 +1,14 @@
name: CI
on:
push:
- branches-ignore:
- - 'generated'
- - 'codegen/**'
- - 'integrated/**'
- - 'stl-preview-head/**'
- - 'stl-preview-base/**'
+ branches:
+ - '**'
+ - '!integrated/**'
+ - '!stl-preview-head/**'
+ - '!stl-preview-base/**'
+ - '!generated'
+ - '!codegen/**'
+ - 'codegen/stl/**'
pull_request:
branches-ignore:
- 'stl-preview-head/**'
From 2d17ebab7f730aa1a9a9cba0044d7bd1f05ef3d7 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 18 Mar 2026 23:53:39 +0000
Subject: [PATCH 04/14] feat(api): api update
---
.stats.yml | 6 +-
api.md | 97 +---
src/vitable_connect/_client.py | 178 +------
src/vitable_connect/resources/__init__.py | 56 ---
.../resources/benefit_eligibility_policies.py | 10 +-
.../resources/benefit_products/__init__.py | 33 --
.../benefit_products/benefit_products.py | 263 ----------
.../resources/benefit_products/plan_years.py | 376 --------------
src/vitable_connect/resources/dependents.py | 304 -----------
.../resources/employees/employees.py | 254 +---------
.../resources/employees/enrollments.py | 146 +-----
.../resources/employers/employees.py | 247 +--------
.../resources/employers/employers.py | 260 ++--------
src/vitable_connect/resources/enrollments.py | 223 +-------
.../resources/members/__init__.py | 47 --
.../resources/members/dependents.py | 404 ---------------
.../resources/members/members.py | 146 ------
.../members/qualifying_life_events.py | 476 ------------------
src/vitable_connect/resources/plan_years.py | 312 ------------
src/vitable_connect/types/__init__.py | 14 -
.../types/benefit_eligibility_policy.py | 55 +-
.../types/benefit_product_list_params.py | 27 -
.../types/benefit_product_list_response.py | 76 ---
.../types/benefit_products/__init__.py | 7 -
.../types/benefit_products/plan_year.py | 119 -----
.../plan_year_create_params.py | 54 --
.../benefit_products/plan_year_list_params.py | 23 -
.../plan_year_list_response.py | 18 -
.../benefit_products/plan_year_response.py | 17 -
.../benefit_products/plan_year_status.py | 7 -
src/vitable_connect/types/coverage_tier.py | 7 -
src/vitable_connect/types/dependent.py | 65 ---
.../types/dependent_response.py | 17 -
.../types/dependent_update_params.py | 24 -
src/vitable_connect/types/employee.py | 119 ++---
.../types/employee_response.py | 5 -
.../types/employee_update_params.py | 61 ---
.../types/employees/__init__.py | 1 -
.../types/employees/enrollment_list_params.py | 11 -
.../enrollment_submit_elections_params.py | 44 --
src/vitable_connect/types/employer.py | 8 +-
...ployer_create_eligibility_policy_params.py | 37 +-
.../types/employer_list_params.py | 6 -
.../types/employer_update_params.py | 41 --
.../types/employers/__init__.py | 1 -
.../types/employers/employee_create_params.py | 85 ----
.../types/employers/employee_list_params.py | 8 -
src/vitable_connect/types/enrollment.py | 116 +++--
.../types/enrollment_list_plans_response.py | 77 ---
.../types/enrollment_reissue_params.py | 16 -
.../types/enrollment_response.py | 5 -
src/vitable_connect/types/members/__init__.py | 11 -
.../types/members/dependent_create_params.py | 47 --
.../types/members/dependent_list_params.py | 23 -
.../types/members/dependent_list_response.py | 18 -
.../types/members/event_type.py | 19 -
.../types/members/qualifying_life_event.py | 63 ---
.../qualifying_life_event_list_params.py | 24 -
.../qualifying_life_event_list_response.py | 18 -
.../qualifying_life_event_record_params.py | 35 --
.../members/qualifying_life_event_response.py | 17 -
.../members/qualifying_life_event_status.py | 7 -
src/vitable_connect/types/plan_tier.py | 7 -
.../types/plan_year_update_params.py | 48 --
src/vitable_connect/types/relationship.py | 7 -
src/vitable_connect/types/sex.py | 7 -
.../benefit_products/__init__.py | 1 -
.../benefit_products/test_plan_years.py | 372 --------------
.../employees/test_enrollments.py | 186 -------
.../api_resources/employers/test_employees.py | 200 --------
tests/api_resources/members/__init__.py | 1 -
.../api_resources/members/test_dependents.py | 290 -----------
.../members/test_qualifying_life_events.py | 362 -------------
tests/api_resources/test_benefit_products.py | 104 ----
tests/api_resources/test_dependents.py | 214 --------
tests/api_resources/test_employees.py | 211 --------
tests/api_resources/test_employers.py | 301 +----------
tests/api_resources/test_enrollments.py | 198 +-------
tests/api_resources/test_plan_years.py | 243 ---------
79 files changed, 205 insertions(+), 7838 deletions(-)
delete mode 100644 src/vitable_connect/resources/benefit_products/__init__.py
delete mode 100644 src/vitable_connect/resources/benefit_products/benefit_products.py
delete mode 100644 src/vitable_connect/resources/benefit_products/plan_years.py
delete mode 100644 src/vitable_connect/resources/dependents.py
delete mode 100644 src/vitable_connect/resources/members/__init__.py
delete mode 100644 src/vitable_connect/resources/members/dependents.py
delete mode 100644 src/vitable_connect/resources/members/members.py
delete mode 100644 src/vitable_connect/resources/members/qualifying_life_events.py
delete mode 100644 src/vitable_connect/resources/plan_years.py
delete mode 100644 src/vitable_connect/types/benefit_product_list_params.py
delete mode 100644 src/vitable_connect/types/benefit_product_list_response.py
delete mode 100644 src/vitable_connect/types/benefit_products/plan_year.py
delete mode 100644 src/vitable_connect/types/benefit_products/plan_year_create_params.py
delete mode 100644 src/vitable_connect/types/benefit_products/plan_year_list_params.py
delete mode 100644 src/vitable_connect/types/benefit_products/plan_year_list_response.py
delete mode 100644 src/vitable_connect/types/benefit_products/plan_year_response.py
delete mode 100644 src/vitable_connect/types/benefit_products/plan_year_status.py
delete mode 100644 src/vitable_connect/types/coverage_tier.py
delete mode 100644 src/vitable_connect/types/dependent.py
delete mode 100644 src/vitable_connect/types/dependent_response.py
delete mode 100644 src/vitable_connect/types/dependent_update_params.py
delete mode 100644 src/vitable_connect/types/employee_update_params.py
delete mode 100644 src/vitable_connect/types/employees/enrollment_submit_elections_params.py
delete mode 100644 src/vitable_connect/types/employer_update_params.py
delete mode 100644 src/vitable_connect/types/employers/employee_create_params.py
delete mode 100644 src/vitable_connect/types/enrollment_list_plans_response.py
delete mode 100644 src/vitable_connect/types/enrollment_reissue_params.py
delete mode 100644 src/vitable_connect/types/members/dependent_create_params.py
delete mode 100644 src/vitable_connect/types/members/dependent_list_params.py
delete mode 100644 src/vitable_connect/types/members/dependent_list_response.py
delete mode 100644 src/vitable_connect/types/members/event_type.py
delete mode 100644 src/vitable_connect/types/members/qualifying_life_event.py
delete mode 100644 src/vitable_connect/types/members/qualifying_life_event_list_params.py
delete mode 100644 src/vitable_connect/types/members/qualifying_life_event_list_response.py
delete mode 100644 src/vitable_connect/types/members/qualifying_life_event_record_params.py
delete mode 100644 src/vitable_connect/types/members/qualifying_life_event_response.py
delete mode 100644 src/vitable_connect/types/members/qualifying_life_event_status.py
delete mode 100644 src/vitable_connect/types/plan_tier.py
delete mode 100644 src/vitable_connect/types/plan_year_update_params.py
delete mode 100644 src/vitable_connect/types/relationship.py
delete mode 100644 src/vitable_connect/types/sex.py
delete mode 100644 tests/api_resources/benefit_products/__init__.py
delete mode 100644 tests/api_resources/benefit_products/test_plan_years.py
delete mode 100644 tests/api_resources/members/__init__.py
delete mode 100644 tests/api_resources/members/test_dependents.py
delete mode 100644 tests/api_resources/members/test_qualifying_life_events.py
delete mode 100644 tests/api_resources/test_benefit_products.py
delete mode 100644 tests/api_resources/test_dependents.py
delete mode 100644 tests/api_resources/test_plan_years.py
diff --git a/.stats.yml b/.stats.yml
index da31f6a..5f6a219 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 29
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-da7778e69a30f55bdfb58bc3df94cefe7b13a37eee9640eac1aaf43f57a8d149.yml
-openapi_spec_hash: 031c9c1d1a6be156666b3230e0b9fb44
+configured_endpoints: 10
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-0320b76d8102774d1e66595d7afa37964a6b6d8df15bf01fc90998f83576be1d.yml
+openapi_spec_hash: 8d72aaaef87e5e28fcff79bfc13929e2
config_hash: 686598ed50ce0ac460d9a06417655317
diff --git a/api.md b/api.md
index 8c3424d..cb3a689 100644
--- a/api.md
+++ b/api.md
@@ -27,57 +27,20 @@ Methods:
Types:
```python
-from vitable_connect.types import Category, Pagination, ProductCode, BenefitProductListResponse
+from vitable_connect.types import Category, Pagination, ProductCode
```
-Methods:
-
-- client.benefit_products.list(\*\*params) -> BenefitProductListResponse
-
-## PlanYears
-
-Types:
-
-```python
-from vitable_connect.types.benefit_products import (
- PlanYear,
- PlanYearResponse,
- PlanYearStatus,
- PlanYearListResponse,
-)
-```
-
-Methods:
-
-- client.benefit_products.plan_years.create(benefit_product_id, \*\*params) -> PlanYearResponse
-- client.benefit_products.plan_years.list(benefit_product_id, \*\*params) -> PlanYearListResponse
-
-# Dependents
-
-Types:
-
-```python
-from vitable_connect.types import Dependent, DependentResponse, Relationship
-```
-
-Methods:
-
-- client.dependents.retrieve(dependent_id) -> DependentResponse
-- client.dependents.update(dependent_id, \*\*params) -> DependentResponse
-
# Employees
Types:
```python
-from vitable_connect.types import Employee, EmployeeClass, EmployeeResponse, Sex
+from vitable_connect.types import Employee, EmployeeClass, EmployeeResponse
```
Methods:
- client.employees.retrieve(employee_id) -> EmployeeResponse
-- client.employees.update(employee_id, \*\*params) -> EmployeeResponse
-- client.employees.terminate(employee_id) -> None
## Enrollments
@@ -90,7 +53,6 @@ from vitable_connect.types.employees import EnrollmentList
Methods:
- client.employees.enrollments.list(employee_id, \*\*params) -> EnrollmentList
-- client.employees.enrollments.submit_elections(employee_id, \*\*params) -> EnrollmentList
# Employers
@@ -104,7 +66,6 @@ Methods:
- client.employers.create(\*\*params) -> EmployerResponse
- client.employers.retrieve(employer_id) -> EmployerResponse
-- client.employers.update(employer_id, \*\*params) -> EmployerResponse
- client.employers.list(\*\*params) -> EmployerListResponse
- client.employers.create_eligibility_policy(employer_id, \*\*params) -> BenefitEligibilityPolicy
@@ -118,7 +79,6 @@ from vitable_connect.types.employers import EmployeeListResponse
Methods:
-- client.employers.employees.create(employer_id, \*\*params) -> EmployeeResponse
- client.employers.employees.list(employer_id, \*\*params) -> EmployeeListResponse
# Enrollments
@@ -126,60 +86,9 @@ Methods:
Types:
```python
-from vitable_connect.types import (
- CoverageTier,
- Enrollment,
- EnrollmentResponse,
- EnrollmentStatus,
- PlanTier,
- EnrollmentListPlansResponse,
-)
+from vitable_connect.types import Enrollment, EnrollmentResponse, EnrollmentStatus
```
Methods:
- client.enrollments.retrieve(enrollment_id) -> EnrollmentResponse
-- client.enrollments.list_plans(enrollment_id) -> EnrollmentListPlansResponse
-- client.enrollments.reissue(enrollment_id, \*\*params) -> EnrollmentResponse
-
-# Members
-
-## Dependents
-
-Types:
-
-```python
-from vitable_connect.types.members import DependentListResponse
-```
-
-Methods:
-
-- client.members.dependents.create(member_id, \*\*params) -> DependentResponse
-- client.members.dependents.list(member_id, \*\*params) -> DependentListResponse
-
-## QualifyingLifeEvents
-
-Types:
-
-```python
-from vitable_connect.types.members import (
- EventType,
- QualifyingLifeEvent,
- QualifyingLifeEventResponse,
- QualifyingLifeEventStatus,
- QualifyingLifeEventListResponse,
-)
-```
-
-Methods:
-
-- client.members.qualifying_life_events.retrieve(qle_id, \*, member_id) -> QualifyingLifeEventResponse
-- client.members.qualifying_life_events.list(member_id, \*\*params) -> QualifyingLifeEventListResponse
-- client.members.qualifying_life_events.record(member_id, \*\*params) -> QualifyingLifeEventResponse
-
-# PlanYears
-
-Methods:
-
-- client.plan_years.retrieve(plan_year_id) -> PlanYearResponse
-- client.plan_years.update(plan_year_id, \*\*params) -> PlanYearResponse
diff --git a/src/vitable_connect/_client.py b/src/vitable_connect/_client.py
index 1cad96f..e3403b9 100644
--- a/src/vitable_connect/_client.py
+++ b/src/vitable_connect/_client.py
@@ -32,29 +32,15 @@
)
if TYPE_CHECKING:
- from .resources import (
- auth,
- members,
- employees,
- employers,
- dependents,
- plan_years,
- enrollments,
- benefit_products,
- benefit_eligibility_policies,
- )
+ from .resources import auth, employees, employers, enrollments, benefit_eligibility_policies
from .resources.auth import AuthResource, AsyncAuthResource
- from .resources.dependents import DependentsResource, AsyncDependentsResource
- from .resources.plan_years import PlanYearsResource, AsyncPlanYearsResource
from .resources.enrollments import EnrollmentsResource, AsyncEnrollmentsResource
- from .resources.members.members import MembersResource, AsyncMembersResource
from .resources.employees.employees import EmployeesResource, AsyncEmployeesResource
from .resources.employers.employers import EmployersResource, AsyncEmployersResource
from .resources.benefit_eligibility_policies import (
BenefitEligibilityPoliciesResource,
AsyncBenefitEligibilityPoliciesResource,
)
- from .resources.benefit_products.benefit_products import BenefitProductsResource, AsyncBenefitProductsResource
__all__ = [
"ENVIRONMENTS",
@@ -167,20 +153,6 @@ def benefit_eligibility_policies(self) -> BenefitEligibilityPoliciesResource:
return BenefitEligibilityPoliciesResource(self)
- @cached_property
- def benefit_products(self) -> BenefitProductsResource:
- """Browse available benefit products that can be offered to employers"""
- from .resources.benefit_products import BenefitProductsResource
-
- return BenefitProductsResource(self)
-
- @cached_property
- def dependents(self) -> DependentsResource:
- """Manage dependent records (spouses, children) for employees"""
- from .resources.dependents import DependentsResource
-
- return DependentsResource(self)
-
@cached_property
def employees(self) -> EmployeesResource:
"""Manage employee records for employers"""
@@ -201,19 +173,6 @@ def enrollments(self) -> EnrollmentsResource:
return EnrollmentsResource(self)
- @cached_property
- def members(self) -> MembersResource:
- from .resources.members import MembersResource
-
- return MembersResource(self)
-
- @cached_property
- def plan_years(self) -> PlanYearsResource:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- from .resources.plan_years import PlanYearsResource
-
- return PlanYearsResource(self)
-
@cached_property
def with_raw_response(self) -> VitableConnectWithRawResponse:
return VitableConnectWithRawResponse(self)
@@ -427,20 +386,6 @@ def benefit_eligibility_policies(self) -> AsyncBenefitEligibilityPoliciesResourc
return AsyncBenefitEligibilityPoliciesResource(self)
- @cached_property
- def benefit_products(self) -> AsyncBenefitProductsResource:
- """Browse available benefit products that can be offered to employers"""
- from .resources.benefit_products import AsyncBenefitProductsResource
-
- return AsyncBenefitProductsResource(self)
-
- @cached_property
- def dependents(self) -> AsyncDependentsResource:
- """Manage dependent records (spouses, children) for employees"""
- from .resources.dependents import AsyncDependentsResource
-
- return AsyncDependentsResource(self)
-
@cached_property
def employees(self) -> AsyncEmployeesResource:
"""Manage employee records for employers"""
@@ -461,19 +406,6 @@ def enrollments(self) -> AsyncEnrollmentsResource:
return AsyncEnrollmentsResource(self)
- @cached_property
- def members(self) -> AsyncMembersResource:
- from .resources.members import AsyncMembersResource
-
- return AsyncMembersResource(self)
-
- @cached_property
- def plan_years(self) -> AsyncPlanYearsResource:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- from .resources.plan_years import AsyncPlanYearsResource
-
- return AsyncPlanYearsResource(self)
-
@cached_property
def with_raw_response(self) -> AsyncVitableConnectWithRawResponse:
return AsyncVitableConnectWithRawResponse(self)
@@ -616,20 +548,6 @@ def benefit_eligibility_policies(
return BenefitEligibilityPoliciesResourceWithRawResponse(self._client.benefit_eligibility_policies)
- @cached_property
- def benefit_products(self) -> benefit_products.BenefitProductsResourceWithRawResponse:
- """Browse available benefit products that can be offered to employers"""
- from .resources.benefit_products import BenefitProductsResourceWithRawResponse
-
- return BenefitProductsResourceWithRawResponse(self._client.benefit_products)
-
- @cached_property
- def dependents(self) -> dependents.DependentsResourceWithRawResponse:
- """Manage dependent records (spouses, children) for employees"""
- from .resources.dependents import DependentsResourceWithRawResponse
-
- return DependentsResourceWithRawResponse(self._client.dependents)
-
@cached_property
def employees(self) -> employees.EmployeesResourceWithRawResponse:
"""Manage employee records for employers"""
@@ -650,19 +568,6 @@ def enrollments(self) -> enrollments.EnrollmentsResourceWithRawResponse:
return EnrollmentsResourceWithRawResponse(self._client.enrollments)
- @cached_property
- def members(self) -> members.MembersResourceWithRawResponse:
- from .resources.members import MembersResourceWithRawResponse
-
- return MembersResourceWithRawResponse(self._client.members)
-
- @cached_property
- def plan_years(self) -> plan_years.PlanYearsResourceWithRawResponse:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- from .resources.plan_years import PlanYearsResourceWithRawResponse
-
- return PlanYearsResourceWithRawResponse(self._client.plan_years)
-
class AsyncVitableConnectWithRawResponse:
_client: AsyncVitableConnect
@@ -686,20 +591,6 @@ def benefit_eligibility_policies(
return AsyncBenefitEligibilityPoliciesResourceWithRawResponse(self._client.benefit_eligibility_policies)
- @cached_property
- def benefit_products(self) -> benefit_products.AsyncBenefitProductsResourceWithRawResponse:
- """Browse available benefit products that can be offered to employers"""
- from .resources.benefit_products import AsyncBenefitProductsResourceWithRawResponse
-
- return AsyncBenefitProductsResourceWithRawResponse(self._client.benefit_products)
-
- @cached_property
- def dependents(self) -> dependents.AsyncDependentsResourceWithRawResponse:
- """Manage dependent records (spouses, children) for employees"""
- from .resources.dependents import AsyncDependentsResourceWithRawResponse
-
- return AsyncDependentsResourceWithRawResponse(self._client.dependents)
-
@cached_property
def employees(self) -> employees.AsyncEmployeesResourceWithRawResponse:
"""Manage employee records for employers"""
@@ -720,19 +611,6 @@ def enrollments(self) -> enrollments.AsyncEnrollmentsResourceWithRawResponse:
return AsyncEnrollmentsResourceWithRawResponse(self._client.enrollments)
- @cached_property
- def members(self) -> members.AsyncMembersResourceWithRawResponse:
- from .resources.members import AsyncMembersResourceWithRawResponse
-
- return AsyncMembersResourceWithRawResponse(self._client.members)
-
- @cached_property
- def plan_years(self) -> plan_years.AsyncPlanYearsResourceWithRawResponse:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- from .resources.plan_years import AsyncPlanYearsResourceWithRawResponse
-
- return AsyncPlanYearsResourceWithRawResponse(self._client.plan_years)
-
class VitableConnectWithStreamedResponse:
_client: VitableConnect
@@ -756,20 +634,6 @@ def benefit_eligibility_policies(
return BenefitEligibilityPoliciesResourceWithStreamingResponse(self._client.benefit_eligibility_policies)
- @cached_property
- def benefit_products(self) -> benefit_products.BenefitProductsResourceWithStreamingResponse:
- """Browse available benefit products that can be offered to employers"""
- from .resources.benefit_products import BenefitProductsResourceWithStreamingResponse
-
- return BenefitProductsResourceWithStreamingResponse(self._client.benefit_products)
-
- @cached_property
- def dependents(self) -> dependents.DependentsResourceWithStreamingResponse:
- """Manage dependent records (spouses, children) for employees"""
- from .resources.dependents import DependentsResourceWithStreamingResponse
-
- return DependentsResourceWithStreamingResponse(self._client.dependents)
-
@cached_property
def employees(self) -> employees.EmployeesResourceWithStreamingResponse:
"""Manage employee records for employers"""
@@ -790,19 +654,6 @@ def enrollments(self) -> enrollments.EnrollmentsResourceWithStreamingResponse:
return EnrollmentsResourceWithStreamingResponse(self._client.enrollments)
- @cached_property
- def members(self) -> members.MembersResourceWithStreamingResponse:
- from .resources.members import MembersResourceWithStreamingResponse
-
- return MembersResourceWithStreamingResponse(self._client.members)
-
- @cached_property
- def plan_years(self) -> plan_years.PlanYearsResourceWithStreamingResponse:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- from .resources.plan_years import PlanYearsResourceWithStreamingResponse
-
- return PlanYearsResourceWithStreamingResponse(self._client.plan_years)
-
class AsyncVitableConnectWithStreamedResponse:
_client: AsyncVitableConnect
@@ -826,20 +677,6 @@ def benefit_eligibility_policies(
return AsyncBenefitEligibilityPoliciesResourceWithStreamingResponse(self._client.benefit_eligibility_policies)
- @cached_property
- def benefit_products(self) -> benefit_products.AsyncBenefitProductsResourceWithStreamingResponse:
- """Browse available benefit products that can be offered to employers"""
- from .resources.benefit_products import AsyncBenefitProductsResourceWithStreamingResponse
-
- return AsyncBenefitProductsResourceWithStreamingResponse(self._client.benefit_products)
-
- @cached_property
- def dependents(self) -> dependents.AsyncDependentsResourceWithStreamingResponse:
- """Manage dependent records (spouses, children) for employees"""
- from .resources.dependents import AsyncDependentsResourceWithStreamingResponse
-
- return AsyncDependentsResourceWithStreamingResponse(self._client.dependents)
-
@cached_property
def employees(self) -> employees.AsyncEmployeesResourceWithStreamingResponse:
"""Manage employee records for employers"""
@@ -860,19 +697,6 @@ def enrollments(self) -> enrollments.AsyncEnrollmentsResourceWithStreamingRespon
return AsyncEnrollmentsResourceWithStreamingResponse(self._client.enrollments)
- @cached_property
- def members(self) -> members.AsyncMembersResourceWithStreamingResponse:
- from .resources.members import AsyncMembersResourceWithStreamingResponse
-
- return AsyncMembersResourceWithStreamingResponse(self._client.members)
-
- @cached_property
- def plan_years(self) -> plan_years.AsyncPlanYearsResourceWithStreamingResponse:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- from .resources.plan_years import AsyncPlanYearsResourceWithStreamingResponse
-
- return AsyncPlanYearsResourceWithStreamingResponse(self._client.plan_years)
-
Client = VitableConnect
diff --git a/src/vitable_connect/resources/__init__.py b/src/vitable_connect/resources/__init__.py
index 6a27989..2c98f33 100644
--- a/src/vitable_connect/resources/__init__.py
+++ b/src/vitable_connect/resources/__init__.py
@@ -8,14 +8,6 @@
AuthResourceWithStreamingResponse,
AsyncAuthResourceWithStreamingResponse,
)
-from .members import (
- MembersResource,
- AsyncMembersResource,
- MembersResourceWithRawResponse,
- AsyncMembersResourceWithRawResponse,
- MembersResourceWithStreamingResponse,
- AsyncMembersResourceWithStreamingResponse,
-)
from .employees import (
EmployeesResource,
AsyncEmployeesResource,
@@ -32,22 +24,6 @@
EmployersResourceWithStreamingResponse,
AsyncEmployersResourceWithStreamingResponse,
)
-from .dependents import (
- DependentsResource,
- AsyncDependentsResource,
- DependentsResourceWithRawResponse,
- AsyncDependentsResourceWithRawResponse,
- DependentsResourceWithStreamingResponse,
- AsyncDependentsResourceWithStreamingResponse,
-)
-from .plan_years import (
- PlanYearsResource,
- AsyncPlanYearsResource,
- PlanYearsResourceWithRawResponse,
- AsyncPlanYearsResourceWithRawResponse,
- PlanYearsResourceWithStreamingResponse,
- AsyncPlanYearsResourceWithStreamingResponse,
-)
from .enrollments import (
EnrollmentsResource,
AsyncEnrollmentsResource,
@@ -56,14 +32,6 @@
EnrollmentsResourceWithStreamingResponse,
AsyncEnrollmentsResourceWithStreamingResponse,
)
-from .benefit_products import (
- BenefitProductsResource,
- AsyncBenefitProductsResource,
- BenefitProductsResourceWithRawResponse,
- AsyncBenefitProductsResourceWithRawResponse,
- BenefitProductsResourceWithStreamingResponse,
- AsyncBenefitProductsResourceWithStreamingResponse,
-)
from .benefit_eligibility_policies import (
BenefitEligibilityPoliciesResource,
AsyncBenefitEligibilityPoliciesResource,
@@ -86,18 +54,6 @@
"AsyncBenefitEligibilityPoliciesResourceWithRawResponse",
"BenefitEligibilityPoliciesResourceWithStreamingResponse",
"AsyncBenefitEligibilityPoliciesResourceWithStreamingResponse",
- "BenefitProductsResource",
- "AsyncBenefitProductsResource",
- "BenefitProductsResourceWithRawResponse",
- "AsyncBenefitProductsResourceWithRawResponse",
- "BenefitProductsResourceWithStreamingResponse",
- "AsyncBenefitProductsResourceWithStreamingResponse",
- "DependentsResource",
- "AsyncDependentsResource",
- "DependentsResourceWithRawResponse",
- "AsyncDependentsResourceWithRawResponse",
- "DependentsResourceWithStreamingResponse",
- "AsyncDependentsResourceWithStreamingResponse",
"EmployeesResource",
"AsyncEmployeesResource",
"EmployeesResourceWithRawResponse",
@@ -116,16 +72,4 @@
"AsyncEnrollmentsResourceWithRawResponse",
"EnrollmentsResourceWithStreamingResponse",
"AsyncEnrollmentsResourceWithStreamingResponse",
- "MembersResource",
- "AsyncMembersResource",
- "MembersResourceWithRawResponse",
- "AsyncMembersResourceWithRawResponse",
- "MembersResourceWithStreamingResponse",
- "AsyncMembersResourceWithStreamingResponse",
- "PlanYearsResource",
- "AsyncPlanYearsResource",
- "PlanYearsResourceWithRawResponse",
- "AsyncPlanYearsResourceWithRawResponse",
- "PlanYearsResourceWithStreamingResponse",
- "AsyncPlanYearsResourceWithStreamingResponse",
]
diff --git a/src/vitable_connect/resources/benefit_eligibility_policies.py b/src/vitable_connect/resources/benefit_eligibility_policies.py
index b5360cb..a707f3e 100644
--- a/src/vitable_connect/resources/benefit_eligibility_policies.py
+++ b/src/vitable_connect/resources/benefit_eligibility_policies.py
@@ -53,10 +53,7 @@ def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> BenefitEligibilityPolicy:
"""
- Retrieves detailed information for a specific benefit eligibility policy by ID.
- Returns the complete policy configuration including all eligibility rules,
- effective dates, associated employer information, and any waiting period
- requirements.
+ Retrieves a benefit eligibility policy by ID.
Args:
policy_id: Unique benefit eligibility policy identifier (epol\\__\\**)
@@ -114,10 +111,7 @@ async def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> BenefitEligibilityPolicy:
"""
- Retrieves detailed information for a specific benefit eligibility policy by ID.
- Returns the complete policy configuration including all eligibility rules,
- effective dates, associated employer information, and any waiting period
- requirements.
+ Retrieves a benefit eligibility policy by ID.
Args:
policy_id: Unique benefit eligibility policy identifier (epol\\__\\**)
diff --git a/src/vitable_connect/resources/benefit_products/__init__.py b/src/vitable_connect/resources/benefit_products/__init__.py
deleted file mode 100644
index 7bc7f31..0000000
--- a/src/vitable_connect/resources/benefit_products/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .plan_years import (
- PlanYearsResource,
- AsyncPlanYearsResource,
- PlanYearsResourceWithRawResponse,
- AsyncPlanYearsResourceWithRawResponse,
- PlanYearsResourceWithStreamingResponse,
- AsyncPlanYearsResourceWithStreamingResponse,
-)
-from .benefit_products import (
- BenefitProductsResource,
- AsyncBenefitProductsResource,
- BenefitProductsResourceWithRawResponse,
- AsyncBenefitProductsResourceWithRawResponse,
- BenefitProductsResourceWithStreamingResponse,
- AsyncBenefitProductsResourceWithStreamingResponse,
-)
-
-__all__ = [
- "PlanYearsResource",
- "AsyncPlanYearsResource",
- "PlanYearsResourceWithRawResponse",
- "AsyncPlanYearsResourceWithRawResponse",
- "PlanYearsResourceWithStreamingResponse",
- "AsyncPlanYearsResourceWithStreamingResponse",
- "BenefitProductsResource",
- "AsyncBenefitProductsResource",
- "BenefitProductsResourceWithRawResponse",
- "AsyncBenefitProductsResourceWithRawResponse",
- "BenefitProductsResourceWithStreamingResponse",
- "AsyncBenefitProductsResourceWithStreamingResponse",
-]
diff --git a/src/vitable_connect/resources/benefit_products/benefit_products.py b/src/vitable_connect/resources/benefit_products/benefit_products.py
deleted file mode 100644
index 3118b16..0000000
--- a/src/vitable_connect/resources/benefit_products/benefit_products.py
+++ /dev/null
@@ -1,263 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ...types import Category, ProductCode, benefit_product_list_params
-from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ..._utils import maybe_transform, async_maybe_transform
-from ..._compat import cached_property
-from .plan_years import (
- PlanYearsResource,
- AsyncPlanYearsResource,
- PlanYearsResourceWithRawResponse,
- AsyncPlanYearsResourceWithRawResponse,
- PlanYearsResourceWithStreamingResponse,
- AsyncPlanYearsResourceWithStreamingResponse,
-)
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from ..._base_client import make_request_options
-from ...types.category import Category
-from ...types.product_code import ProductCode
-from ...types.benefit_product_list_response import BenefitProductListResponse
-
-__all__ = ["BenefitProductsResource", "AsyncBenefitProductsResource"]
-
-
-class BenefitProductsResource(SyncAPIResource):
- """Browse available benefit products that can be offered to employers"""
-
- @cached_property
- def plan_years(self) -> PlanYearsResource:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- return PlanYearsResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> BenefitProductsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return BenefitProductsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> BenefitProductsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return BenefitProductsResourceWithStreamingResponse(self)
-
- def list(
- self,
- *,
- active_in: bool | Omit = omit,
- category: Category | Omit = omit,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- product_code: ProductCode | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BenefitProductListResponse:
- """
- Retrieves a paginated list of all benefit products that the authenticated
- organization has access to and can offer to their employers. Use query
- parameters to filter by category, product code, or active status.
-
- Args:
- active_in: Filter by active status
-
- category: Filter by product category
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- product_code: Filter by product code
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/v1/benefit-products",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "active_in": active_in,
- "category": category,
- "limit": limit,
- "page": page,
- "product_code": product_code,
- },
- benefit_product_list_params.BenefitProductListParams,
- ),
- ),
- cast_to=BenefitProductListResponse,
- )
-
-
-class AsyncBenefitProductsResource(AsyncAPIResource):
- """Browse available benefit products that can be offered to employers"""
-
- @cached_property
- def plan_years(self) -> AsyncPlanYearsResource:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- return AsyncPlanYearsResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> AsyncBenefitProductsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return AsyncBenefitProductsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncBenefitProductsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return AsyncBenefitProductsResourceWithStreamingResponse(self)
-
- async def list(
- self,
- *,
- active_in: bool | Omit = omit,
- category: Category | Omit = omit,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- product_code: ProductCode | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BenefitProductListResponse:
- """
- Retrieves a paginated list of all benefit products that the authenticated
- organization has access to and can offer to their employers. Use query
- parameters to filter by category, product code, or active status.
-
- Args:
- active_in: Filter by active status
-
- category: Filter by product category
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- product_code: Filter by product code
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/v1/benefit-products",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "active_in": active_in,
- "category": category,
- "limit": limit,
- "page": page,
- "product_code": product_code,
- },
- benefit_product_list_params.BenefitProductListParams,
- ),
- ),
- cast_to=BenefitProductListResponse,
- )
-
-
-class BenefitProductsResourceWithRawResponse:
- def __init__(self, benefit_products: BenefitProductsResource) -> None:
- self._benefit_products = benefit_products
-
- self.list = to_raw_response_wrapper(
- benefit_products.list,
- )
-
- @cached_property
- def plan_years(self) -> PlanYearsResourceWithRawResponse:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- return PlanYearsResourceWithRawResponse(self._benefit_products.plan_years)
-
-
-class AsyncBenefitProductsResourceWithRawResponse:
- def __init__(self, benefit_products: AsyncBenefitProductsResource) -> None:
- self._benefit_products = benefit_products
-
- self.list = async_to_raw_response_wrapper(
- benefit_products.list,
- )
-
- @cached_property
- def plan_years(self) -> AsyncPlanYearsResourceWithRawResponse:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- return AsyncPlanYearsResourceWithRawResponse(self._benefit_products.plan_years)
-
-
-class BenefitProductsResourceWithStreamingResponse:
- def __init__(self, benefit_products: BenefitProductsResource) -> None:
- self._benefit_products = benefit_products
-
- self.list = to_streamed_response_wrapper(
- benefit_products.list,
- )
-
- @cached_property
- def plan_years(self) -> PlanYearsResourceWithStreamingResponse:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- return PlanYearsResourceWithStreamingResponse(self._benefit_products.plan_years)
-
-
-class AsyncBenefitProductsResourceWithStreamingResponse:
- def __init__(self, benefit_products: AsyncBenefitProductsResource) -> None:
- self._benefit_products = benefit_products
-
- self.list = async_to_streamed_response_wrapper(
- benefit_products.list,
- )
-
- @cached_property
- def plan_years(self) -> AsyncPlanYearsResourceWithStreamingResponse:
- """Configure annual benefit periods with coverage dates and contribution settings"""
- return AsyncPlanYearsResourceWithStreamingResponse(self._benefit_products.plan_years)
diff --git a/src/vitable_connect/resources/benefit_products/plan_years.py b/src/vitable_connect/resources/benefit_products/plan_years.py
deleted file mode 100644
index f15a615..0000000
--- a/src/vitable_connect/resources/benefit_products/plan_years.py
+++ /dev/null
@@ -1,376 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union, Iterable
-from datetime import date
-
-import httpx
-
-from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ..._utils import maybe_transform, async_maybe_transform
-from ..._compat import cached_property
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from ..._base_client import make_request_options
-from ...types.benefit_products import PlanYearStatus, plan_year_list_params, plan_year_create_params
-from ...types.benefit_products.plan_year_status import PlanYearStatus
-from ...types.benefit_products.plan_year_response import PlanYearResponse
-from ...types.benefit_products.plan_year_list_response import PlanYearListResponse
-
-__all__ = ["PlanYearsResource", "AsyncPlanYearsResource"]
-
-
-class PlanYearsResource(SyncAPIResource):
- """Configure annual benefit periods with coverage dates and contribution settings"""
-
- @cached_property
- def with_raw_response(self) -> PlanYearsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return PlanYearsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> PlanYearsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return PlanYearsResourceWithStreamingResponse(self)
-
- def create(
- self,
- benefit_product_id: str,
- *,
- contribution_classes: Iterable[plan_year_create_params.ContributionClass],
- coverage_end: Union[str, date],
- coverage_start: Union[str, date],
- employer_id: str,
- open_enrollment_end: Union[str, date],
- open_enrollment_start: Union[str, date],
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> PlanYearResponse:
- """
- Creates a new plan year configuration for a benefit product and employer.
- Configures coverage period dates, open enrollment window, and contribution
- structure. All monetary values must be in cents.
-
- Args:
- benefit_product_id: Unique benefit product identifier (bprd\\__\\**)
-
- contribution_classes: List of contribution classes (at least one required)
-
- coverage_end: Coverage end date
-
- coverage_start: Coverage start date
-
- employer_id: Employer ID this plan year is for (empr\\__\\**)
-
- open_enrollment_end: Open enrollment end date
-
- open_enrollment_start: Open enrollment start date
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not benefit_product_id:
- raise ValueError(f"Expected a non-empty value for `benefit_product_id` but received {benefit_product_id!r}")
- return self._post(
- f"/v1/benefit-products/{benefit_product_id}/plan-years",
- body=maybe_transform(
- {
- "contribution_classes": contribution_classes,
- "coverage_end": coverage_end,
- "coverage_start": coverage_start,
- "employer_id": employer_id,
- "open_enrollment_end": open_enrollment_end,
- "open_enrollment_start": open_enrollment_start,
- },
- plan_year_create_params.PlanYearCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=PlanYearResponse,
- )
-
- def list(
- self,
- benefit_product_id: str,
- *,
- employer_id: str | Omit = omit,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- status: PlanYearStatus | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> PlanYearListResponse:
- """Retrieves a paginated list of plan years for a specific benefit product.
-
- Plan
- years define the coverage periods, open enrollment windows, and cost structure.
- Results are sorted by most recent plan year first.
-
- Args:
- benefit_product_id: Unique benefit product identifier (bprd\\__\\**)
-
- employer_id: Filter by employer ID
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- status: Filter by plan year status
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not benefit_product_id:
- raise ValueError(f"Expected a non-empty value for `benefit_product_id` but received {benefit_product_id!r}")
- return self._get(
- f"/v1/benefit-products/{benefit_product_id}/plan-years",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "employer_id": employer_id,
- "limit": limit,
- "page": page,
- "status": status,
- },
- plan_year_list_params.PlanYearListParams,
- ),
- ),
- cast_to=PlanYearListResponse,
- )
-
-
-class AsyncPlanYearsResource(AsyncAPIResource):
- """Configure annual benefit periods with coverage dates and contribution settings"""
-
- @cached_property
- def with_raw_response(self) -> AsyncPlanYearsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return AsyncPlanYearsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncPlanYearsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return AsyncPlanYearsResourceWithStreamingResponse(self)
-
- async def create(
- self,
- benefit_product_id: str,
- *,
- contribution_classes: Iterable[plan_year_create_params.ContributionClass],
- coverage_end: Union[str, date],
- coverage_start: Union[str, date],
- employer_id: str,
- open_enrollment_end: Union[str, date],
- open_enrollment_start: Union[str, date],
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> PlanYearResponse:
- """
- Creates a new plan year configuration for a benefit product and employer.
- Configures coverage period dates, open enrollment window, and contribution
- structure. All monetary values must be in cents.
-
- Args:
- benefit_product_id: Unique benefit product identifier (bprd\\__\\**)
-
- contribution_classes: List of contribution classes (at least one required)
-
- coverage_end: Coverage end date
-
- coverage_start: Coverage start date
-
- employer_id: Employer ID this plan year is for (empr\\__\\**)
-
- open_enrollment_end: Open enrollment end date
-
- open_enrollment_start: Open enrollment start date
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not benefit_product_id:
- raise ValueError(f"Expected a non-empty value for `benefit_product_id` but received {benefit_product_id!r}")
- return await self._post(
- f"/v1/benefit-products/{benefit_product_id}/plan-years",
- body=await async_maybe_transform(
- {
- "contribution_classes": contribution_classes,
- "coverage_end": coverage_end,
- "coverage_start": coverage_start,
- "employer_id": employer_id,
- "open_enrollment_end": open_enrollment_end,
- "open_enrollment_start": open_enrollment_start,
- },
- plan_year_create_params.PlanYearCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=PlanYearResponse,
- )
-
- async def list(
- self,
- benefit_product_id: str,
- *,
- employer_id: str | Omit = omit,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- status: PlanYearStatus | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> PlanYearListResponse:
- """Retrieves a paginated list of plan years for a specific benefit product.
-
- Plan
- years define the coverage periods, open enrollment windows, and cost structure.
- Results are sorted by most recent plan year first.
-
- Args:
- benefit_product_id: Unique benefit product identifier (bprd\\__\\**)
-
- employer_id: Filter by employer ID
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- status: Filter by plan year status
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not benefit_product_id:
- raise ValueError(f"Expected a non-empty value for `benefit_product_id` but received {benefit_product_id!r}")
- return await self._get(
- f"/v1/benefit-products/{benefit_product_id}/plan-years",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "employer_id": employer_id,
- "limit": limit,
- "page": page,
- "status": status,
- },
- plan_year_list_params.PlanYearListParams,
- ),
- ),
- cast_to=PlanYearListResponse,
- )
-
-
-class PlanYearsResourceWithRawResponse:
- def __init__(self, plan_years: PlanYearsResource) -> None:
- self._plan_years = plan_years
-
- self.create = to_raw_response_wrapper(
- plan_years.create,
- )
- self.list = to_raw_response_wrapper(
- plan_years.list,
- )
-
-
-class AsyncPlanYearsResourceWithRawResponse:
- def __init__(self, plan_years: AsyncPlanYearsResource) -> None:
- self._plan_years = plan_years
-
- self.create = async_to_raw_response_wrapper(
- plan_years.create,
- )
- self.list = async_to_raw_response_wrapper(
- plan_years.list,
- )
-
-
-class PlanYearsResourceWithStreamingResponse:
- def __init__(self, plan_years: PlanYearsResource) -> None:
- self._plan_years = plan_years
-
- self.create = to_streamed_response_wrapper(
- plan_years.create,
- )
- self.list = to_streamed_response_wrapper(
- plan_years.list,
- )
-
-
-class AsyncPlanYearsResourceWithStreamingResponse:
- def __init__(self, plan_years: AsyncPlanYearsResource) -> None:
- self._plan_years = plan_years
-
- self.create = async_to_streamed_response_wrapper(
- plan_years.create,
- )
- self.list = async_to_streamed_response_wrapper(
- plan_years.list,
- )
diff --git a/src/vitable_connect/resources/dependents.py b/src/vitable_connect/resources/dependents.py
deleted file mode 100644
index e79eace..0000000
--- a/src/vitable_connect/resources/dependents.py
+++ /dev/null
@@ -1,304 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-
-import httpx
-
-from ..types import Relationship, dependent_update_params
-from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.relationship import Relationship
-from ..types.dependent_response import DependentResponse
-
-__all__ = ["DependentsResource", "AsyncDependentsResource"]
-
-
-class DependentsResource(SyncAPIResource):
- """Manage dependent records (spouses, children) for employees"""
-
- @cached_property
- def with_raw_response(self) -> DependentsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return DependentsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> DependentsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return DependentsResourceWithStreamingResponse(self)
-
- def retrieve(
- self,
- dependent_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> DependentResponse:
- """Retrieves detailed information for a specific dependent by ID.
-
- Returns dependent
- profile including name, date of birth, and relationship type.
-
- Args:
- dependent_id: Unique dependent identifier (dpnd\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not dependent_id:
- raise ValueError(f"Expected a non-empty value for `dependent_id` but received {dependent_id!r}")
- return self._get(
- f"/v1/dependents/{dependent_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=DependentResponse,
- )
-
- def update(
- self,
- dependent_id: str,
- *,
- active: Optional[bool] | Omit = omit,
- gender: Optional[str] | Omit = omit,
- relationship: Optional[Relationship] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> DependentResponse:
- """Updates an existing dependent's mutable information.
-
- Allows modification of
- relationship type and active status. Name, DOB, and sex cannot be modified after
- creation.
-
- Args:
- dependent_id: Unique dependent identifier (dpnd\\__\\**)
-
- active: Whether the dependent is active
-
- gender: Gender identity
-
- relationship: - `Spouse` - Spouse
- - `Child` - Child
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not dependent_id:
- raise ValueError(f"Expected a non-empty value for `dependent_id` but received {dependent_id!r}")
- return self._put(
- f"/v1/dependents/{dependent_id}",
- body=maybe_transform(
- {
- "active": active,
- "gender": gender,
- "relationship": relationship,
- },
- dependent_update_params.DependentUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=DependentResponse,
- )
-
-
-class AsyncDependentsResource(AsyncAPIResource):
- """Manage dependent records (spouses, children) for employees"""
-
- @cached_property
- def with_raw_response(self) -> AsyncDependentsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return AsyncDependentsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncDependentsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return AsyncDependentsResourceWithStreamingResponse(self)
-
- async def retrieve(
- self,
- dependent_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> DependentResponse:
- """Retrieves detailed information for a specific dependent by ID.
-
- Returns dependent
- profile including name, date of birth, and relationship type.
-
- Args:
- dependent_id: Unique dependent identifier (dpnd\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not dependent_id:
- raise ValueError(f"Expected a non-empty value for `dependent_id` but received {dependent_id!r}")
- return await self._get(
- f"/v1/dependents/{dependent_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=DependentResponse,
- )
-
- async def update(
- self,
- dependent_id: str,
- *,
- active: Optional[bool] | Omit = omit,
- gender: Optional[str] | Omit = omit,
- relationship: Optional[Relationship] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> DependentResponse:
- """Updates an existing dependent's mutable information.
-
- Allows modification of
- relationship type and active status. Name, DOB, and sex cannot be modified after
- creation.
-
- Args:
- dependent_id: Unique dependent identifier (dpnd\\__\\**)
-
- active: Whether the dependent is active
-
- gender: Gender identity
-
- relationship: - `Spouse` - Spouse
- - `Child` - Child
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not dependent_id:
- raise ValueError(f"Expected a non-empty value for `dependent_id` but received {dependent_id!r}")
- return await self._put(
- f"/v1/dependents/{dependent_id}",
- body=await async_maybe_transform(
- {
- "active": active,
- "gender": gender,
- "relationship": relationship,
- },
- dependent_update_params.DependentUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=DependentResponse,
- )
-
-
-class DependentsResourceWithRawResponse:
- def __init__(self, dependents: DependentsResource) -> None:
- self._dependents = dependents
-
- self.retrieve = to_raw_response_wrapper(
- dependents.retrieve,
- )
- self.update = to_raw_response_wrapper(
- dependents.update,
- )
-
-
-class AsyncDependentsResourceWithRawResponse:
- def __init__(self, dependents: AsyncDependentsResource) -> None:
- self._dependents = dependents
-
- self.retrieve = async_to_raw_response_wrapper(
- dependents.retrieve,
- )
- self.update = async_to_raw_response_wrapper(
- dependents.update,
- )
-
-
-class DependentsResourceWithStreamingResponse:
- def __init__(self, dependents: DependentsResource) -> None:
- self._dependents = dependents
-
- self.retrieve = to_streamed_response_wrapper(
- dependents.retrieve,
- )
- self.update = to_streamed_response_wrapper(
- dependents.update,
- )
-
-
-class AsyncDependentsResourceWithStreamingResponse:
- def __init__(self, dependents: AsyncDependentsResource) -> None:
- self._dependents = dependents
-
- self.retrieve = async_to_streamed_response_wrapper(
- dependents.retrieve,
- )
- self.update = async_to_streamed_response_wrapper(
- dependents.update,
- )
diff --git a/src/vitable_connect/resources/employees/employees.py b/src/vitable_connect/resources/employees/employees.py
index 950cbcd..0be7a15 100644
--- a/src/vitable_connect/resources/employees/employees.py
+++ b/src/vitable_connect/resources/employees/employees.py
@@ -2,14 +2,9 @@
from __future__ import annotations
-from typing import Union, Optional
-from datetime import date
-
import httpx
-from ...types import EmployeeClass, employee_update_params
-from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
-from ..._utils import maybe_transform, async_maybe_transform
+from ..._types import Body, Query, Headers, NotGiven, not_given
from ..._compat import cached_property
from ..._resource import SyncAPIResource, AsyncAPIResource
from ..._response import (
@@ -27,7 +22,6 @@
AsyncEnrollmentsResourceWithStreamingResponse,
)
from ..._base_client import make_request_options
-from ...types.employee_class import EmployeeClass
from ...types.employee_response import EmployeeResponse
__all__ = ["EmployeesResource", "AsyncEmployeesResource"]
@@ -97,117 +91,6 @@ def retrieve(
cast_to=EmployeeResponse,
)
- def update(
- self,
- employee_id: str,
- *,
- address: Optional[employee_update_params.Address] | Omit = omit,
- email: Optional[str] | Omit = omit,
- employee_class: Optional[EmployeeClass] | Omit = omit,
- gender: Optional[str] | Omit = omit,
- phone: Optional[str] | Omit = omit,
- termination_date: Union[str, date, None] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployeeResponse:
- """Updates an existing employee's information.
-
- All fields are optional - only
- provided fields will be updated. Note: SSN, name, date of birth, and sex cannot
- be changed after creation.
-
- Args:
- employee_id: Unique employee identifier (empl\\__\\**)
-
- address: Employee's residential address
-
- email: Email address
-
- employee_class: - `Full Time` - Full Time
- - `Part Time` - Part Time
- - `Temporary` - Temporary
- - `Intern` - Intern
- - `Seasonal` - Seasonal
- - `Individual Contractor` - Individual Contractor
-
- gender: Gender identity
-
- phone: Phone number
-
- termination_date: Termination date if terminating
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employee_id:
- raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- return self._put(
- f"/v1/employees/{employee_id}",
- body=maybe_transform(
- {
- "address": address,
- "email": email,
- "employee_class": employee_class,
- "gender": gender,
- "phone": phone,
- "termination_date": termination_date,
- },
- employee_update_params.EmployeeUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EmployeeResponse,
- )
-
- def terminate(
- self,
- employee_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> None:
- """Terminates a specific employee.
-
- This sets the employee's active status to false
- and records a termination date. The employee record is not permanently deleted
- for compliance reasons.
-
- Args:
- employee_id: Unique employee identifier (empl\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employee_id:
- raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- extra_headers = {"Accept": "*/*", **(extra_headers or {})}
- return self._delete(
- f"/v1/employees/{employee_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=NoneType,
- )
-
class AsyncEmployeesResource(AsyncAPIResource):
"""Manage employee records for employers"""
@@ -273,117 +156,6 @@ async def retrieve(
cast_to=EmployeeResponse,
)
- async def update(
- self,
- employee_id: str,
- *,
- address: Optional[employee_update_params.Address] | Omit = omit,
- email: Optional[str] | Omit = omit,
- employee_class: Optional[EmployeeClass] | Omit = omit,
- gender: Optional[str] | Omit = omit,
- phone: Optional[str] | Omit = omit,
- termination_date: Union[str, date, None] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployeeResponse:
- """Updates an existing employee's information.
-
- All fields are optional - only
- provided fields will be updated. Note: SSN, name, date of birth, and sex cannot
- be changed after creation.
-
- Args:
- employee_id: Unique employee identifier (empl\\__\\**)
-
- address: Employee's residential address
-
- email: Email address
-
- employee_class: - `Full Time` - Full Time
- - `Part Time` - Part Time
- - `Temporary` - Temporary
- - `Intern` - Intern
- - `Seasonal` - Seasonal
- - `Individual Contractor` - Individual Contractor
-
- gender: Gender identity
-
- phone: Phone number
-
- termination_date: Termination date if terminating
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employee_id:
- raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- return await self._put(
- f"/v1/employees/{employee_id}",
- body=await async_maybe_transform(
- {
- "address": address,
- "email": email,
- "employee_class": employee_class,
- "gender": gender,
- "phone": phone,
- "termination_date": termination_date,
- },
- employee_update_params.EmployeeUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EmployeeResponse,
- )
-
- async def terminate(
- self,
- employee_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> None:
- """Terminates a specific employee.
-
- This sets the employee's active status to false
- and records a termination date. The employee record is not permanently deleted
- for compliance reasons.
-
- Args:
- employee_id: Unique employee identifier (empl\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employee_id:
- raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- extra_headers = {"Accept": "*/*", **(extra_headers or {})}
- return await self._delete(
- f"/v1/employees/{employee_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=NoneType,
- )
-
class EmployeesResourceWithRawResponse:
def __init__(self, employees: EmployeesResource) -> None:
@@ -392,12 +164,6 @@ def __init__(self, employees: EmployeesResource) -> None:
self.retrieve = to_raw_response_wrapper(
employees.retrieve,
)
- self.update = to_raw_response_wrapper(
- employees.update,
- )
- self.terminate = to_raw_response_wrapper(
- employees.terminate,
- )
@cached_property
def enrollments(self) -> EnrollmentsResourceWithRawResponse:
@@ -412,12 +178,6 @@ def __init__(self, employees: AsyncEmployeesResource) -> None:
self.retrieve = async_to_raw_response_wrapper(
employees.retrieve,
)
- self.update = async_to_raw_response_wrapper(
- employees.update,
- )
- self.terminate = async_to_raw_response_wrapper(
- employees.terminate,
- )
@cached_property
def enrollments(self) -> AsyncEnrollmentsResourceWithRawResponse:
@@ -432,12 +192,6 @@ def __init__(self, employees: EmployeesResource) -> None:
self.retrieve = to_streamed_response_wrapper(
employees.retrieve,
)
- self.update = to_streamed_response_wrapper(
- employees.update,
- )
- self.terminate = to_streamed_response_wrapper(
- employees.terminate,
- )
@cached_property
def enrollments(self) -> EnrollmentsResourceWithStreamingResponse:
@@ -452,12 +206,6 @@ def __init__(self, employees: AsyncEmployeesResource) -> None:
self.retrieve = async_to_streamed_response_wrapper(
employees.retrieve,
)
- self.update = async_to_streamed_response_wrapper(
- employees.update,
- )
- self.terminate = async_to_streamed_response_wrapper(
- employees.terminate,
- )
@cached_property
def enrollments(self) -> AsyncEnrollmentsResourceWithStreamingResponse:
diff --git a/src/vitable_connect/resources/employees/enrollments.py b/src/vitable_connect/resources/employees/enrollments.py
index a2de441..1391b83 100644
--- a/src/vitable_connect/resources/employees/enrollments.py
+++ b/src/vitable_connect/resources/employees/enrollments.py
@@ -2,11 +2,8 @@
from __future__ import annotations
-from typing import Iterable
-
import httpx
-from ...types import EnrollmentStatus
from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
from ..._utils import maybe_transform, async_maybe_transform
from ..._compat import cached_property
@@ -18,8 +15,7 @@
async_to_streamed_response_wrapper,
)
from ..._base_client import make_request_options
-from ...types.employees import enrollment_list_params, enrollment_submit_elections_params
-from ...types.enrollment_status import EnrollmentStatus
+from ...types.employees import enrollment_list_params
from ...types.employees.enrollment_list import EnrollmentList
__all__ = ["EnrollmentsResource", "AsyncEnrollmentsResource"]
@@ -51,11 +47,8 @@ def list(
self,
employee_id: str,
*,
- coverage_effective_start_year: int | Omit = omit,
limit: int | Omit = omit,
page: int | Omit = omit,
- plan_year: int | Omit = omit,
- status: EnrollmentStatus | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -63,26 +56,16 @@ def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> EnrollmentList:
- """Retrieves a paginated list of benefit enrollments for an employee.
-
- Enrollments
- have statuses: 'pending' (in enrollment period), 'enrolled' (active coverage),
- or 'inactive' (terminated, expired, or unanswered). Filter by status, plan year,
- or coverage year.
+ """
+ Retrieves a paginated list of benefit enrollments for an employee.
Args:
employee_id: Unique employee identifier (empl\\__\\**)
- coverage_effective_start_year: Filter by coverage year
-
limit: Items per page (default: 20, max: 100)
page: Page number (default: 1)
- plan_year: Filter by plan year start (YYYY)
-
- status: Filter by enrollment status
-
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -102,11 +85,8 @@ def list(
timeout=timeout,
query=maybe_transform(
{
- "coverage_effective_start_year": coverage_effective_start_year,
"limit": limit,
"page": page,
- "plan_year": plan_year,
- "status": status,
},
enrollment_list_params.EnrollmentListParams,
),
@@ -114,50 +94,6 @@ def list(
cast_to=EnrollmentList,
)
- def submit_elections(
- self,
- employee_id: str,
- *,
- elections: Iterable[enrollment_submit_elections_params.Election],
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EnrollmentList:
- """
- Completes the benefits election process for all pending enrollments for an
- employee. Processes enrollment decisions: which benefits to enroll/waive, plan
- selections, and dependent coverage. Pending enrollments transition to enrolled
- or waived status based on elections.
-
- Args:
- employee_id: Unique employee identifier (empl\\__\\**)
-
- elections: List of enrollment elections
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employee_id:
- raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- return self._post(
- f"/v1/employees/{employee_id}/enrollments/elect",
- body=maybe_transform(
- {"elections": elections}, enrollment_submit_elections_params.EnrollmentSubmitElectionsParams
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EnrollmentList,
- )
-
class AsyncEnrollmentsResource(AsyncAPIResource):
"""Manage benefit enrollments and elections for employees"""
@@ -185,11 +121,8 @@ async def list(
self,
employee_id: str,
*,
- coverage_effective_start_year: int | Omit = omit,
limit: int | Omit = omit,
page: int | Omit = omit,
- plan_year: int | Omit = omit,
- status: EnrollmentStatus | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -197,26 +130,16 @@ async def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> EnrollmentList:
- """Retrieves a paginated list of benefit enrollments for an employee.
-
- Enrollments
- have statuses: 'pending' (in enrollment period), 'enrolled' (active coverage),
- or 'inactive' (terminated, expired, or unanswered). Filter by status, plan year,
- or coverage year.
+ """
+ Retrieves a paginated list of benefit enrollments for an employee.
Args:
employee_id: Unique employee identifier (empl\\__\\**)
- coverage_effective_start_year: Filter by coverage year
-
limit: Items per page (default: 20, max: 100)
page: Page number (default: 1)
- plan_year: Filter by plan year start (YYYY)
-
- status: Filter by enrollment status
-
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -236,11 +159,8 @@ async def list(
timeout=timeout,
query=await async_maybe_transform(
{
- "coverage_effective_start_year": coverage_effective_start_year,
"limit": limit,
"page": page,
- "plan_year": plan_year,
- "status": status,
},
enrollment_list_params.EnrollmentListParams,
),
@@ -248,50 +168,6 @@ async def list(
cast_to=EnrollmentList,
)
- async def submit_elections(
- self,
- employee_id: str,
- *,
- elections: Iterable[enrollment_submit_elections_params.Election],
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EnrollmentList:
- """
- Completes the benefits election process for all pending enrollments for an
- employee. Processes enrollment decisions: which benefits to enroll/waive, plan
- selections, and dependent coverage. Pending enrollments transition to enrolled
- or waived status based on elections.
-
- Args:
- employee_id: Unique employee identifier (empl\\__\\**)
-
- elections: List of enrollment elections
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employee_id:
- raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- return await self._post(
- f"/v1/employees/{employee_id}/enrollments/elect",
- body=await async_maybe_transform(
- {"elections": elections}, enrollment_submit_elections_params.EnrollmentSubmitElectionsParams
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EnrollmentList,
- )
-
class EnrollmentsResourceWithRawResponse:
def __init__(self, enrollments: EnrollmentsResource) -> None:
@@ -300,9 +176,6 @@ def __init__(self, enrollments: EnrollmentsResource) -> None:
self.list = to_raw_response_wrapper(
enrollments.list,
)
- self.submit_elections = to_raw_response_wrapper(
- enrollments.submit_elections,
- )
class AsyncEnrollmentsResourceWithRawResponse:
@@ -312,9 +185,6 @@ def __init__(self, enrollments: AsyncEnrollmentsResource) -> None:
self.list = async_to_raw_response_wrapper(
enrollments.list,
)
- self.submit_elections = async_to_raw_response_wrapper(
- enrollments.submit_elections,
- )
class EnrollmentsResourceWithStreamingResponse:
@@ -324,9 +194,6 @@ def __init__(self, enrollments: EnrollmentsResource) -> None:
self.list = to_streamed_response_wrapper(
enrollments.list,
)
- self.submit_elections = to_streamed_response_wrapper(
- enrollments.submit_elections,
- )
class AsyncEnrollmentsResourceWithStreamingResponse:
@@ -336,6 +203,3 @@ def __init__(self, enrollments: AsyncEnrollmentsResource) -> None:
self.list = async_to_streamed_response_wrapper(
enrollments.list,
)
- self.submit_elections = async_to_streamed_response_wrapper(
- enrollments.submit_elections,
- )
diff --git a/src/vitable_connect/resources/employers/employees.py b/src/vitable_connect/resources/employers/employees.py
index aaec018..b412719 100644
--- a/src/vitable_connect/resources/employers/employees.py
+++ b/src/vitable_connect/resources/employers/employees.py
@@ -2,12 +2,8 @@
from __future__ import annotations
-from typing import Union, Optional
-from datetime import date
-
import httpx
-from ...types import Sex, EmployeeClass
from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
from ..._utils import maybe_transform, async_maybe_transform
from ..._compat import cached_property
@@ -18,11 +14,8 @@
async_to_raw_response_wrapper,
async_to_streamed_response_wrapper,
)
-from ...types.sex import Sex
from ..._base_client import make_request_options
-from ...types.employers import employee_list_params, employee_create_params
-from ...types.employee_class import EmployeeClass
-from ...types.employee_response import EmployeeResponse
+from ...types.employers import employee_list_params
from ...types.employers.employee_list_response import EmployeeListResponse
__all__ = ["EmployeesResource", "AsyncEmployeesResource"]
@@ -50,112 +43,10 @@ def with_streaming_response(self) -> EmployeesResourceWithStreamingResponse:
"""
return EmployeesResourceWithStreamingResponse(self)
- def create(
- self,
- employer_id: str,
- *,
- date_of_birth: Union[str, date],
- email: str,
- first_name: str,
- last_name: str,
- sex: Sex,
- ssn: str,
- start_date: Union[str, date],
- address: Optional[employee_create_params.Address] | Omit = omit,
- employee_class: Optional[EmployeeClass] | Omit = omit,
- gender: Optional[str] | Omit = omit,
- phone: Optional[str] | Omit = omit,
- suffix: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployeeResponse:
- """Creates a new employee for a specific employer.
-
- Requires personal information
- (name, DOB, SSN) and employment details (start date). Note: SSN can only be
- specified at creation time and cannot be updated later. Returns the created
- employee with assigned ID.
-
- Args:
- employer_id: Filter by employer ID
-
- date_of_birth: Date of birth (YYYY-MM-DD)
-
- email: Email address
-
- first_name: Employee's legal first name
-
- last_name: Employee's legal last name
-
- sex: - `Male` - Male
- - `Female` - Female
- - `Other` - Other
- - `Unknown` - Unknown
-
- ssn: Social Security Number (XXX-XX-XXXX or XXXXXXXXX). Only accepted on create.
-
- start_date: Employment start/hire date
-
- address: Employee's residential address
-
- employee_class: - `Full Time` - Full Time
- - `Part Time` - Part Time
- - `Temporary` - Temporary
- - `Intern` - Intern
- - `Seasonal` - Seasonal
- - `Individual Contractor` - Individual Contractor
-
- gender: Gender identity
-
- phone: Phone number
-
- suffix: Name suffix (Jr., Sr., III)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employer_id:
- raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
- return self._post(
- f"/v1/employers/{employer_id}/employees",
- body=maybe_transform(
- {
- "date_of_birth": date_of_birth,
- "email": email,
- "first_name": first_name,
- "last_name": last_name,
- "sex": sex,
- "ssn": ssn,
- "start_date": start_date,
- "address": address,
- "employee_class": employee_class,
- "gender": gender,
- "phone": phone,
- "suffix": suffix,
- },
- employee_create_params.EmployeeCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EmployeeResponse,
- )
-
def list(
self,
employer_id: str,
*,
- active_in: bool | Omit = omit,
- employee_class: EmployeeClass | Omit = omit,
limit: int | Omit = omit,
page: int | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
@@ -167,16 +58,11 @@ def list(
) -> EmployeeListResponse:
"""Retrieves a paginated list of all employees for a specific employer.
- Use query
- parameters to filter by active status or employment classification. Results are
+ Results are
paginated using page and limit parameters.
Args:
- employer_id: Filter by employer ID
-
- active_in: Filter by active status
-
- employee_class: Filter by employment classification
+ employer_id: Unique employer identifier (empr\\__\\**)
limit: Items per page (default: 20, max: 100)
@@ -201,8 +87,6 @@ def list(
timeout=timeout,
query=maybe_transform(
{
- "active_in": active_in,
- "employee_class": employee_class,
"limit": limit,
"page": page,
},
@@ -235,112 +119,10 @@ def with_streaming_response(self) -> AsyncEmployeesResourceWithStreamingResponse
"""
return AsyncEmployeesResourceWithStreamingResponse(self)
- async def create(
- self,
- employer_id: str,
- *,
- date_of_birth: Union[str, date],
- email: str,
- first_name: str,
- last_name: str,
- sex: Sex,
- ssn: str,
- start_date: Union[str, date],
- address: Optional[employee_create_params.Address] | Omit = omit,
- employee_class: Optional[EmployeeClass] | Omit = omit,
- gender: Optional[str] | Omit = omit,
- phone: Optional[str] | Omit = omit,
- suffix: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployeeResponse:
- """Creates a new employee for a specific employer.
-
- Requires personal information
- (name, DOB, SSN) and employment details (start date). Note: SSN can only be
- specified at creation time and cannot be updated later. Returns the created
- employee with assigned ID.
-
- Args:
- employer_id: Filter by employer ID
-
- date_of_birth: Date of birth (YYYY-MM-DD)
-
- email: Email address
-
- first_name: Employee's legal first name
-
- last_name: Employee's legal last name
-
- sex: - `Male` - Male
- - `Female` - Female
- - `Other` - Other
- - `Unknown` - Unknown
-
- ssn: Social Security Number (XXX-XX-XXXX or XXXXXXXXX). Only accepted on create.
-
- start_date: Employment start/hire date
-
- address: Employee's residential address
-
- employee_class: - `Full Time` - Full Time
- - `Part Time` - Part Time
- - `Temporary` - Temporary
- - `Intern` - Intern
- - `Seasonal` - Seasonal
- - `Individual Contractor` - Individual Contractor
-
- gender: Gender identity
-
- phone: Phone number
-
- suffix: Name suffix (Jr., Sr., III)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employer_id:
- raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
- return await self._post(
- f"/v1/employers/{employer_id}/employees",
- body=await async_maybe_transform(
- {
- "date_of_birth": date_of_birth,
- "email": email,
- "first_name": first_name,
- "last_name": last_name,
- "sex": sex,
- "ssn": ssn,
- "start_date": start_date,
- "address": address,
- "employee_class": employee_class,
- "gender": gender,
- "phone": phone,
- "suffix": suffix,
- },
- employee_create_params.EmployeeCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EmployeeResponse,
- )
-
async def list(
self,
employer_id: str,
*,
- active_in: bool | Omit = omit,
- employee_class: EmployeeClass | Omit = omit,
limit: int | Omit = omit,
page: int | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
@@ -352,16 +134,11 @@ async def list(
) -> EmployeeListResponse:
"""Retrieves a paginated list of all employees for a specific employer.
- Use query
- parameters to filter by active status or employment classification. Results are
+ Results are
paginated using page and limit parameters.
Args:
- employer_id: Filter by employer ID
-
- active_in: Filter by active status
-
- employee_class: Filter by employment classification
+ employer_id: Unique employer identifier (empr\\__\\**)
limit: Items per page (default: 20, max: 100)
@@ -386,8 +163,6 @@ async def list(
timeout=timeout,
query=await async_maybe_transform(
{
- "active_in": active_in,
- "employee_class": employee_class,
"limit": limit,
"page": page,
},
@@ -402,9 +177,6 @@ class EmployeesResourceWithRawResponse:
def __init__(self, employees: EmployeesResource) -> None:
self._employees = employees
- self.create = to_raw_response_wrapper(
- employees.create,
- )
self.list = to_raw_response_wrapper(
employees.list,
)
@@ -414,9 +186,6 @@ class AsyncEmployeesResourceWithRawResponse:
def __init__(self, employees: AsyncEmployeesResource) -> None:
self._employees = employees
- self.create = async_to_raw_response_wrapper(
- employees.create,
- )
self.list = async_to_raw_response_wrapper(
employees.list,
)
@@ -426,9 +195,6 @@ class EmployeesResourceWithStreamingResponse:
def __init__(self, employees: EmployeesResource) -> None:
self._employees = employees
- self.create = to_streamed_response_wrapper(
- employees.create,
- )
self.list = to_streamed_response_wrapper(
employees.list,
)
@@ -438,9 +204,6 @@ class AsyncEmployeesResourceWithStreamingResponse:
def __init__(self, employees: AsyncEmployeesResource) -> None:
self._employees = employees
- self.create = async_to_streamed_response_wrapper(
- employees.create,
- )
self.list = async_to_streamed_response_wrapper(
employees.list,
)
diff --git a/src/vitable_connect/resources/employers/employers.py b/src/vitable_connect/resources/employers/employers.py
index 8a66490..e387445 100644
--- a/src/vitable_connect/resources/employers/employers.py
+++ b/src/vitable_connect/resources/employers/employers.py
@@ -2,17 +2,9 @@
from __future__ import annotations
-from typing import Union, Iterable, Optional
-from datetime import date
-
import httpx
-from ...types import (
- employer_list_params,
- employer_create_params,
- employer_update_params,
- employer_create_eligibility_policy_params,
-)
+from ...types import employer_list_params, employer_create_params, employer_create_eligibility_policy_params
from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
from ..._utils import maybe_transform, async_maybe_transform
from ..._compat import cached_property
@@ -139,7 +131,7 @@ def retrieve(
belong to the authenticated organization.
Args:
- employer_id: Filter by employer ID
+ employer_id: Unique employer identifier (empr\\__\\**)
extra_headers: Send extra headers
@@ -159,70 +151,10 @@ def retrieve(
cast_to=EmployerResponse,
)
- def update(
- self,
- employer_id: str,
- *,
- active: Optional[bool] | Omit = omit,
- address: Optional[employer_update_params.Address] | Omit = omit,
- legal_name: Optional[str] | Omit = omit,
- name: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployerResponse:
- """Updates an existing employer's information.
-
- All fields are optional - only
- provided fields will be updated. Note: EIN cannot be changed after creation.
-
- Args:
- employer_id: Filter by employer ID
-
- active: Whether the employer is active
-
- address: Employer address
-
- legal_name: Legal business name
-
- name: Employer display name
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employer_id:
- raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
- return self._put(
- f"/v1/employers/{employer_id}",
- body=maybe_transform(
- {
- "active": active,
- "address": address,
- "legal_name": legal_name,
- "name": name,
- },
- employer_update_params.EmployerUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EmployerResponse,
- )
-
def list(
self,
*,
- active_in: bool | Omit = omit,
limit: int | Omit = omit,
- name: str | Omit = omit,
page: int | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -232,17 +164,13 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> EmployerListResponse:
"""
- Retrieves a paginated list of all employers that the authenticated organization
- has access to. Use query parameters to filter by name or active status. Results
- are paginated using page and limit parameters.
+ Retrieves a paginated list of all employers belonging to the authenticated
+ organization. Results are sorted by creation date (newest first) and paginated
+ using page and limit parameters.
Args:
- active_in: Filter by active status
-
limit: Items per page (default: 20, max: 100)
- name: Filter by employer name (partial match)
-
page: Page number (default: 1)
extra_headers: Send extra headers
@@ -262,9 +190,7 @@ def list(
timeout=timeout,
query=maybe_transform(
{
- "active_in": active_in,
"limit": limit,
- "name": name,
"page": page,
},
employer_list_params.EmployerListParams,
@@ -277,11 +203,8 @@ def create_eligibility_policy(
self,
employer_id: str,
*,
- effective_date: Union[str, date],
- name: str,
- rules: Iterable[employer_create_eligibility_policy_params.Rule],
- policy_to_replace_id: str | Omit = omit,
- description: Optional[str] | Omit = omit,
+ classification: str,
+ waiting_period: str,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -289,27 +212,16 @@ def create_eligibility_policy(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> BenefitEligibilityPolicy:
- """Creates a new benefit eligibility policy for a specific employer.
-
- Eligibility
- policies define rules that determine which employees qualify for benefits based
- on criteria such as employment status (full-time, part-time), hours worked per
- week, waiting periods after hire date, or other custom requirements. Optionally
- provide 'policy_to_replace_id' as a query parameter to replace an existing
- policy.
+ """
+ Creates a benefit eligibility policy for the specified employer.
Args:
- employer_id: Filter by employer ID
+ employer_id: Unique employer identifier (empr\\__\\**)
- effective_date: Date when policy becomes effective
+ classification: Which employee classifications are eligible. One of: full_time, part_time, all
- name: Display name for the policy
-
- rules: List of eligibility rules (at least one required)
-
- policy_to_replace_id: ID of existing policy to replace (epol\\__\\**)
-
- description: Detailed description
+ waiting_period: Waiting period before eligibility. One of: first_of_following_month, 30_days,
+ 60_days, none
extra_headers: Send extra headers
@@ -325,22 +237,13 @@ def create_eligibility_policy(
f"/v1/employers/{employer_id}/benefit-eligibility-policies",
body=maybe_transform(
{
- "effective_date": effective_date,
- "name": name,
- "rules": rules,
- "description": description,
+ "classification": classification,
+ "waiting_period": waiting_period,
},
employer_create_eligibility_policy_params.EmployerCreateEligibilityPolicyParams,
),
options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {"policy_to_replace_id": policy_to_replace_id},
- employer_create_eligibility_policy_params.EmployerCreateEligibilityPolicyParams,
- ),
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
cast_to=BenefitEligibilityPolicy,
)
@@ -446,7 +349,7 @@ async def retrieve(
belong to the authenticated organization.
Args:
- employer_id: Filter by employer ID
+ employer_id: Unique employer identifier (empr\\__\\**)
extra_headers: Send extra headers
@@ -466,70 +369,10 @@ async def retrieve(
cast_to=EmployerResponse,
)
- async def update(
- self,
- employer_id: str,
- *,
- active: Optional[bool] | Omit = omit,
- address: Optional[employer_update_params.Address] | Omit = omit,
- legal_name: Optional[str] | Omit = omit,
- name: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployerResponse:
- """Updates an existing employer's information.
-
- All fields are optional - only
- provided fields will be updated. Note: EIN cannot be changed after creation.
-
- Args:
- employer_id: Filter by employer ID
-
- active: Whether the employer is active
-
- address: Employer address
-
- legal_name: Legal business name
-
- name: Employer display name
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employer_id:
- raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
- return await self._put(
- f"/v1/employers/{employer_id}",
- body=await async_maybe_transform(
- {
- "active": active,
- "address": address,
- "legal_name": legal_name,
- "name": name,
- },
- employer_update_params.EmployerUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EmployerResponse,
- )
-
async def list(
self,
*,
- active_in: bool | Omit = omit,
limit: int | Omit = omit,
- name: str | Omit = omit,
page: int | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -539,17 +382,13 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> EmployerListResponse:
"""
- Retrieves a paginated list of all employers that the authenticated organization
- has access to. Use query parameters to filter by name or active status. Results
- are paginated using page and limit parameters.
+ Retrieves a paginated list of all employers belonging to the authenticated
+ organization. Results are sorted by creation date (newest first) and paginated
+ using page and limit parameters.
Args:
- active_in: Filter by active status
-
limit: Items per page (default: 20, max: 100)
- name: Filter by employer name (partial match)
-
page: Page number (default: 1)
extra_headers: Send extra headers
@@ -569,9 +408,7 @@ async def list(
timeout=timeout,
query=await async_maybe_transform(
{
- "active_in": active_in,
"limit": limit,
- "name": name,
"page": page,
},
employer_list_params.EmployerListParams,
@@ -584,11 +421,8 @@ async def create_eligibility_policy(
self,
employer_id: str,
*,
- effective_date: Union[str, date],
- name: str,
- rules: Iterable[employer_create_eligibility_policy_params.Rule],
- policy_to_replace_id: str | Omit = omit,
- description: Optional[str] | Omit = omit,
+ classification: str,
+ waiting_period: str,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -596,27 +430,16 @@ async def create_eligibility_policy(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> BenefitEligibilityPolicy:
- """Creates a new benefit eligibility policy for a specific employer.
-
- Eligibility
- policies define rules that determine which employees qualify for benefits based
- on criteria such as employment status (full-time, part-time), hours worked per
- week, waiting periods after hire date, or other custom requirements. Optionally
- provide 'policy_to_replace_id' as a query parameter to replace an existing
- policy.
+ """
+ Creates a benefit eligibility policy for the specified employer.
Args:
- employer_id: Filter by employer ID
-
- effective_date: Date when policy becomes effective
-
- name: Display name for the policy
-
- rules: List of eligibility rules (at least one required)
+ employer_id: Unique employer identifier (empr\\__\\**)
- policy_to_replace_id: ID of existing policy to replace (epol\\__\\**)
+ classification: Which employee classifications are eligible. One of: full_time, part_time, all
- description: Detailed description
+ waiting_period: Waiting period before eligibility. One of: first_of_following_month, 30_days,
+ 60_days, none
extra_headers: Send extra headers
@@ -632,22 +455,13 @@ async def create_eligibility_policy(
f"/v1/employers/{employer_id}/benefit-eligibility-policies",
body=await async_maybe_transform(
{
- "effective_date": effective_date,
- "name": name,
- "rules": rules,
- "description": description,
+ "classification": classification,
+ "waiting_period": waiting_period,
},
employer_create_eligibility_policy_params.EmployerCreateEligibilityPolicyParams,
),
options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {"policy_to_replace_id": policy_to_replace_id},
- employer_create_eligibility_policy_params.EmployerCreateEligibilityPolicyParams,
- ),
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
cast_to=BenefitEligibilityPolicy,
)
@@ -663,9 +477,6 @@ def __init__(self, employers: EmployersResource) -> None:
self.retrieve = to_raw_response_wrapper(
employers.retrieve,
)
- self.update = to_raw_response_wrapper(
- employers.update,
- )
self.list = to_raw_response_wrapper(
employers.list,
)
@@ -689,9 +500,6 @@ def __init__(self, employers: AsyncEmployersResource) -> None:
self.retrieve = async_to_raw_response_wrapper(
employers.retrieve,
)
- self.update = async_to_raw_response_wrapper(
- employers.update,
- )
self.list = async_to_raw_response_wrapper(
employers.list,
)
@@ -715,9 +523,6 @@ def __init__(self, employers: EmployersResource) -> None:
self.retrieve = to_streamed_response_wrapper(
employers.retrieve,
)
- self.update = to_streamed_response_wrapper(
- employers.update,
- )
self.list = to_streamed_response_wrapper(
employers.list,
)
@@ -741,9 +546,6 @@ def __init__(self, employers: AsyncEmployersResource) -> None:
self.retrieve = async_to_streamed_response_wrapper(
employers.retrieve,
)
- self.update = async_to_streamed_response_wrapper(
- employers.update,
- )
self.list = async_to_streamed_response_wrapper(
employers.list,
)
diff --git a/src/vitable_connect/resources/enrollments.py b/src/vitable_connect/resources/enrollments.py
index eda7c89..e3f4d04 100644
--- a/src/vitable_connect/resources/enrollments.py
+++ b/src/vitable_connect/resources/enrollments.py
@@ -2,13 +2,9 @@
from __future__ import annotations
-from typing import Optional
-
import httpx
-from ..types import enrollment_reissue_params
-from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
+from .._types import Body, Query, Headers, NotGiven, not_given
from .._compat import cached_property
from .._resource import SyncAPIResource, AsyncAPIResource
from .._response import (
@@ -19,7 +15,6 @@
)
from .._base_client import make_request_options
from ..types.enrollment_response import EnrollmentResponse
-from ..types.enrollment_list_plans_response import EnrollmentListPlansResponse
__all__ = ["EnrollmentsResource", "AsyncEnrollmentsResource"]
@@ -57,49 +52,8 @@ def retrieve(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> EnrollmentResponse:
- """Retrieves detailed information for a specific enrollment by ID.
-
- Returns selected
- plan, coverage dates, enrolled dependents, premium amounts, and status. This
- endpoint is critical for viewing comprehensive enrollment information.
-
- Args:
- enrollment_id: Unique enrollment identifier (enrl\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not enrollment_id:
- raise ValueError(f"Expected a non-empty value for `enrollment_id` but received {enrollment_id!r}")
- return self._get(
- f"/v1/enrollments/{enrollment_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EnrollmentResponse,
- )
-
- def list_plans(
- self,
- enrollment_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EnrollmentListPlansResponse:
"""
- Retrieves all benefit plans eligible for selection for a specific enrollment.
- Returns available plan options with coverage tiers, premium costs, deductibles,
- and carrier info. Use during enrollment process to show employees their plan
- choices.
+ Retrieves detailed information for a specific enrollment by ID.
Args:
enrollment_id: Unique enrollment identifier (enrl\\__\\**)
@@ -115,58 +69,7 @@ def list_plans(
if not enrollment_id:
raise ValueError(f"Expected a non-empty value for `enrollment_id` but received {enrollment_id!r}")
return self._get(
- f"/v1/enrollments/{enrollment_id}/plans",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EnrollmentListPlansResponse,
- )
-
- def reissue(
- self,
- enrollment_id: str,
- *,
- qle_id: str,
- reason: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EnrollmentResponse:
- """
- Reissues an enrollment due to a qualifying life event, allowing mid-year benefit
- changes. Enables employees to modify benefit selections outside open enrollment
- after a significant life event. Common scenarios: adding newborn child, covering
- new spouse, adjusting coverage after losing other coverage.
-
- Args:
- enrollment_id: Unique enrollment identifier (enrl\\__\\**)
-
- qle_id: ID of the qualifying life event (qle\\__\\**)
-
- reason: Optional reason for reissue
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not enrollment_id:
- raise ValueError(f"Expected a non-empty value for `enrollment_id` but received {enrollment_id!r}")
- return self._post(
- f"/v1/enrollments/{enrollment_id}/reissue",
- body=maybe_transform(
- {
- "qle_id": qle_id,
- "reason": reason,
- },
- enrollment_reissue_params.EnrollmentReissueParams,
- ),
+ f"/v1/enrollments/{enrollment_id}",
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -207,49 +110,8 @@ async def retrieve(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> EnrollmentResponse:
- """Retrieves detailed information for a specific enrollment by ID.
-
- Returns selected
- plan, coverage dates, enrolled dependents, premium amounts, and status. This
- endpoint is critical for viewing comprehensive enrollment information.
-
- Args:
- enrollment_id: Unique enrollment identifier (enrl\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
"""
- if not enrollment_id:
- raise ValueError(f"Expected a non-empty value for `enrollment_id` but received {enrollment_id!r}")
- return await self._get(
- f"/v1/enrollments/{enrollment_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EnrollmentResponse,
- )
-
- async def list_plans(
- self,
- enrollment_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EnrollmentListPlansResponse:
- """
- Retrieves all benefit plans eligible for selection for a specific enrollment.
- Returns available plan options with coverage tiers, premium costs, deductibles,
- and carrier info. Use during enrollment process to show employees their plan
- choices.
+ Retrieves detailed information for a specific enrollment by ID.
Args:
enrollment_id: Unique enrollment identifier (enrl\\__\\**)
@@ -265,58 +127,7 @@ async def list_plans(
if not enrollment_id:
raise ValueError(f"Expected a non-empty value for `enrollment_id` but received {enrollment_id!r}")
return await self._get(
- f"/v1/enrollments/{enrollment_id}/plans",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EnrollmentListPlansResponse,
- )
-
- async def reissue(
- self,
- enrollment_id: str,
- *,
- qle_id: str,
- reason: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EnrollmentResponse:
- """
- Reissues an enrollment due to a qualifying life event, allowing mid-year benefit
- changes. Enables employees to modify benefit selections outside open enrollment
- after a significant life event. Common scenarios: adding newborn child, covering
- new spouse, adjusting coverage after losing other coverage.
-
- Args:
- enrollment_id: Unique enrollment identifier (enrl\\__\\**)
-
- qle_id: ID of the qualifying life event (qle\\__\\**)
-
- reason: Optional reason for reissue
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not enrollment_id:
- raise ValueError(f"Expected a non-empty value for `enrollment_id` but received {enrollment_id!r}")
- return await self._post(
- f"/v1/enrollments/{enrollment_id}/reissue",
- body=await async_maybe_transform(
- {
- "qle_id": qle_id,
- "reason": reason,
- },
- enrollment_reissue_params.EnrollmentReissueParams,
- ),
+ f"/v1/enrollments/{enrollment_id}",
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -331,12 +142,6 @@ def __init__(self, enrollments: EnrollmentsResource) -> None:
self.retrieve = to_raw_response_wrapper(
enrollments.retrieve,
)
- self.list_plans = to_raw_response_wrapper(
- enrollments.list_plans,
- )
- self.reissue = to_raw_response_wrapper(
- enrollments.reissue,
- )
class AsyncEnrollmentsResourceWithRawResponse:
@@ -346,12 +151,6 @@ def __init__(self, enrollments: AsyncEnrollmentsResource) -> None:
self.retrieve = async_to_raw_response_wrapper(
enrollments.retrieve,
)
- self.list_plans = async_to_raw_response_wrapper(
- enrollments.list_plans,
- )
- self.reissue = async_to_raw_response_wrapper(
- enrollments.reissue,
- )
class EnrollmentsResourceWithStreamingResponse:
@@ -361,12 +160,6 @@ def __init__(self, enrollments: EnrollmentsResource) -> None:
self.retrieve = to_streamed_response_wrapper(
enrollments.retrieve,
)
- self.list_plans = to_streamed_response_wrapper(
- enrollments.list_plans,
- )
- self.reissue = to_streamed_response_wrapper(
- enrollments.reissue,
- )
class AsyncEnrollmentsResourceWithStreamingResponse:
@@ -376,9 +169,3 @@ def __init__(self, enrollments: AsyncEnrollmentsResource) -> None:
self.retrieve = async_to_streamed_response_wrapper(
enrollments.retrieve,
)
- self.list_plans = async_to_streamed_response_wrapper(
- enrollments.list_plans,
- )
- self.reissue = async_to_streamed_response_wrapper(
- enrollments.reissue,
- )
diff --git a/src/vitable_connect/resources/members/__init__.py b/src/vitable_connect/resources/members/__init__.py
deleted file mode 100644
index b1bd994..0000000
--- a/src/vitable_connect/resources/members/__init__.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .members import (
- MembersResource,
- AsyncMembersResource,
- MembersResourceWithRawResponse,
- AsyncMembersResourceWithRawResponse,
- MembersResourceWithStreamingResponse,
- AsyncMembersResourceWithStreamingResponse,
-)
-from .dependents import (
- DependentsResource,
- AsyncDependentsResource,
- DependentsResourceWithRawResponse,
- AsyncDependentsResourceWithRawResponse,
- DependentsResourceWithStreamingResponse,
- AsyncDependentsResourceWithStreamingResponse,
-)
-from .qualifying_life_events import (
- QualifyingLifeEventsResource,
- AsyncQualifyingLifeEventsResource,
- QualifyingLifeEventsResourceWithRawResponse,
- AsyncQualifyingLifeEventsResourceWithRawResponse,
- QualifyingLifeEventsResourceWithStreamingResponse,
- AsyncQualifyingLifeEventsResourceWithStreamingResponse,
-)
-
-__all__ = [
- "DependentsResource",
- "AsyncDependentsResource",
- "DependentsResourceWithRawResponse",
- "AsyncDependentsResourceWithRawResponse",
- "DependentsResourceWithStreamingResponse",
- "AsyncDependentsResourceWithStreamingResponse",
- "QualifyingLifeEventsResource",
- "AsyncQualifyingLifeEventsResource",
- "QualifyingLifeEventsResourceWithRawResponse",
- "AsyncQualifyingLifeEventsResourceWithRawResponse",
- "QualifyingLifeEventsResourceWithStreamingResponse",
- "AsyncQualifyingLifeEventsResourceWithStreamingResponse",
- "MembersResource",
- "AsyncMembersResource",
- "MembersResourceWithRawResponse",
- "AsyncMembersResourceWithRawResponse",
- "MembersResourceWithStreamingResponse",
- "AsyncMembersResourceWithStreamingResponse",
-]
diff --git a/src/vitable_connect/resources/members/dependents.py b/src/vitable_connect/resources/members/dependents.py
deleted file mode 100644
index 7272750..0000000
--- a/src/vitable_connect/resources/members/dependents.py
+++ /dev/null
@@ -1,404 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union, Optional
-from datetime import date
-
-import httpx
-
-from ...types import Sex, Relationship
-from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ..._utils import maybe_transform, async_maybe_transform
-from ..._compat import cached_property
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from ...types.sex import Sex
-from ..._base_client import make_request_options
-from ...types.members import dependent_list_params, dependent_create_params
-from ...types.relationship import Relationship
-from ...types.dependent_response import DependentResponse
-from ...types.members.dependent_list_response import DependentListResponse
-
-__all__ = ["DependentsResource", "AsyncDependentsResource"]
-
-
-class DependentsResource(SyncAPIResource):
- """Manage dependent records (spouses, children) for employees"""
-
- @cached_property
- def with_raw_response(self) -> DependentsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return DependentsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> DependentsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return DependentsResourceWithStreamingResponse(self)
-
- def create(
- self,
- member_id: str,
- *,
- date_of_birth: Union[str, date],
- first_name: str,
- last_name: str,
- relationship: Relationship,
- sex: Sex,
- gender: Optional[str] | Omit = omit,
- ssn: Optional[str] | Omit = omit,
- suffix: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> DependentResponse:
- """Creates a new dependent record for a member.
-
- Required: first name, last name,
- date of birth, sex, and relationship type. SSN is optional but recommended for
- coverage verification.
-
- Args:
- member_id: Unique member identifier (mbr\\__\\**)
-
- date_of_birth: Date of birth (YYYY-MM-DD)
-
- first_name: Dependent's legal first name
-
- last_name: Dependent's legal last name
-
- relationship: - `Spouse` - Spouse
- - `Child` - Child
-
- sex: - `Male` - Male
- - `Female` - Female
- - `Other` - Other
- - `Unknown` - Unknown
-
- gender: Gender identity
-
- ssn: Social Security Number (optional, XXX-XX-XXXX or XXXXXXXXX)
-
- suffix: Name suffix (Jr., Sr., III)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not member_id:
- raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
- return self._post(
- f"/v1/members/{member_id}/dependents",
- body=maybe_transform(
- {
- "date_of_birth": date_of_birth,
- "first_name": first_name,
- "last_name": last_name,
- "relationship": relationship,
- "sex": sex,
- "gender": gender,
- "ssn": ssn,
- "suffix": suffix,
- },
- dependent_create_params.DependentCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=DependentResponse,
- )
-
- def list(
- self,
- member_id: str,
- *,
- active_in: bool | Omit = omit,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- relationship: Relationship | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> DependentListResponse:
- """Retrieves a paginated list of dependents for a specific member.
-
- Dependents
- include spouses, children, and domestic partners who may be eligible for benefit
- coverage.
-
- Args:
- member_id: Unique member identifier (mbr\\__\\**)
-
- active_in: Filter by active status
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- relationship: Filter by relationship type
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not member_id:
- raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
- return self._get(
- f"/v1/members/{member_id}/dependents",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "active_in": active_in,
- "limit": limit,
- "page": page,
- "relationship": relationship,
- },
- dependent_list_params.DependentListParams,
- ),
- ),
- cast_to=DependentListResponse,
- )
-
-
-class AsyncDependentsResource(AsyncAPIResource):
- """Manage dependent records (spouses, children) for employees"""
-
- @cached_property
- def with_raw_response(self) -> AsyncDependentsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return AsyncDependentsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncDependentsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return AsyncDependentsResourceWithStreamingResponse(self)
-
- async def create(
- self,
- member_id: str,
- *,
- date_of_birth: Union[str, date],
- first_name: str,
- last_name: str,
- relationship: Relationship,
- sex: Sex,
- gender: Optional[str] | Omit = omit,
- ssn: Optional[str] | Omit = omit,
- suffix: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> DependentResponse:
- """Creates a new dependent record for a member.
-
- Required: first name, last name,
- date of birth, sex, and relationship type. SSN is optional but recommended for
- coverage verification.
-
- Args:
- member_id: Unique member identifier (mbr\\__\\**)
-
- date_of_birth: Date of birth (YYYY-MM-DD)
-
- first_name: Dependent's legal first name
-
- last_name: Dependent's legal last name
-
- relationship: - `Spouse` - Spouse
- - `Child` - Child
-
- sex: - `Male` - Male
- - `Female` - Female
- - `Other` - Other
- - `Unknown` - Unknown
-
- gender: Gender identity
-
- ssn: Social Security Number (optional, XXX-XX-XXXX or XXXXXXXXX)
-
- suffix: Name suffix (Jr., Sr., III)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not member_id:
- raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
- return await self._post(
- f"/v1/members/{member_id}/dependents",
- body=await async_maybe_transform(
- {
- "date_of_birth": date_of_birth,
- "first_name": first_name,
- "last_name": last_name,
- "relationship": relationship,
- "sex": sex,
- "gender": gender,
- "ssn": ssn,
- "suffix": suffix,
- },
- dependent_create_params.DependentCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=DependentResponse,
- )
-
- async def list(
- self,
- member_id: str,
- *,
- active_in: bool | Omit = omit,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- relationship: Relationship | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> DependentListResponse:
- """Retrieves a paginated list of dependents for a specific member.
-
- Dependents
- include spouses, children, and domestic partners who may be eligible for benefit
- coverage.
-
- Args:
- member_id: Unique member identifier (mbr\\__\\**)
-
- active_in: Filter by active status
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- relationship: Filter by relationship type
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not member_id:
- raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
- return await self._get(
- f"/v1/members/{member_id}/dependents",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "active_in": active_in,
- "limit": limit,
- "page": page,
- "relationship": relationship,
- },
- dependent_list_params.DependentListParams,
- ),
- ),
- cast_to=DependentListResponse,
- )
-
-
-class DependentsResourceWithRawResponse:
- def __init__(self, dependents: DependentsResource) -> None:
- self._dependents = dependents
-
- self.create = to_raw_response_wrapper(
- dependents.create,
- )
- self.list = to_raw_response_wrapper(
- dependents.list,
- )
-
-
-class AsyncDependentsResourceWithRawResponse:
- def __init__(self, dependents: AsyncDependentsResource) -> None:
- self._dependents = dependents
-
- self.create = async_to_raw_response_wrapper(
- dependents.create,
- )
- self.list = async_to_raw_response_wrapper(
- dependents.list,
- )
-
-
-class DependentsResourceWithStreamingResponse:
- def __init__(self, dependents: DependentsResource) -> None:
- self._dependents = dependents
-
- self.create = to_streamed_response_wrapper(
- dependents.create,
- )
- self.list = to_streamed_response_wrapper(
- dependents.list,
- )
-
-
-class AsyncDependentsResourceWithStreamingResponse:
- def __init__(self, dependents: AsyncDependentsResource) -> None:
- self._dependents = dependents
-
- self.create = async_to_streamed_response_wrapper(
- dependents.create,
- )
- self.list = async_to_streamed_response_wrapper(
- dependents.list,
- )
diff --git a/src/vitable_connect/resources/members/members.py b/src/vitable_connect/resources/members/members.py
deleted file mode 100644
index f6ff220..0000000
--- a/src/vitable_connect/resources/members/members.py
+++ /dev/null
@@ -1,146 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from ..._compat import cached_property
-from .dependents import (
- DependentsResource,
- AsyncDependentsResource,
- DependentsResourceWithRawResponse,
- AsyncDependentsResourceWithRawResponse,
- DependentsResourceWithStreamingResponse,
- AsyncDependentsResourceWithStreamingResponse,
-)
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from .qualifying_life_events import (
- QualifyingLifeEventsResource,
- AsyncQualifyingLifeEventsResource,
- QualifyingLifeEventsResourceWithRawResponse,
- AsyncQualifyingLifeEventsResourceWithRawResponse,
- QualifyingLifeEventsResourceWithStreamingResponse,
- AsyncQualifyingLifeEventsResourceWithStreamingResponse,
-)
-
-__all__ = ["MembersResource", "AsyncMembersResource"]
-
-
-class MembersResource(SyncAPIResource):
- @cached_property
- def dependents(self) -> DependentsResource:
- """Manage dependent records (spouses, children) for employees"""
- return DependentsResource(self._client)
-
- @cached_property
- def qualifying_life_events(self) -> QualifyingLifeEventsResource:
- """Record life events that trigger special enrollment periods"""
- return QualifyingLifeEventsResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> MembersResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return MembersResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> MembersResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return MembersResourceWithStreamingResponse(self)
-
-
-class AsyncMembersResource(AsyncAPIResource):
- @cached_property
- def dependents(self) -> AsyncDependentsResource:
- """Manage dependent records (spouses, children) for employees"""
- return AsyncDependentsResource(self._client)
-
- @cached_property
- def qualifying_life_events(self) -> AsyncQualifyingLifeEventsResource:
- """Record life events that trigger special enrollment periods"""
- return AsyncQualifyingLifeEventsResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> AsyncMembersResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return AsyncMembersResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncMembersResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return AsyncMembersResourceWithStreamingResponse(self)
-
-
-class MembersResourceWithRawResponse:
- def __init__(self, members: MembersResource) -> None:
- self._members = members
-
- @cached_property
- def dependents(self) -> DependentsResourceWithRawResponse:
- """Manage dependent records (spouses, children) for employees"""
- return DependentsResourceWithRawResponse(self._members.dependents)
-
- @cached_property
- def qualifying_life_events(self) -> QualifyingLifeEventsResourceWithRawResponse:
- """Record life events that trigger special enrollment periods"""
- return QualifyingLifeEventsResourceWithRawResponse(self._members.qualifying_life_events)
-
-
-class AsyncMembersResourceWithRawResponse:
- def __init__(self, members: AsyncMembersResource) -> None:
- self._members = members
-
- @cached_property
- def dependents(self) -> AsyncDependentsResourceWithRawResponse:
- """Manage dependent records (spouses, children) for employees"""
- return AsyncDependentsResourceWithRawResponse(self._members.dependents)
-
- @cached_property
- def qualifying_life_events(self) -> AsyncQualifyingLifeEventsResourceWithRawResponse:
- """Record life events that trigger special enrollment periods"""
- return AsyncQualifyingLifeEventsResourceWithRawResponse(self._members.qualifying_life_events)
-
-
-class MembersResourceWithStreamingResponse:
- def __init__(self, members: MembersResource) -> None:
- self._members = members
-
- @cached_property
- def dependents(self) -> DependentsResourceWithStreamingResponse:
- """Manage dependent records (spouses, children) for employees"""
- return DependentsResourceWithStreamingResponse(self._members.dependents)
-
- @cached_property
- def qualifying_life_events(self) -> QualifyingLifeEventsResourceWithStreamingResponse:
- """Record life events that trigger special enrollment periods"""
- return QualifyingLifeEventsResourceWithStreamingResponse(self._members.qualifying_life_events)
-
-
-class AsyncMembersResourceWithStreamingResponse:
- def __init__(self, members: AsyncMembersResource) -> None:
- self._members = members
-
- @cached_property
- def dependents(self) -> AsyncDependentsResourceWithStreamingResponse:
- """Manage dependent records (spouses, children) for employees"""
- return AsyncDependentsResourceWithStreamingResponse(self._members.dependents)
-
- @cached_property
- def qualifying_life_events(self) -> AsyncQualifyingLifeEventsResourceWithStreamingResponse:
- """Record life events that trigger special enrollment periods"""
- return AsyncQualifyingLifeEventsResourceWithStreamingResponse(self._members.qualifying_life_events)
diff --git a/src/vitable_connect/resources/members/qualifying_life_events.py b/src/vitable_connect/resources/members/qualifying_life_events.py
deleted file mode 100644
index 30cd4bc..0000000
--- a/src/vitable_connect/resources/members/qualifying_life_events.py
+++ /dev/null
@@ -1,476 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union, Optional
-from datetime import date
-
-import httpx
-
-from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ..._utils import maybe_transform, async_maybe_transform
-from ..._compat import cached_property
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from ..._base_client import make_request_options
-from ...types.members import (
- EventType,
- QualifyingLifeEventStatus,
- qualifying_life_event_list_params,
- qualifying_life_event_record_params,
-)
-from ...types.members.event_type import EventType
-from ...types.members.qualifying_life_event_status import QualifyingLifeEventStatus
-from ...types.members.qualifying_life_event_response import QualifyingLifeEventResponse
-from ...types.members.qualifying_life_event_list_response import QualifyingLifeEventListResponse
-
-__all__ = ["QualifyingLifeEventsResource", "AsyncQualifyingLifeEventsResource"]
-
-
-class QualifyingLifeEventsResource(SyncAPIResource):
- """Record life events that trigger special enrollment periods"""
-
- @cached_property
- def with_raw_response(self) -> QualifyingLifeEventsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return QualifyingLifeEventsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> QualifyingLifeEventsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return QualifyingLifeEventsResourceWithStreamingResponse(self)
-
- def retrieve(
- self,
- qle_id: str,
- *,
- member_id: str,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> QualifyingLifeEventResponse:
- """Retrieves detailed information for a specific QLE by ID.
-
- Returns event type,
- date, status, and enrollment window information.
-
- Args:
- member_id: Unique member identifier (mbr\\__\\**)
-
- qle_id: Unique qualifying life event identifier (qle\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not member_id:
- raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
- if not qle_id:
- raise ValueError(f"Expected a non-empty value for `qle_id` but received {qle_id!r}")
- return self._get(
- f"/v1/members/{member_id}/qualifying-life-events/{qle_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=QualifyingLifeEventResponse,
- )
-
- def list(
- self,
- member_id: str,
- *,
- event_type: EventType | Omit = omit,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- status: QualifyingLifeEventStatus | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> QualifyingLifeEventListResponse:
- """Retrieves a paginated list of qualifying life events for a member.
-
- QLEs are
- significant life changes (marriage, birth, adoption, loss of coverage) that
- allow benefit enrollment changes outside open enrollment.
-
- Args:
- member_id: Unique member identifier (mbr\\__\\**)
-
- event_type: Filter by QLE type
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- status: Filter by QLE status
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not member_id:
- raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
- return self._get(
- f"/v1/members/{member_id}/qualifying-life-events",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "event_type": event_type,
- "limit": limit,
- "page": page,
- "status": status,
- },
- qualifying_life_event_list_params.QualifyingLifeEventListParams,
- ),
- ),
- cast_to=QualifyingLifeEventListResponse,
- )
-
- def record(
- self,
- member_id: str,
- *,
- event_date: Union[str, date],
- event_type: EventType,
- notes: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> QualifyingLifeEventResponse:
- """Records a qualifying life event occurrence for a member.
-
- Opens a special
- enrollment period allowing benefit changes outside open enrollment. Employees
- typically have 30-60 days from the event date to complete enrollment changes.
-
- Args:
- member_id: Unique member identifier (mbr\\__\\**)
-
- event_date: Date when the event occurred
-
- event_type: - `Marriage` - Marriage
- - `Birth` - Birth
- - `Adoption` - Adoption
- - `Divorce` - Divorce
- - `Death` - Death
- - `Job Loss` - Job Loss
- - `Reduction In Hours` - Reduction In Hours
- - `Employer Bankruptcy` - Employer Bankruptcy
- - `Medicare Entitlement` - Medicare Entitlement
- - `Termination` - Termination
- - `Other` - Other
-
- notes: Optional notes about the event
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not member_id:
- raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
- return self._post(
- f"/v1/members/{member_id}/qualifying-life-events",
- body=maybe_transform(
- {
- "event_date": event_date,
- "event_type": event_type,
- "notes": notes,
- },
- qualifying_life_event_record_params.QualifyingLifeEventRecordParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=QualifyingLifeEventResponse,
- )
-
-
-class AsyncQualifyingLifeEventsResource(AsyncAPIResource):
- """Record life events that trigger special enrollment periods"""
-
- @cached_property
- def with_raw_response(self) -> AsyncQualifyingLifeEventsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return AsyncQualifyingLifeEventsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncQualifyingLifeEventsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return AsyncQualifyingLifeEventsResourceWithStreamingResponse(self)
-
- async def retrieve(
- self,
- qle_id: str,
- *,
- member_id: str,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> QualifyingLifeEventResponse:
- """Retrieves detailed information for a specific QLE by ID.
-
- Returns event type,
- date, status, and enrollment window information.
-
- Args:
- member_id: Unique member identifier (mbr\\__\\**)
-
- qle_id: Unique qualifying life event identifier (qle\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not member_id:
- raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
- if not qle_id:
- raise ValueError(f"Expected a non-empty value for `qle_id` but received {qle_id!r}")
- return await self._get(
- f"/v1/members/{member_id}/qualifying-life-events/{qle_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=QualifyingLifeEventResponse,
- )
-
- async def list(
- self,
- member_id: str,
- *,
- event_type: EventType | Omit = omit,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- status: QualifyingLifeEventStatus | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> QualifyingLifeEventListResponse:
- """Retrieves a paginated list of qualifying life events for a member.
-
- QLEs are
- significant life changes (marriage, birth, adoption, loss of coverage) that
- allow benefit enrollment changes outside open enrollment.
-
- Args:
- member_id: Unique member identifier (mbr\\__\\**)
-
- event_type: Filter by QLE type
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- status: Filter by QLE status
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not member_id:
- raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
- return await self._get(
- f"/v1/members/{member_id}/qualifying-life-events",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "event_type": event_type,
- "limit": limit,
- "page": page,
- "status": status,
- },
- qualifying_life_event_list_params.QualifyingLifeEventListParams,
- ),
- ),
- cast_to=QualifyingLifeEventListResponse,
- )
-
- async def record(
- self,
- member_id: str,
- *,
- event_date: Union[str, date],
- event_type: EventType,
- notes: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> QualifyingLifeEventResponse:
- """Records a qualifying life event occurrence for a member.
-
- Opens a special
- enrollment period allowing benefit changes outside open enrollment. Employees
- typically have 30-60 days from the event date to complete enrollment changes.
-
- Args:
- member_id: Unique member identifier (mbr\\__\\**)
-
- event_date: Date when the event occurred
-
- event_type: - `Marriage` - Marriage
- - `Birth` - Birth
- - `Adoption` - Adoption
- - `Divorce` - Divorce
- - `Death` - Death
- - `Job Loss` - Job Loss
- - `Reduction In Hours` - Reduction In Hours
- - `Employer Bankruptcy` - Employer Bankruptcy
- - `Medicare Entitlement` - Medicare Entitlement
- - `Termination` - Termination
- - `Other` - Other
-
- notes: Optional notes about the event
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not member_id:
- raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
- return await self._post(
- f"/v1/members/{member_id}/qualifying-life-events",
- body=await async_maybe_transform(
- {
- "event_date": event_date,
- "event_type": event_type,
- "notes": notes,
- },
- qualifying_life_event_record_params.QualifyingLifeEventRecordParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=QualifyingLifeEventResponse,
- )
-
-
-class QualifyingLifeEventsResourceWithRawResponse:
- def __init__(self, qualifying_life_events: QualifyingLifeEventsResource) -> None:
- self._qualifying_life_events = qualifying_life_events
-
- self.retrieve = to_raw_response_wrapper(
- qualifying_life_events.retrieve,
- )
- self.list = to_raw_response_wrapper(
- qualifying_life_events.list,
- )
- self.record = to_raw_response_wrapper(
- qualifying_life_events.record,
- )
-
-
-class AsyncQualifyingLifeEventsResourceWithRawResponse:
- def __init__(self, qualifying_life_events: AsyncQualifyingLifeEventsResource) -> None:
- self._qualifying_life_events = qualifying_life_events
-
- self.retrieve = async_to_raw_response_wrapper(
- qualifying_life_events.retrieve,
- )
- self.list = async_to_raw_response_wrapper(
- qualifying_life_events.list,
- )
- self.record = async_to_raw_response_wrapper(
- qualifying_life_events.record,
- )
-
-
-class QualifyingLifeEventsResourceWithStreamingResponse:
- def __init__(self, qualifying_life_events: QualifyingLifeEventsResource) -> None:
- self._qualifying_life_events = qualifying_life_events
-
- self.retrieve = to_streamed_response_wrapper(
- qualifying_life_events.retrieve,
- )
- self.list = to_streamed_response_wrapper(
- qualifying_life_events.list,
- )
- self.record = to_streamed_response_wrapper(
- qualifying_life_events.record,
- )
-
-
-class AsyncQualifyingLifeEventsResourceWithStreamingResponse:
- def __init__(self, qualifying_life_events: AsyncQualifyingLifeEventsResource) -> None:
- self._qualifying_life_events = qualifying_life_events
-
- self.retrieve = async_to_streamed_response_wrapper(
- qualifying_life_events.retrieve,
- )
- self.list = async_to_streamed_response_wrapper(
- qualifying_life_events.list,
- )
- self.record = async_to_streamed_response_wrapper(
- qualifying_life_events.record,
- )
diff --git a/src/vitable_connect/resources/plan_years.py b/src/vitable_connect/resources/plan_years.py
deleted file mode 100644
index e6e7b2a..0000000
--- a/src/vitable_connect/resources/plan_years.py
+++ /dev/null
@@ -1,312 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union, Iterable, Optional
-from datetime import date
-
-import httpx
-
-from ..types import plan_year_update_params
-from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.benefit_products.plan_year_response import PlanYearResponse
-
-__all__ = ["PlanYearsResource", "AsyncPlanYearsResource"]
-
-
-class PlanYearsResource(SyncAPIResource):
- """Configure annual benefit periods with coverage dates and contribution settings"""
-
- @cached_property
- def with_raw_response(self) -> PlanYearsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return PlanYearsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> PlanYearsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return PlanYearsResourceWithStreamingResponse(self)
-
- def retrieve(
- self,
- plan_year_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> PlanYearResponse:
- """Retrieves detailed configuration for a specific plan year by ID.
-
- Returns
- coverage dates, open enrollment period, available plans, and contribution
- structure.
-
- Args:
- plan_year_id: Unique plan year identifier (plyr\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not plan_year_id:
- raise ValueError(f"Expected a non-empty value for `plan_year_id` but received {plan_year_id!r}")
- return self._get(
- f"/v1/plan-years/{plan_year_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=PlanYearResponse,
- )
-
- def update(
- self,
- plan_year_id: str,
- *,
- contribution_classes: Optional[Iterable[plan_year_update_params.ContributionClass]] | Omit = omit,
- open_enrollment_end: Union[str, date, None] | Omit = omit,
- open_enrollment_start: Union[str, date, None] | Omit = omit,
- status: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> PlanYearResponse:
- """Updates an existing plan year's configuration.
-
- Important: Plan years can only be
- edited until open enrollment starts. All fields are optional. Monetary values
- must be in cents.
-
- Args:
- plan_year_id: Unique plan year identifier (plyr\\__\\**)
-
- contribution_classes: Updated contribution classes
-
- open_enrollment_end: Open enrollment end date
-
- open_enrollment_start: Open enrollment start date
-
- status: Plan year status
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not plan_year_id:
- raise ValueError(f"Expected a non-empty value for `plan_year_id` but received {plan_year_id!r}")
- return self._put(
- f"/v1/plan-years/{plan_year_id}",
- body=maybe_transform(
- {
- "contribution_classes": contribution_classes,
- "open_enrollment_end": open_enrollment_end,
- "open_enrollment_start": open_enrollment_start,
- "status": status,
- },
- plan_year_update_params.PlanYearUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=PlanYearResponse,
- )
-
-
-class AsyncPlanYearsResource(AsyncAPIResource):
- """Configure annual benefit periods with coverage dates and contribution settings"""
-
- @cached_property
- def with_raw_response(self) -> AsyncPlanYearsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return AsyncPlanYearsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncPlanYearsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return AsyncPlanYearsResourceWithStreamingResponse(self)
-
- async def retrieve(
- self,
- plan_year_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> PlanYearResponse:
- """Retrieves detailed configuration for a specific plan year by ID.
-
- Returns
- coverage dates, open enrollment period, available plans, and contribution
- structure.
-
- Args:
- plan_year_id: Unique plan year identifier (plyr\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not plan_year_id:
- raise ValueError(f"Expected a non-empty value for `plan_year_id` but received {plan_year_id!r}")
- return await self._get(
- f"/v1/plan-years/{plan_year_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=PlanYearResponse,
- )
-
- async def update(
- self,
- plan_year_id: str,
- *,
- contribution_classes: Optional[Iterable[plan_year_update_params.ContributionClass]] | Omit = omit,
- open_enrollment_end: Union[str, date, None] | Omit = omit,
- open_enrollment_start: Union[str, date, None] | Omit = omit,
- status: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> PlanYearResponse:
- """Updates an existing plan year's configuration.
-
- Important: Plan years can only be
- edited until open enrollment starts. All fields are optional. Monetary values
- must be in cents.
-
- Args:
- plan_year_id: Unique plan year identifier (plyr\\__\\**)
-
- contribution_classes: Updated contribution classes
-
- open_enrollment_end: Open enrollment end date
-
- open_enrollment_start: Open enrollment start date
-
- status: Plan year status
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not plan_year_id:
- raise ValueError(f"Expected a non-empty value for `plan_year_id` but received {plan_year_id!r}")
- return await self._put(
- f"/v1/plan-years/{plan_year_id}",
- body=await async_maybe_transform(
- {
- "contribution_classes": contribution_classes,
- "open_enrollment_end": open_enrollment_end,
- "open_enrollment_start": open_enrollment_start,
- "status": status,
- },
- plan_year_update_params.PlanYearUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=PlanYearResponse,
- )
-
-
-class PlanYearsResourceWithRawResponse:
- def __init__(self, plan_years: PlanYearsResource) -> None:
- self._plan_years = plan_years
-
- self.retrieve = to_raw_response_wrapper(
- plan_years.retrieve,
- )
- self.update = to_raw_response_wrapper(
- plan_years.update,
- )
-
-
-class AsyncPlanYearsResourceWithRawResponse:
- def __init__(self, plan_years: AsyncPlanYearsResource) -> None:
- self._plan_years = plan_years
-
- self.retrieve = async_to_raw_response_wrapper(
- plan_years.retrieve,
- )
- self.update = async_to_raw_response_wrapper(
- plan_years.update,
- )
-
-
-class PlanYearsResourceWithStreamingResponse:
- def __init__(self, plan_years: PlanYearsResource) -> None:
- self._plan_years = plan_years
-
- self.retrieve = to_streamed_response_wrapper(
- plan_years.retrieve,
- )
- self.update = to_streamed_response_wrapper(
- plan_years.update,
- )
-
-
-class AsyncPlanYearsResourceWithStreamingResponse:
- def __init__(self, plan_years: AsyncPlanYearsResource) -> None:
- self._plan_years = plan_years
-
- self.retrieve = async_to_streamed_response_wrapper(
- plan_years.retrieve,
- )
- self.update = async_to_streamed_response_wrapper(
- plan_years.update,
- )
diff --git a/src/vitable_connect/types/__init__.py b/src/vitable_connect/types/__init__.py
index 1af0589..8bf0c68 100644
--- a/src/vitable_connect/types/__init__.py
+++ b/src/vitable_connect/types/__init__.py
@@ -2,37 +2,23 @@
from __future__ import annotations
-from .sex import Sex as Sex
from .type import Type as Type
from .category import Category as Category
from .employee import Employee as Employee
from .employer import Employer as Employer
-from .dependent import Dependent as Dependent
-from .plan_tier import PlanTier as PlanTier
from .enrollment import Enrollment as Enrollment
from .pagination import Pagination as Pagination
from .product_code import ProductCode as ProductCode
-from .relationship import Relationship as Relationship
-from .coverage_tier import CoverageTier as CoverageTier
from .employee_class import EmployeeClass as EmployeeClass
from .employee_response import EmployeeResponse as EmployeeResponse
from .employer_response import EmployerResponse as EmployerResponse
from .enrollment_status import EnrollmentStatus as EnrollmentStatus
-from .dependent_response import DependentResponse as DependentResponse
from .enrollment_response import EnrollmentResponse as EnrollmentResponse
from .employer_list_params import EmployerListParams as EmployerListParams
-from .employee_update_params import EmployeeUpdateParams as EmployeeUpdateParams
from .employer_create_params import EmployerCreateParams as EmployerCreateParams
from .employer_list_response import EmployerListResponse as EmployerListResponse
-from .employer_update_params import EmployerUpdateParams as EmployerUpdateParams
-from .dependent_update_params import DependentUpdateParams as DependentUpdateParams
-from .plan_year_update_params import PlanYearUpdateParams as PlanYearUpdateParams
-from .enrollment_reissue_params import EnrollmentReissueParams as EnrollmentReissueParams
from .benefit_eligibility_policy import BenefitEligibilityPolicy as BenefitEligibilityPolicy
-from .benefit_product_list_params import BenefitProductListParams as BenefitProductListParams
-from .benefit_product_list_response import BenefitProductListResponse as BenefitProductListResponse
from .auth_issue_access_token_params import AuthIssueAccessTokenParams as AuthIssueAccessTokenParams
-from .enrollment_list_plans_response import EnrollmentListPlansResponse as EnrollmentListPlansResponse
from .auth_issue_access_token_response import AuthIssueAccessTokenResponse as AuthIssueAccessTokenResponse
from .employer_create_eligibility_policy_params import (
EmployerCreateEligibilityPolicyParams as EmployerCreateEligibilityPolicyParams,
diff --git a/src/vitable_connect/types/benefit_eligibility_policy.py b/src/vitable_connect/types/benefit_eligibility_policy.py
index 262ba00..d113c91 100644
--- a/src/vitable_connect/types/benefit_eligibility_policy.py
+++ b/src/vitable_connect/types/benefit_eligibility_policy.py
@@ -1,72 +1,29 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List, Optional
-from datetime import date, datetime
+from datetime import datetime
from .._models import BaseModel
-__all__ = ["BenefitEligibilityPolicy", "Data", "DataRule"]
-
-
-class DataRule(BaseModel):
- """Individual eligibility rule within a policy."""
-
- operator: str
- """Comparison operator (e.g., 'equals', 'greater_than', 'in')"""
-
- rule_type: str
- """
- Type of eligibility rule (e.g., 'employment_status', 'hours_per_week',
- 'waiting_period')
- """
-
- value: object
- """Value to compare against (type depends on rule_type)"""
+__all__ = ["BenefitEligibilityPolicy", "Data"]
class Data(BaseModel):
- """Serializer for Benefit Eligibility Policy entity.
-
- Eligibility policies define rules that determine which employees qualify for benefits.
- """
-
id: str
- """Unique eligibility policy identifier with 'epol\\__' prefix"""
- active_in: bool
- """Whether this policy is currently active"""
+ active: bool
- created_at: datetime
- """Timestamp when the policy was created"""
+ classification: str
- effective_date: date
- """Date when this policy becomes effective"""
+ created_at: datetime
employer_id: str
- """ID of the employer this policy belongs to (empr\\__\\**)"""
-
- name: str
- """Display name for the eligibility policy"""
-
- rules: List[DataRule]
- """List of eligibility rules that must be satisfied"""
updated_at: datetime
- """Timestamp when the policy was last updated"""
-
- description: Optional[str] = None
- """Detailed description of the policy"""
- replaced_policy_id: Optional[str] = None
- """ID of the policy this one replaces, if any (epol\\__\\**)"""
+ waiting_period: str
class BenefitEligibilityPolicy(BaseModel):
"""Response containing a single benefit eligibility policy resource."""
data: Data
- """Serializer for Benefit Eligibility Policy entity.
-
- Eligibility policies define rules that determine which employees qualify for
- benefits.
- """
diff --git a/src/vitable_connect/types/benefit_product_list_params.py b/src/vitable_connect/types/benefit_product_list_params.py
deleted file mode 100644
index 21f229b..0000000
--- a/src/vitable_connect/types/benefit_product_list_params.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-from .category import Category
-from .product_code import ProductCode
-
-__all__ = ["BenefitProductListParams"]
-
-
-class BenefitProductListParams(TypedDict, total=False):
- active_in: bool
- """Filter by active status"""
-
- category: Category
- """Filter by product category"""
-
- limit: int
- """Items per page (default: 20, max: 100)"""
-
- page: int
- """Page number (default: 1)"""
-
- product_code: ProductCode
- """Filter by product code"""
diff --git a/src/vitable_connect/types/benefit_product_list_response.py b/src/vitable_connect/types/benefit_product_list_response.py
deleted file mode 100644
index fe86979..0000000
--- a/src/vitable_connect/types/benefit_product_list_response.py
+++ /dev/null
@@ -1,76 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-from datetime import datetime
-
-from .._models import BaseModel
-from .category import Category
-from .pagination import Pagination
-from .product_code import ProductCode
-
-__all__ = ["BenefitProductListResponse", "Data"]
-
-
-class Data(BaseModel):
- """Serializer for Benefit Product entity in public API responses.
-
- Benefit Products represent types of benefits (dental, vision, medical, etc.)
- that an Organization can offer to their Employers.
- """
-
- id: str
- """Unique benefit product identifier with 'bprd\\__' prefix"""
-
- active_in: bool
- """Whether this product is currently available for offering"""
-
- category: Category
- """
- - `Medical` - Medical
- - `Dental` - Dental
- - `Vision` - Vision
- - `Hospital` - Hospital
- """
-
- created_at: datetime
- """Timestamp when the product was created"""
-
- name: str
- """Display name of the benefit product"""
-
- product_code: ProductCode
- """
- - `EBA` - Eba Mec
- - `VPC` - Vpc Enhanced
- - `VPC_CORE` - Vpc Core
- - `MEC` - Vpc Mec
- - `MEC2` - Mec2
- - `MEC_PLUS` - Mec Plus
- - `MVP` - Mvp
- - `MVP2` - Mvp2
- - `MVPSL` - Mvpsl
- - `MVPSL2` - Mvpsl2
- - `VD` - Dental
- - `VV` - Vision
- - `ICHRA` - Ichra
- - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus
- - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only
- """
-
- updated_at: datetime
- """Timestamp when the product was last updated"""
-
- carrier_name: Optional[str] = None
- """Name of the carrier providing this product"""
-
- description: Optional[str] = None
- """Detailed description of the benefit product"""
-
-
-class BenefitProductListResponse(BaseModel):
- """Paginated list response containing benefit product resources."""
-
- data: List[Data]
-
- pagination: Pagination
- """Pagination metadata for list responses."""
diff --git a/src/vitable_connect/types/benefit_products/__init__.py b/src/vitable_connect/types/benefit_products/__init__.py
index a13344e..f8ee8b1 100644
--- a/src/vitable_connect/types/benefit_products/__init__.py
+++ b/src/vitable_connect/types/benefit_products/__init__.py
@@ -1,10 +1,3 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from __future__ import annotations
-
-from .plan_year import PlanYear as PlanYear
-from .plan_year_status import PlanYearStatus as PlanYearStatus
-from .plan_year_response import PlanYearResponse as PlanYearResponse
-from .plan_year_list_params import PlanYearListParams as PlanYearListParams
-from .plan_year_create_params import PlanYearCreateParams as PlanYearCreateParams
-from .plan_year_list_response import PlanYearListResponse as PlanYearListResponse
diff --git a/src/vitable_connect/types/benefit_products/plan_year.py b/src/vitable_connect/types/benefit_products/plan_year.py
deleted file mode 100644
index e0de738..0000000
--- a/src/vitable_connect/types/benefit_products/plan_year.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-from datetime import date, datetime
-
-from ..._models import BaseModel
-from ..plan_tier import PlanTier
-from ..coverage_tier import CoverageTier
-from .plan_year_status import PlanYearStatus
-
-__all__ = ["PlanYear", "ContributionClass", "Plan"]
-
-
-class ContributionClass(BaseModel):
- """Defines eligibility tiers for contributions within a plan year.
-
- Contribution classes specify cost structures based on employment type
- and family coverage status.
- """
-
- id: str
- """Unique contribution class identifier"""
-
- coverage_tier: CoverageTier
- """
- - `Unspecified` - Unspecified
- - `EE` - Ee
- - `ES` - Es
- - `EC` - Ec
- - `EF` - Ef
- """
-
- employee_contribution_cents: int
- """Employee's monthly contribution amount in cents"""
-
- employer_contribution_cents: int
- """Employer's monthly contribution amount in cents"""
-
- employment: str
- """Employment type for this contribution class (e.g., 'full_time', 'part_time')"""
-
-
-class Plan(BaseModel):
- """Nested plan within PlanYearSerializer."""
-
- id: str
- """Unique plan identifier with 'plan\\__' prefix"""
-
- carrier_plan_id: str
- """Reference to the carrier's plan definition (cplan\\__\\**)"""
-
- monthly_premium_cents: int
- """Base monthly premium in cents"""
-
- name: str
- """Display name of the benefit plan"""
-
- deductible_cents: Optional[int] = None
- """Annual deductible amount in cents"""
-
- out_of_pocket_max_cents: Optional[int] = None
- """Annual out-of-pocket maximum in cents"""
-
- tier: Optional[PlanTier] = None
- """
- - `Bronze` - Bronze
- - `Silver` - Silver
- - `Gold` - Gold
- - `Platinum` - Platinum
- """
-
-
-class PlanYear(BaseModel):
- """Serializer for Plan Year entity in public API responses.
-
- A Plan Year represents a benefit period configuration including coverage dates,
- open enrollment windows, available plans, and contribution structures.
- """
-
- id: str
- """Unique plan year identifier with 'plyr\\__' prefix"""
-
- benefit_product_id: str
- """ID of the benefit product (bprd\\__\\**)"""
-
- contribution_classes: List[ContributionClass]
- """List of contribution classes defining eligibility tiers and cost structures"""
-
- coverage_end: date
- """Date when benefit coverage ends"""
-
- coverage_start: date
- """Date when benefit coverage begins"""
-
- created_at: datetime
- """Timestamp when the plan year was created"""
-
- employer_id: str
- """ID of the employer this plan year is for (empr\\__\\**)"""
-
- open_enrollment_end_date: date
- """Date when open enrollment period ends"""
-
- open_enrollment_start_date: date
- """Date when open enrollment period begins"""
-
- plans: List[Plan]
- """List of benefit plans available in this plan year"""
-
- status: PlanYearStatus
- """
- - `draft` - Draft
- - `open_enrollment` - Open Enrollment
- - `active` - Active
- - `expired` - Expired
- """
-
- updated_at: datetime
- """Timestamp when the plan year was last updated"""
diff --git a/src/vitable_connect/types/benefit_products/plan_year_create_params.py b/src/vitable_connect/types/benefit_products/plan_year_create_params.py
deleted file mode 100644
index 186005a..0000000
--- a/src/vitable_connect/types/benefit_products/plan_year_create_params.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union, Iterable
-from datetime import date
-from typing_extensions import Required, Annotated, TypedDict
-
-from ..._utils import PropertyInfo
-from ..coverage_tier import CoverageTier
-
-__all__ = ["PlanYearCreateParams", "ContributionClass"]
-
-
-class PlanYearCreateParams(TypedDict, total=False):
- contribution_classes: Required[Iterable[ContributionClass]]
- """List of contribution classes (at least one required)"""
-
- coverage_end: Required[Annotated[Union[str, date], PropertyInfo(format="iso8601")]]
- """Coverage end date"""
-
- coverage_start: Required[Annotated[Union[str, date], PropertyInfo(format="iso8601")]]
- """Coverage start date"""
-
- employer_id: Required[str]
- """Employer ID this plan year is for (empr\\__\\**)"""
-
- open_enrollment_end: Required[Annotated[Union[str, date], PropertyInfo(format="iso8601")]]
- """Open enrollment end date"""
-
- open_enrollment_start: Required[Annotated[Union[str, date], PropertyInfo(format="iso8601")]]
- """Open enrollment start date"""
-
-
-class ContributionClass(TypedDict, total=False):
- """Contribution class input for plan year creation."""
-
- coverage_tier: Required[CoverageTier]
- """
- - `Unspecified` - Unspecified
- - `EE` - Ee
- - `ES` - Es
- - `EC` - Ec
- - `EF` - Ef
- """
-
- employee_contribution_cents: Required[int]
- """Employee's monthly contribution in cents"""
-
- employer_contribution_cents: Required[int]
- """Employer's monthly contribution in cents"""
-
- employment: Required[str]
- """Employment type (e.g., 'full_time', 'part_time')"""
diff --git a/src/vitable_connect/types/benefit_products/plan_year_list_params.py b/src/vitable_connect/types/benefit_products/plan_year_list_params.py
deleted file mode 100644
index eef925e..0000000
--- a/src/vitable_connect/types/benefit_products/plan_year_list_params.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-from .plan_year_status import PlanYearStatus
-
-__all__ = ["PlanYearListParams"]
-
-
-class PlanYearListParams(TypedDict, total=False):
- employer_id: str
- """Filter by employer ID"""
-
- limit: int
- """Items per page (default: 20, max: 100)"""
-
- page: int
- """Page number (default: 1)"""
-
- status: PlanYearStatus
- """Filter by plan year status"""
diff --git a/src/vitable_connect/types/benefit_products/plan_year_list_response.py b/src/vitable_connect/types/benefit_products/plan_year_list_response.py
deleted file mode 100644
index 06c816b..0000000
--- a/src/vitable_connect/types/benefit_products/plan_year_list_response.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List
-
-from ..._models import BaseModel
-from .plan_year import PlanYear
-from ..pagination import Pagination
-
-__all__ = ["PlanYearListResponse"]
-
-
-class PlanYearListResponse(BaseModel):
- """Paginated list response containing plan year resources."""
-
- data: List[PlanYear]
-
- pagination: Pagination
- """Pagination metadata for list responses."""
diff --git a/src/vitable_connect/types/benefit_products/plan_year_response.py b/src/vitable_connect/types/benefit_products/plan_year_response.py
deleted file mode 100644
index 8b696fb..0000000
--- a/src/vitable_connect/types/benefit_products/plan_year_response.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from ..._models import BaseModel
-from .plan_year import PlanYear
-
-__all__ = ["PlanYearResponse"]
-
-
-class PlanYearResponse(BaseModel):
- """Response containing a single plan year resource."""
-
- data: PlanYear
- """Serializer for Plan Year entity in public API responses.
-
- A Plan Year represents a benefit period configuration including coverage dates,
- open enrollment windows, available plans, and contribution structures.
- """
diff --git a/src/vitable_connect/types/benefit_products/plan_year_status.py b/src/vitable_connect/types/benefit_products/plan_year_status.py
deleted file mode 100644
index b4cbcf3..0000000
--- a/src/vitable_connect/types/benefit_products/plan_year_status.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["PlanYearStatus"]
-
-PlanYearStatus: TypeAlias = Literal["draft", "open_enrollment", "active", "expired"]
diff --git a/src/vitable_connect/types/coverage_tier.py b/src/vitable_connect/types/coverage_tier.py
deleted file mode 100644
index 81016cf..0000000
--- a/src/vitable_connect/types/coverage_tier.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["CoverageTier"]
-
-CoverageTier: TypeAlias = Literal["Unspecified", "EE", "ES", "EC", "EF"]
diff --git a/src/vitable_connect/types/dependent.py b/src/vitable_connect/types/dependent.py
deleted file mode 100644
index b06c41d..0000000
--- a/src/vitable_connect/types/dependent.py
+++ /dev/null
@@ -1,65 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-from datetime import date, datetime
-
-from .sex import Sex
-from .._models import BaseModel
-from .relationship import Relationship
-
-__all__ = ["Dependent"]
-
-
-class Dependent(BaseModel):
- """Serializer for Dependent entity in public API responses.
-
- Dependents are family members (spouse, children) who may be eligible
- for benefit coverage through an employee.
- """
-
- id: str
- """Unique dependent identifier with 'dpnd\\__' prefix"""
-
- active_in: bool
- """Whether the dependent is currently active"""
-
- created_at: datetime
- """Timestamp when the dependent was created"""
-
- date_of_birth: date
- """Dependent's date of birth (YYYY-MM-DD)"""
-
- first_name: str
- """Dependent's legal first name"""
-
- last_name: str
- """Dependent's legal last name"""
-
- member_id: str
- """ID of the primary member/employee (mbr\\__\\**)"""
-
- relationship: Relationship
- """
- - `Spouse` - Spouse
- - `Child` - Child
- """
-
- sex: Sex
- """
- - `Male` - Male
- - `Female` - Female
- - `Other` - Other
- - `Unknown` - Unknown
- """
-
- updated_at: datetime
- """Timestamp when the dependent was last updated"""
-
- gender: Optional[str] = None
- """Gender identity, if provided"""
-
- ssn_last_four: Optional[str] = None
- """Last 4 digits of SSN (masked)"""
-
- suffix: Optional[str] = None
- """Name suffix (e.g., Jr., Sr., III)"""
diff --git a/src/vitable_connect/types/dependent_response.py b/src/vitable_connect/types/dependent_response.py
deleted file mode 100644
index adf9ab6..0000000
--- a/src/vitable_connect/types/dependent_response.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .._models import BaseModel
-from .dependent import Dependent
-
-__all__ = ["DependentResponse"]
-
-
-class DependentResponse(BaseModel):
- """Response containing a single dependent resource."""
-
- data: Dependent
- """Serializer for Dependent entity in public API responses.
-
- Dependents are family members (spouse, children) who may be eligible for benefit
- coverage through an employee.
- """
diff --git a/src/vitable_connect/types/dependent_update_params.py b/src/vitable_connect/types/dependent_update_params.py
deleted file mode 100644
index f85d4d2..0000000
--- a/src/vitable_connect/types/dependent_update_params.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import TypedDict
-
-from .relationship import Relationship
-
-__all__ = ["DependentUpdateParams"]
-
-
-class DependentUpdateParams(TypedDict, total=False):
- active: Optional[bool]
- """Whether the dependent is active"""
-
- gender: Optional[str]
- """Gender identity"""
-
- relationship: Optional[Relationship]
- """
- - `Spouse` - Spouse
- - `Child` - Child
- """
diff --git a/src/vitable_connect/types/employee.py b/src/vitable_connect/types/employee.py
index deb4f3b..684ce96 100644
--- a/src/vitable_connect/types/employee.py
+++ b/src/vitable_connect/types/employee.py
@@ -1,109 +1,83 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import Optional
+from typing import List, Optional
from datetime import date, datetime
-from .sex import Sex
from .._models import BaseModel
from .employee_class import EmployeeClass
+from .enrollment_status import EnrollmentStatus
-__all__ = ["Employee", "Member", "Address"]
+__all__ = ["Employee", "Enrollment", "Address"]
-class Member(BaseModel):
- """Nested member entity containing personal identity information.
-
- Matches MemberEntity from account module domain.
- """
-
+class Enrollment(BaseModel):
id: str
- """Unique member identifier with 'mbr\\__' prefix"""
-
- date_of_birth: date
- """Member's date of birth (YYYY-MM-DD)"""
+ """Unique enrollment identifier with 'enrl\\__' prefix"""
- first_name: str
- """Member's legal first name"""
-
- last_name: str
- """Member's legal last name"""
-
- sex: Sex
+ status: EnrollmentStatus
"""
- - `Male` - Male
- - `Female` - Female
- - `Other` - Other
- - `Unknown` - Unknown
+ - `pending` - Pending
+ - `enrolled` - Enrolled
+ - `waived` - Waived
+ - `inactive` - Inactive
"""
- email: Optional[str] = None
- """Email address for communications"""
-
- gender: Optional[str] = None
- """Gender identity, if provided"""
-
- phone: Optional[str] = None
- """Phone number"""
-
- suffix: Optional[str] = None
- """Name suffix (e.g., Jr., Sr., III)"""
+ answered_at: Optional[datetime] = None
+ """Timestamp when the enrollment decision was made"""
class Address(BaseModel):
- """Nested address for employee."""
+ """Employee's residential address"""
+
+ address_line_1: str
+ """Primary street address"""
city: str
"""City name"""
state: str
- """Two-letter state code"""
-
- street_1: str
- """Primary street address"""
-
- zip_code: str
- """ZIP code"""
+ """Two-letter state code (e.g., CA, NY)"""
- country: Optional[str] = None
- """Country code"""
+ zipcode: str
+ """ZIP code (5 or 9 digit)"""
- street_2: Optional[str] = None
- """Secondary street address"""
+ address_line_2: Optional[str] = None
+ """Secondary street address (apt, suite, etc.)"""
class Employee(BaseModel):
- """Serializer for Employee entity in public API responses.
-
- Note: Employee is in the company module but exposed via account public API.
- Contains nested MemberEntity with personal identity information.
- """
-
id: str
"""Unique employee identifier with 'empl\\__' prefix"""
- active_in: bool
- """Whether the employee is currently active"""
-
created_at: datetime
"""Timestamp when the employee was created"""
- employer_id: str
- """ID of the employer this employee works for (empr\\__\\**)"""
+ date_of_birth: date
+ """Date of birth (YYYY-MM-DD)"""
- member: Member
- """Nested member entity containing personal identity information.
+ email: str
+ """Email address"""
- Matches MemberEntity from account module domain.
- """
+ enrollments: List[Enrollment]
+ """Benefit enrollments for this employee"""
+
+ first_name: str
+ """Employee's legal first name"""
+
+ last_name: str
+ """Employee's legal last name"""
+
+ member_id: str
+ """Unique member identifier with 'mbr\\__' prefix"""
- start_date: date
- """Employee's start/hire date with the employer"""
+ status: str
+ """Employee status (active or terminated)"""
updated_at: datetime
"""Timestamp when the employee was last updated"""
address: Optional[Address] = None
- """Nested address for employee."""
+ """Employee's residential address"""
employee_class: Optional[EmployeeClass] = None
"""
@@ -115,5 +89,20 @@ class Employee(BaseModel):
- `Individual Contractor` - Individual Contractor
"""
+ gender: Optional[str] = None
+ """Gender identity, if provided"""
+
+ hire_date: Optional[date] = None
+ """Employee's hire date with the employer"""
+
+ phone: Optional[str] = None
+ """Phone number (10-digit US domestic string)"""
+
+ reference_id: Optional[str] = None
+ """Partner-assigned reference ID for the employee"""
+
+ suffix: Optional[str] = None
+ """Name suffix (e.g., Jr., Sr., III)"""
+
termination_date: Optional[date] = None
"""Employee's termination date, if terminated"""
diff --git a/src/vitable_connect/types/employee_response.py b/src/vitable_connect/types/employee_response.py
index 86fce93..fb41ca9 100644
--- a/src/vitable_connect/types/employee_response.py
+++ b/src/vitable_connect/types/employee_response.py
@@ -10,8 +10,3 @@ class EmployeeResponse(BaseModel):
"""Response containing a single employee resource."""
data: Employee
- """Serializer for Employee entity in public API responses.
-
- Note: Employee is in the company module but exposed via account public API.
- Contains nested MemberEntity with personal identity information.
- """
diff --git a/src/vitable_connect/types/employee_update_params.py b/src/vitable_connect/types/employee_update_params.py
deleted file mode 100644
index 405276c..0000000
--- a/src/vitable_connect/types/employee_update_params.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union, Optional
-from datetime import date
-from typing_extensions import Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-from .employee_class import EmployeeClass
-
-__all__ = ["EmployeeUpdateParams", "Address"]
-
-
-class EmployeeUpdateParams(TypedDict, total=False):
- address: Optional[Address]
- """Employee's residential address"""
-
- email: Optional[str]
- """Email address"""
-
- employee_class: Optional[EmployeeClass]
- """
- - `Full Time` - Full Time
- - `Part Time` - Part Time
- - `Temporary` - Temporary
- - `Intern` - Intern
- - `Seasonal` - Seasonal
- - `Individual Contractor` - Individual Contractor
- """
-
- gender: Optional[str]
- """Gender identity"""
-
- phone: Optional[str]
- """Phone number"""
-
- termination_date: Annotated[Union[str, date, None], PropertyInfo(format="iso8601")]
- """Termination date if terminating"""
-
-
-class Address(TypedDict, total=False):
- """Employee's residential address"""
-
- city: Required[str]
- """City name"""
-
- state: Required[str]
- """Two-letter state code"""
-
- street_1: Required[str]
- """Primary street address"""
-
- zip_code: Required[str]
- """ZIP code"""
-
- country: str
- """Country code"""
-
- street_2: Optional[str]
- """Secondary street address"""
diff --git a/src/vitable_connect/types/employees/__init__.py b/src/vitable_connect/types/employees/__init__.py
index 00a3af9..758110a 100644
--- a/src/vitable_connect/types/employees/__init__.py
+++ b/src/vitable_connect/types/employees/__init__.py
@@ -4,4 +4,3 @@
from .enrollment_list import EnrollmentList as EnrollmentList
from .enrollment_list_params import EnrollmentListParams as EnrollmentListParams
-from .enrollment_submit_elections_params import EnrollmentSubmitElectionsParams as EnrollmentSubmitElectionsParams
diff --git a/src/vitable_connect/types/employees/enrollment_list_params.py b/src/vitable_connect/types/employees/enrollment_list_params.py
index 18a612b..75fd128 100644
--- a/src/vitable_connect/types/employees/enrollment_list_params.py
+++ b/src/vitable_connect/types/employees/enrollment_list_params.py
@@ -4,23 +4,12 @@
from typing_extensions import TypedDict
-from ..enrollment_status import EnrollmentStatus
-
__all__ = ["EnrollmentListParams"]
class EnrollmentListParams(TypedDict, total=False):
- coverage_effective_start_year: int
- """Filter by coverage year"""
-
limit: int
"""Items per page (default: 20, max: 100)"""
page: int
"""Page number (default: 1)"""
-
- plan_year: int
- """Filter by plan year start (YYYY)"""
-
- status: EnrollmentStatus
- """Filter by enrollment status"""
diff --git a/src/vitable_connect/types/employees/enrollment_submit_elections_params.py b/src/vitable_connect/types/employees/enrollment_submit_elections_params.py
deleted file mode 100644
index 163d5ba..0000000
--- a/src/vitable_connect/types/employees/enrollment_submit_elections_params.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Iterable, Optional
-from typing_extensions import Literal, Required, TypedDict
-
-from ..._types import SequenceNotStr
-from ..coverage_tier import CoverageTier
-
-__all__ = ["EnrollmentSubmitElectionsParams", "Election"]
-
-
-class EnrollmentSubmitElectionsParams(TypedDict, total=False):
- elections: Required[Iterable[Election]]
- """List of enrollment elections"""
-
-
-class Election(TypedDict, total=False):
- """Individual enrollment election within the batch request."""
-
- coverage_tier: Required[CoverageTier]
- """
- - `Unspecified` - Unspecified
- - `EE` - Ee
- - `ES` - Es
- - `EC` - Ec
- - `EF` - Ef
- """
-
- decision: Required[Literal["Enrolled", "Waived"]]
- """
- - `Enrolled` - Enrolled
- - `Waived` - Waived
- """
-
- enrollment_id: Required[str]
- """ID of the enrollment (enrl\\__\\**)"""
-
- dependent_ids: Optional[SequenceNotStr[str]]
- """List of dependent IDs to include in coverage (dpnd\\__\\**)"""
-
- selected_plan_id: Optional[str]
- """ID of the selected plan (plan\\__\\**). Required if decision is 'Enrolled'"""
diff --git a/src/vitable_connect/types/employer.py b/src/vitable_connect/types/employer.py
index 08ff4c5..ca3439b 100644
--- a/src/vitable_connect/types/employer.py
+++ b/src/vitable_connect/types/employer.py
@@ -54,7 +54,7 @@ class Employer(BaseModel):
name: str
"""Display name of the employer"""
- organization_id: str
+ organization_id: Optional[str] = None
"""ID of the parent organization (org\\__\\**)"""
updated_at: datetime
@@ -62,3 +62,9 @@ class Employer(BaseModel):
email: Optional[str] = None
"""Email address for billing and communications"""
+
+ phone_number: Optional[str] = None
+ """Employer phone number (E.164 format recommended)"""
+
+ reference_id: Optional[str] = None
+ """Partner-assigned reference ID for the employer"""
diff --git a/src/vitable_connect/types/employer_create_eligibility_policy_params.py b/src/vitable_connect/types/employer_create_eligibility_policy_params.py
index 41d0d59..d5cfa35 100644
--- a/src/vitable_connect/types/employer_create_eligibility_policy_params.py
+++ b/src/vitable_connect/types/employer_create_eligibility_policy_params.py
@@ -2,38 +2,17 @@
from __future__ import annotations
-from typing import Union, Iterable, Optional
-from datetime import date
-from typing_extensions import Required, Annotated, TypedDict
+from typing_extensions import Required, TypedDict
-from .._utils import PropertyInfo
-
-__all__ = ["EmployerCreateEligibilityPolicyParams", "Rule"]
+__all__ = ["EmployerCreateEligibilityPolicyParams"]
class EmployerCreateEligibilityPolicyParams(TypedDict, total=False):
- effective_date: Required[Annotated[Union[str, date], PropertyInfo(format="iso8601")]]
- """Date when policy becomes effective"""
-
- name: Required[str]
- """Display name for the policy"""
-
- rules: Required[Iterable[Rule]]
- """List of eligibility rules (at least one required)"""
-
- policy_to_replace_id: str
- """ID of existing policy to replace (epol\\__\\**)"""
-
- description: Optional[str]
- """Detailed description"""
-
-
-class Rule(TypedDict, total=False):
- operator: Required[str]
- """Comparison operator"""
+ classification: Required[str]
+ """Which employee classifications are eligible. One of: full_time, part_time, all"""
- rule_type: Required[str]
- """Type of eligibility rule"""
+ waiting_period: Required[str]
+ """Waiting period before eligibility.
- value: Required[str]
- """Value to compare against (can be string, number, boolean, or list)"""
+ One of: first_of_following_month, 30_days, 60_days, none
+ """
diff --git a/src/vitable_connect/types/employer_list_params.py b/src/vitable_connect/types/employer_list_params.py
index 80f21df..888b154 100644
--- a/src/vitable_connect/types/employer_list_params.py
+++ b/src/vitable_connect/types/employer_list_params.py
@@ -8,14 +8,8 @@
class EmployerListParams(TypedDict, total=False):
- active_in: bool
- """Filter by active status"""
-
limit: int
"""Items per page (default: 20, max: 100)"""
- name: str
- """Filter by employer name (partial match)"""
-
page: int
"""Page number (default: 1)"""
diff --git a/src/vitable_connect/types/employer_update_params.py b/src/vitable_connect/types/employer_update_params.py
deleted file mode 100644
index ffd189f..0000000
--- a/src/vitable_connect/types/employer_update_params.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import Required, TypedDict
-
-__all__ = ["EmployerUpdateParams", "Address"]
-
-
-class EmployerUpdateParams(TypedDict, total=False):
- active: Optional[bool]
- """Whether the employer is active"""
-
- address: Optional[Address]
- """Employer address"""
-
- legal_name: Optional[str]
- """Legal business name"""
-
- name: Optional[str]
- """Employer display name"""
-
-
-class Address(TypedDict, total=False):
- """Employer address"""
-
- address_line_1: Required[str]
- """Primary street address"""
-
- city: Required[str]
- """City name"""
-
- state: Required[str]
- """Two-letter state code"""
-
- zipcode: Required[str]
- """ZIP code"""
-
- address_line_2: Optional[str]
- """Secondary street address"""
diff --git a/src/vitable_connect/types/employers/__init__.py b/src/vitable_connect/types/employers/__init__.py
index 167310f..3a2b0c0 100644
--- a/src/vitable_connect/types/employers/__init__.py
+++ b/src/vitable_connect/types/employers/__init__.py
@@ -3,5 +3,4 @@
from __future__ import annotations
from .employee_list_params import EmployeeListParams as EmployeeListParams
-from .employee_create_params import EmployeeCreateParams as EmployeeCreateParams
from .employee_list_response import EmployeeListResponse as EmployeeListResponse
diff --git a/src/vitable_connect/types/employers/employee_create_params.py b/src/vitable_connect/types/employers/employee_create_params.py
deleted file mode 100644
index 7ba5f58..0000000
--- a/src/vitable_connect/types/employers/employee_create_params.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union, Optional
-from datetime import date
-from typing_extensions import Required, Annotated, TypedDict
-
-from ..sex import Sex
-from ..._utils import PropertyInfo
-from ..employee_class import EmployeeClass
-
-__all__ = ["EmployeeCreateParams", "Address"]
-
-
-class EmployeeCreateParams(TypedDict, total=False):
- date_of_birth: Required[Annotated[Union[str, date], PropertyInfo(format="iso8601")]]
- """Date of birth (YYYY-MM-DD)"""
-
- email: Required[str]
- """Email address"""
-
- first_name: Required[str]
- """Employee's legal first name"""
-
- last_name: Required[str]
- """Employee's legal last name"""
-
- sex: Required[Sex]
- """
- - `Male` - Male
- - `Female` - Female
- - `Other` - Other
- - `Unknown` - Unknown
- """
-
- ssn: Required[str]
- """Social Security Number (XXX-XX-XXXX or XXXXXXXXX). Only accepted on create."""
-
- start_date: Required[Annotated[Union[str, date], PropertyInfo(format="iso8601")]]
- """Employment start/hire date"""
-
- address: Optional[Address]
- """Employee's residential address"""
-
- employee_class: Optional[EmployeeClass]
- """
- - `Full Time` - Full Time
- - `Part Time` - Part Time
- - `Temporary` - Temporary
- - `Intern` - Intern
- - `Seasonal` - Seasonal
- - `Individual Contractor` - Individual Contractor
- """
-
- gender: Optional[str]
- """Gender identity"""
-
- phone: Optional[str]
- """Phone number"""
-
- suffix: Optional[str]
- """Name suffix (Jr., Sr., III)"""
-
-
-class Address(TypedDict, total=False):
- """Employee's residential address"""
-
- city: Required[str]
- """City name"""
-
- state: Required[str]
- """Two-letter state code"""
-
- street_1: Required[str]
- """Primary street address"""
-
- zip_code: Required[str]
- """ZIP code"""
-
- country: str
- """Country code"""
-
- street_2: Optional[str]
- """Secondary street address"""
diff --git a/src/vitable_connect/types/employers/employee_list_params.py b/src/vitable_connect/types/employers/employee_list_params.py
index bbc0f77..058b1d0 100644
--- a/src/vitable_connect/types/employers/employee_list_params.py
+++ b/src/vitable_connect/types/employers/employee_list_params.py
@@ -4,18 +4,10 @@
from typing_extensions import TypedDict
-from ..employee_class import EmployeeClass
-
__all__ = ["EmployeeListParams"]
class EmployeeListParams(TypedDict, total=False):
- active_in: bool
- """Filter by active status"""
-
- employee_class: EmployeeClass
- """Filter by employment classification"""
-
limit: int
"""Items per page (default: 20, max: 100)"""
diff --git a/src/vitable_connect/types/enrollment.py b/src/vitable_connect/types/enrollment.py
index 5cba4c1..19f8a49 100644
--- a/src/vitable_connect/types/enrollment.py
+++ b/src/vitable_connect/types/enrollment.py
@@ -1,64 +1,83 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List, Optional
+from typing import Optional
from datetime import date, datetime
from .._models import BaseModel
-from .relationship import Relationship
-from .coverage_tier import CoverageTier
+from .category import Category
+from .product_code import ProductCode
from .enrollment_status import EnrollmentStatus
-__all__ = ["Enrollment", "EnrolledDependent"]
+__all__ = ["Enrollment", "Benefit"]
-class EnrolledDependent(BaseModel):
- """Dependent included in an enrollment."""
+class Benefit(BaseModel):
+ """Nested benefit product summary"""
- dependent_id: str
- """ID of the dependent (dpnd\\__\\**)"""
+ id: str
+ """Benefit product ID (bprd\\__\\**)"""
- first_name: str
- """Dependent's first name"""
+ category: Category
+ """
+ - `Medical` - Medical
+ - `Dental` - Dental
+ - `Vision` - Vision
+ - `Hospital` - Hospital
+ """
- last_name: str
- """Dependent's last name"""
+ name: str
+ """Display name of the benefit product"""
- relationship: Relationship
+ product_code: ProductCode
"""
- - `Spouse` - Spouse
- - `Child` - Child
+ - `EBA` - Eba Mec
+ - `VPC` - Vpc Enhanced
+ - `VPC_CORE` - Vpc Core
+ - `MEC` - Vpc Mec
+ - `MEC2` - Mec2
+ - `MEC_PLUS` - Mec Plus
+ - `MVP` - Mvp
+ - `MVP2` - Mvp2
+ - `MVPSL` - Mvpsl
+ - `MVPSL2` - Mvpsl2
+ - `VD` - Dental
+ - `VV` - Vision
+ - `ICHRA` - Ichra
+ - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus
+ - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only
"""
class Enrollment(BaseModel):
- """Serializer for Enrollment entity in public API responses.
+ id: str
+ """Unique enrollment identifier (enrl\\__\\**)"""
- An Enrollment represents an employee's benefit enrollment for a specific plan year.
- """
+ answered_at: Optional[datetime] = None
+ """When the employee enrolled or waived"""
- id: str
- """Unique enrollment identifier with 'enrl\\__' prefix"""
+ benefit: Benefit
+ """Nested benefit product summary"""
- benefit_product_id: str
- """ID of the benefit product (bprd\\__\\**)"""
+ coverage_end: Optional[date] = None
+ """Coverage period end date"""
- coverage_tier: CoverageTier
- """
- - `Unspecified` - Unspecified
- - `EE` - Ee
- - `ES` - Es
- - `EC` - Ec
- - `EF` - Ef
- """
+ coverage_start: date
+ """Coverage period start date"""
created_at: datetime
- """Timestamp when the enrollment was created"""
+ """When the enrollment was created"""
+
+ employee_deduction_in_cents: Optional[int] = None
+ """Employee monthly payroll deduction in cents"""
employee_id: str
- """ID of the employee (empl\\__\\**)"""
+ """Employee ID (empl\\__\\**)"""
+
+ employer_contribution_in_cents: Optional[int] = None
+ """Employer monthly contribution in cents"""
- plan_year_id: str
- """ID of the plan year (plyr\\__\\**)"""
+ employer_id: str
+ """Employer ID (empr\\__\\**)"""
status: EnrollmentStatus
"""
@@ -68,29 +87,8 @@ class Enrollment(BaseModel):
- `inactive` - Inactive
"""
- updated_at: datetime
- """Timestamp when the enrollment was last updated"""
-
- coverage_end_date: Optional[date] = None
- """Date when coverage ends"""
-
- coverage_start_date: Optional[date] = None
- """Date when coverage begins"""
-
- decision: Optional[str] = None
- """Employee's election decision: 'enrolled' (accepted) or 'waived' (declined)"""
-
- employee_contribution_cents: Optional[int] = None
- """Employee's monthly contribution in cents"""
+ terminated_at: Optional[datetime] = None
+ """When coverage was terminated"""
- employer_contribution_cents: Optional[int] = None
- """Employer's monthly contribution in cents"""
-
- enrolled_dependents: Optional[List[EnrolledDependent]] = None
- """List of dependents included in this enrollment"""
-
- selected_plan_id: Optional[str] = None
- """ID of the selected plan (plan\\__\\**), if enrolled"""
-
- selected_plan_name: Optional[str] = None
- """Name of the selected plan"""
+ updated_at: datetime
+ """When the enrollment was last updated"""
diff --git a/src/vitable_connect/types/enrollment_list_plans_response.py b/src/vitable_connect/types/enrollment_list_plans_response.py
deleted file mode 100644
index b5a5013..0000000
--- a/src/vitable_connect/types/enrollment_list_plans_response.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-
-from .._models import BaseModel
-from .plan_tier import PlanTier
-from .pagination import Pagination
-from .coverage_tier import CoverageTier
-
-__all__ = ["EnrollmentListPlansResponse", "Data", "DataCost"]
-
-
-class DataCost(BaseModel):
- """Cost breakdown for a plan option."""
-
- coverage_tier: CoverageTier
- """
- - `Unspecified` - Unspecified
- - `EE` - Ee
- - `ES` - Es
- - `EC` - Ec
- - `EF` - Ef
- """
-
- employee_contribution_cents: int
- """Employee's monthly contribution in cents"""
-
- employer_contribution_cents: int
- """Employer's monthly contribution in cents"""
-
- total_monthly_premium_cents: int
- """Total monthly premium in cents"""
-
-
-class Data(BaseModel):
- """Serializer for plan options available for enrollment selection.
-
- Returns plan details with cost breakdowns for each coverage tier.
- """
-
- id: str
- """Unique plan identifier (plan\\__\\**)"""
-
- costs: List[DataCost]
- """Cost breakdown by coverage tier"""
-
- name: str
- """Display name of the plan"""
-
- carrier_name: Optional[str] = None
- """Name of the carrier"""
-
- deductible_cents: Optional[int] = None
- """Annual deductible in cents"""
-
- description: Optional[str] = None
- """Plan description"""
-
- out_of_pocket_max_cents: Optional[int] = None
- """Annual out-of-pocket maximum in cents"""
-
- tier: Optional[PlanTier] = None
- """
- - `Bronze` - Bronze
- - `Silver` - Silver
- - `Gold` - Gold
- - `Platinum` - Platinum
- """
-
-
-class EnrollmentListPlansResponse(BaseModel):
- """Paginated list response containing plan option resources."""
-
- data: List[Data]
-
- pagination: Pagination
- """Pagination metadata for list responses."""
diff --git a/src/vitable_connect/types/enrollment_reissue_params.py b/src/vitable_connect/types/enrollment_reissue_params.py
deleted file mode 100644
index 3c0dc4e..0000000
--- a/src/vitable_connect/types/enrollment_reissue_params.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import Required, TypedDict
-
-__all__ = ["EnrollmentReissueParams"]
-
-
-class EnrollmentReissueParams(TypedDict, total=False):
- qle_id: Required[str]
- """ID of the qualifying life event (qle\\__\\**)"""
-
- reason: Optional[str]
- """Optional reason for reissue"""
diff --git a/src/vitable_connect/types/enrollment_response.py b/src/vitable_connect/types/enrollment_response.py
index 1e82a63..4170224 100644
--- a/src/vitable_connect/types/enrollment_response.py
+++ b/src/vitable_connect/types/enrollment_response.py
@@ -10,8 +10,3 @@ class EnrollmentResponse(BaseModel):
"""Response containing a single enrollment resource."""
data: Enrollment
- """Serializer for Enrollment entity in public API responses.
-
- An Enrollment represents an employee's benefit enrollment for a specific plan
- year.
- """
diff --git a/src/vitable_connect/types/members/__init__.py b/src/vitable_connect/types/members/__init__.py
index 8e2d2fe..f8ee8b1 100644
--- a/src/vitable_connect/types/members/__init__.py
+++ b/src/vitable_connect/types/members/__init__.py
@@ -1,14 +1,3 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from __future__ import annotations
-
-from .event_type import EventType as EventType
-from .dependent_list_params import DependentListParams as DependentListParams
-from .qualifying_life_event import QualifyingLifeEvent as QualifyingLifeEvent
-from .dependent_create_params import DependentCreateParams as DependentCreateParams
-from .dependent_list_response import DependentListResponse as DependentListResponse
-from .qualifying_life_event_status import QualifyingLifeEventStatus as QualifyingLifeEventStatus
-from .qualifying_life_event_response import QualifyingLifeEventResponse as QualifyingLifeEventResponse
-from .qualifying_life_event_list_params import QualifyingLifeEventListParams as QualifyingLifeEventListParams
-from .qualifying_life_event_list_response import QualifyingLifeEventListResponse as QualifyingLifeEventListResponse
-from .qualifying_life_event_record_params import QualifyingLifeEventRecordParams as QualifyingLifeEventRecordParams
diff --git a/src/vitable_connect/types/members/dependent_create_params.py b/src/vitable_connect/types/members/dependent_create_params.py
deleted file mode 100644
index 3684894..0000000
--- a/src/vitable_connect/types/members/dependent_create_params.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union, Optional
-from datetime import date
-from typing_extensions import Required, Annotated, TypedDict
-
-from ..sex import Sex
-from ..._utils import PropertyInfo
-from ..relationship import Relationship
-
-__all__ = ["DependentCreateParams"]
-
-
-class DependentCreateParams(TypedDict, total=False):
- date_of_birth: Required[Annotated[Union[str, date], PropertyInfo(format="iso8601")]]
- """Date of birth (YYYY-MM-DD)"""
-
- first_name: Required[str]
- """Dependent's legal first name"""
-
- last_name: Required[str]
- """Dependent's legal last name"""
-
- relationship: Required[Relationship]
- """
- - `Spouse` - Spouse
- - `Child` - Child
- """
-
- sex: Required[Sex]
- """
- - `Male` - Male
- - `Female` - Female
- - `Other` - Other
- - `Unknown` - Unknown
- """
-
- gender: Optional[str]
- """Gender identity"""
-
- ssn: Optional[str]
- """Social Security Number (optional, XXX-XX-XXXX or XXXXXXXXX)"""
-
- suffix: Optional[str]
- """Name suffix (Jr., Sr., III)"""
diff --git a/src/vitable_connect/types/members/dependent_list_params.py b/src/vitable_connect/types/members/dependent_list_params.py
deleted file mode 100644
index d17e30b..0000000
--- a/src/vitable_connect/types/members/dependent_list_params.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-from ..relationship import Relationship
-
-__all__ = ["DependentListParams"]
-
-
-class DependentListParams(TypedDict, total=False):
- active_in: bool
- """Filter by active status"""
-
- limit: int
- """Items per page (default: 20, max: 100)"""
-
- page: int
- """Page number (default: 1)"""
-
- relationship: Relationship
- """Filter by relationship type"""
diff --git a/src/vitable_connect/types/members/dependent_list_response.py b/src/vitable_connect/types/members/dependent_list_response.py
deleted file mode 100644
index 501af6a..0000000
--- a/src/vitable_connect/types/members/dependent_list_response.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List
-
-from ..._models import BaseModel
-from ..dependent import Dependent
-from ..pagination import Pagination
-
-__all__ = ["DependentListResponse"]
-
-
-class DependentListResponse(BaseModel):
- """Paginated list response containing dependent resources."""
-
- data: List[Dependent]
-
- pagination: Pagination
- """Pagination metadata for list responses."""
diff --git a/src/vitable_connect/types/members/event_type.py b/src/vitable_connect/types/members/event_type.py
deleted file mode 100644
index 89ee83a..0000000
--- a/src/vitable_connect/types/members/event_type.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["EventType"]
-
-EventType: TypeAlias = Literal[
- "Marriage",
- "Birth",
- "Adoption",
- "Divorce",
- "Death",
- "Job Loss",
- "Reduction In Hours",
- "Employer Bankruptcy",
- "Medicare Entitlement",
- "Termination",
- "Other",
-]
diff --git a/src/vitable_connect/types/members/qualifying_life_event.py b/src/vitable_connect/types/members/qualifying_life_event.py
deleted file mode 100644
index f534a28..0000000
--- a/src/vitable_connect/types/members/qualifying_life_event.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-from datetime import date, datetime
-
-from ..._models import BaseModel
-from .qualifying_life_event_status import QualifyingLifeEventStatus
-
-__all__ = ["QualifyingLifeEvent"]
-
-
-class QualifyingLifeEvent(BaseModel):
- """Serializer for Qualifying Life Event entity in public API responses.
-
- QLEs are significant life changes (marriage, birth, adoption, loss of coverage)
- that allow employees to modify benefit elections outside of open enrollment.
- """
-
- id: str
- """Unique QLE identifier with 'qle\\__' prefix"""
-
- created_at: datetime
- """Timestamp when the QLE was created"""
-
- employee_id: str
- """ID of the employee (empl\\__\\**)"""
-
- enrollment_window_end: datetime
- """End of the special enrollment period (typically 30-60 days from event)"""
-
- enrollment_window_start: datetime
- """Start of the special enrollment period"""
-
- event_date: date
- """Date when the qualifying life event occurred"""
-
- event_type: str
- """
- Type of qualifying life event (e.g., 'marriage', 'birth', 'adoption',
- 'loss_of_coverage', 'divorce')
- """
-
- member_id: str
- """ID of the member experiencing the life event (mbr\\__\\**)"""
-
- status: QualifyingLifeEventStatus
- """
- - `pending` - Pending
- - `approved` - Approved
- - `denied` - Denied
- """
-
- updated_at: datetime
- """Timestamp when the QLE was last updated"""
-
- notes: Optional[str] = None
- """Additional notes or comments about the QLE"""
-
- reviewed_at: Optional[datetime] = None
- """Timestamp when the QLE was reviewed, if reviewed"""
-
- reviewed_by: Optional[str] = None
- """ID of the user who reviewed the QLE, if reviewed"""
diff --git a/src/vitable_connect/types/members/qualifying_life_event_list_params.py b/src/vitable_connect/types/members/qualifying_life_event_list_params.py
deleted file mode 100644
index 6e106f4..0000000
--- a/src/vitable_connect/types/members/qualifying_life_event_list_params.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-from .event_type import EventType
-from .qualifying_life_event_status import QualifyingLifeEventStatus
-
-__all__ = ["QualifyingLifeEventListParams"]
-
-
-class QualifyingLifeEventListParams(TypedDict, total=False):
- event_type: EventType
- """Filter by QLE type"""
-
- limit: int
- """Items per page (default: 20, max: 100)"""
-
- page: int
- """Page number (default: 1)"""
-
- status: QualifyingLifeEventStatus
- """Filter by QLE status"""
diff --git a/src/vitable_connect/types/members/qualifying_life_event_list_response.py b/src/vitable_connect/types/members/qualifying_life_event_list_response.py
deleted file mode 100644
index f7b8a5a..0000000
--- a/src/vitable_connect/types/members/qualifying_life_event_list_response.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List
-
-from ..._models import BaseModel
-from ..pagination import Pagination
-from .qualifying_life_event import QualifyingLifeEvent
-
-__all__ = ["QualifyingLifeEventListResponse"]
-
-
-class QualifyingLifeEventListResponse(BaseModel):
- """Paginated list response containing qualifying life event resources."""
-
- data: List[QualifyingLifeEvent]
-
- pagination: Pagination
- """Pagination metadata for list responses."""
diff --git a/src/vitable_connect/types/members/qualifying_life_event_record_params.py b/src/vitable_connect/types/members/qualifying_life_event_record_params.py
deleted file mode 100644
index 1f51a41..0000000
--- a/src/vitable_connect/types/members/qualifying_life_event_record_params.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union, Optional
-from datetime import date
-from typing_extensions import Required, Annotated, TypedDict
-
-from ..._utils import PropertyInfo
-from .event_type import EventType
-
-__all__ = ["QualifyingLifeEventRecordParams"]
-
-
-class QualifyingLifeEventRecordParams(TypedDict, total=False):
- event_date: Required[Annotated[Union[str, date], PropertyInfo(format="iso8601")]]
- """Date when the event occurred"""
-
- event_type: Required[EventType]
- """
- - `Marriage` - Marriage
- - `Birth` - Birth
- - `Adoption` - Adoption
- - `Divorce` - Divorce
- - `Death` - Death
- - `Job Loss` - Job Loss
- - `Reduction In Hours` - Reduction In Hours
- - `Employer Bankruptcy` - Employer Bankruptcy
- - `Medicare Entitlement` - Medicare Entitlement
- - `Termination` - Termination
- - `Other` - Other
- """
-
- notes: Optional[str]
- """Optional notes about the event"""
diff --git a/src/vitable_connect/types/members/qualifying_life_event_response.py b/src/vitable_connect/types/members/qualifying_life_event_response.py
deleted file mode 100644
index fcb9dc2..0000000
--- a/src/vitable_connect/types/members/qualifying_life_event_response.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from ..._models import BaseModel
-from .qualifying_life_event import QualifyingLifeEvent
-
-__all__ = ["QualifyingLifeEventResponse"]
-
-
-class QualifyingLifeEventResponse(BaseModel):
- """Response containing a single qualifying life event resource."""
-
- data: QualifyingLifeEvent
- """Serializer for Qualifying Life Event entity in public API responses.
-
- QLEs are significant life changes (marriage, birth, adoption, loss of coverage)
- that allow employees to modify benefit elections outside of open enrollment.
- """
diff --git a/src/vitable_connect/types/members/qualifying_life_event_status.py b/src/vitable_connect/types/members/qualifying_life_event_status.py
deleted file mode 100644
index 3773615..0000000
--- a/src/vitable_connect/types/members/qualifying_life_event_status.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["QualifyingLifeEventStatus"]
-
-QualifyingLifeEventStatus: TypeAlias = Literal["pending", "approved", "denied"]
diff --git a/src/vitable_connect/types/plan_tier.py b/src/vitable_connect/types/plan_tier.py
deleted file mode 100644
index 9fea756..0000000
--- a/src/vitable_connect/types/plan_tier.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["PlanTier"]
-
-PlanTier: TypeAlias = Literal["Bronze", "Silver", "Gold", "Platinum"]
diff --git a/src/vitable_connect/types/plan_year_update_params.py b/src/vitable_connect/types/plan_year_update_params.py
deleted file mode 100644
index 5d9fb7f..0000000
--- a/src/vitable_connect/types/plan_year_update_params.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union, Iterable, Optional
-from datetime import date
-from typing_extensions import Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-from .coverage_tier import CoverageTier
-
-__all__ = ["PlanYearUpdateParams", "ContributionClass"]
-
-
-class PlanYearUpdateParams(TypedDict, total=False):
- contribution_classes: Optional[Iterable[ContributionClass]]
- """Updated contribution classes"""
-
- open_enrollment_end: Annotated[Union[str, date, None], PropertyInfo(format="iso8601")]
- """Open enrollment end date"""
-
- open_enrollment_start: Annotated[Union[str, date, None], PropertyInfo(format="iso8601")]
- """Open enrollment start date"""
-
- status: Optional[str]
- """Plan year status"""
-
-
-class ContributionClass(TypedDict, total=False):
- """Contribution class input for plan year update."""
-
- coverage_tier: Required[CoverageTier]
- """
- - `Unspecified` - Unspecified
- - `EE` - Ee
- - `ES` - Es
- - `EC` - Ec
- - `EF` - Ef
- """
-
- employee_contribution_cents: Required[int]
- """Employee's monthly contribution in cents"""
-
- employer_contribution_cents: Required[int]
- """Employer's monthly contribution in cents"""
-
- employment: Required[str]
- """Employment type"""
diff --git a/src/vitable_connect/types/relationship.py b/src/vitable_connect/types/relationship.py
deleted file mode 100644
index 03652c6..0000000
--- a/src/vitable_connect/types/relationship.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["Relationship"]
-
-Relationship: TypeAlias = Literal["Spouse", "Child"]
diff --git a/src/vitable_connect/types/sex.py b/src/vitable_connect/types/sex.py
deleted file mode 100644
index 7945794..0000000
--- a/src/vitable_connect/types/sex.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["Sex"]
-
-Sex: TypeAlias = Literal["Male", "Female", "Other", "Unknown"]
diff --git a/tests/api_resources/benefit_products/__init__.py b/tests/api_resources/benefit_products/__init__.py
deleted file mode 100644
index fd8019a..0000000
--- a/tests/api_resources/benefit_products/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
diff --git a/tests/api_resources/benefit_products/test_plan_years.py b/tests/api_resources/benefit_products/test_plan_years.py
deleted file mode 100644
index 165ae1e..0000000
--- a/tests/api_resources/benefit_products/test_plan_years.py
+++ /dev/null
@@ -1,372 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect._utils import parse_date
-from vitable_connect.types.benefit_products import (
- PlanYearResponse,
- PlanYearListResponse,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestPlanYears:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_create(self, client: VitableConnect) -> None:
- plan_year = client.benefit_products.plan_years.create(
- benefit_product_id="bprd_abc123def456",
- contribution_classes=[
- {
- "coverage_tier": "EE",
- "employee_contribution_cents": 20000,
- "employer_contribution_cents": 45000,
- "employment": "full_time",
- },
- {
- "coverage_tier": "EF",
- "employee_contribution_cents": 50000,
- "employer_contribution_cents": 60000,
- "employment": "full_time",
- },
- ],
- coverage_end=parse_date("2026-12-31"),
- coverage_start=parse_date("2026-01-01"),
- employer_id="empr_abc123",
- open_enrollment_end=parse_date("2025-11-30"),
- open_enrollment_start=parse_date("2025-10-15"),
- )
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_create(self, client: VitableConnect) -> None:
- response = client.benefit_products.plan_years.with_raw_response.create(
- benefit_product_id="bprd_abc123def456",
- contribution_classes=[
- {
- "coverage_tier": "EE",
- "employee_contribution_cents": 20000,
- "employer_contribution_cents": 45000,
- "employment": "full_time",
- },
- {
- "coverage_tier": "EF",
- "employee_contribution_cents": 50000,
- "employer_contribution_cents": 60000,
- "employment": "full_time",
- },
- ],
- coverage_end=parse_date("2026-12-31"),
- coverage_start=parse_date("2026-01-01"),
- employer_id="empr_abc123",
- open_enrollment_end=parse_date("2025-11-30"),
- open_enrollment_start=parse_date("2025-10-15"),
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- plan_year = response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_create(self, client: VitableConnect) -> None:
- with client.benefit_products.plan_years.with_streaming_response.create(
- benefit_product_id="bprd_abc123def456",
- contribution_classes=[
- {
- "coverage_tier": "EE",
- "employee_contribution_cents": 20000,
- "employer_contribution_cents": 45000,
- "employment": "full_time",
- },
- {
- "coverage_tier": "EF",
- "employee_contribution_cents": 50000,
- "employer_contribution_cents": 60000,
- "employment": "full_time",
- },
- ],
- coverage_end=parse_date("2026-12-31"),
- coverage_start=parse_date("2026-01-01"),
- employer_id="empr_abc123",
- open_enrollment_end=parse_date("2025-11-30"),
- open_enrollment_start=parse_date("2025-10-15"),
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- plan_year = response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_create(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `benefit_product_id` but received ''"):
- client.benefit_products.plan_years.with_raw_response.create(
- benefit_product_id="",
- contribution_classes=[
- {
- "coverage_tier": "EE",
- "employee_contribution_cents": 20000,
- "employer_contribution_cents": 45000,
- "employment": "full_time",
- },
- {
- "coverage_tier": "EF",
- "employee_contribution_cents": 50000,
- "employer_contribution_cents": 60000,
- "employment": "full_time",
- },
- ],
- coverage_end=parse_date("2026-12-31"),
- coverage_start=parse_date("2026-01-01"),
- employer_id="empr_abc123",
- open_enrollment_end=parse_date("2025-11-30"),
- open_enrollment_start=parse_date("2025-10-15"),
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: VitableConnect) -> None:
- plan_year = client.benefit_products.plan_years.list(
- benefit_product_id="bprd_abc123def456",
- )
- assert_matches_type(PlanYearListResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: VitableConnect) -> None:
- plan_year = client.benefit_products.plan_years.list(
- benefit_product_id="bprd_abc123def456",
- employer_id="empr_abc123def456",
- limit=20,
- page=1,
- status="draft",
- )
- assert_matches_type(PlanYearListResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: VitableConnect) -> None:
- response = client.benefit_products.plan_years.with_raw_response.list(
- benefit_product_id="bprd_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- plan_year = response.parse()
- assert_matches_type(PlanYearListResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: VitableConnect) -> None:
- with client.benefit_products.plan_years.with_streaming_response.list(
- benefit_product_id="bprd_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- plan_year = response.parse()
- assert_matches_type(PlanYearListResponse, plan_year, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_list(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `benefit_product_id` but received ''"):
- client.benefit_products.plan_years.with_raw_response.list(
- benefit_product_id="",
- )
-
-
-class TestAsyncPlanYears:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_create(self, async_client: AsyncVitableConnect) -> None:
- plan_year = await async_client.benefit_products.plan_years.create(
- benefit_product_id="bprd_abc123def456",
- contribution_classes=[
- {
- "coverage_tier": "EE",
- "employee_contribution_cents": 20000,
- "employer_contribution_cents": 45000,
- "employment": "full_time",
- },
- {
- "coverage_tier": "EF",
- "employee_contribution_cents": 50000,
- "employer_contribution_cents": 60000,
- "employment": "full_time",
- },
- ],
- coverage_end=parse_date("2026-12-31"),
- coverage_start=parse_date("2026-01-01"),
- employer_id="empr_abc123",
- open_enrollment_end=parse_date("2025-11-30"),
- open_enrollment_start=parse_date("2025-10-15"),
- )
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_create(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.benefit_products.plan_years.with_raw_response.create(
- benefit_product_id="bprd_abc123def456",
- contribution_classes=[
- {
- "coverage_tier": "EE",
- "employee_contribution_cents": 20000,
- "employer_contribution_cents": 45000,
- "employment": "full_time",
- },
- {
- "coverage_tier": "EF",
- "employee_contribution_cents": 50000,
- "employer_contribution_cents": 60000,
- "employment": "full_time",
- },
- ],
- coverage_end=parse_date("2026-12-31"),
- coverage_start=parse_date("2026-01-01"),
- employer_id="empr_abc123",
- open_enrollment_end=parse_date("2025-11-30"),
- open_enrollment_start=parse_date("2025-10-15"),
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- plan_year = await response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_create(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.benefit_products.plan_years.with_streaming_response.create(
- benefit_product_id="bprd_abc123def456",
- contribution_classes=[
- {
- "coverage_tier": "EE",
- "employee_contribution_cents": 20000,
- "employer_contribution_cents": 45000,
- "employment": "full_time",
- },
- {
- "coverage_tier": "EF",
- "employee_contribution_cents": 50000,
- "employer_contribution_cents": 60000,
- "employment": "full_time",
- },
- ],
- coverage_end=parse_date("2026-12-31"),
- coverage_start=parse_date("2026-01-01"),
- employer_id="empr_abc123",
- open_enrollment_end=parse_date("2025-11-30"),
- open_enrollment_start=parse_date("2025-10-15"),
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- plan_year = await response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_create(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `benefit_product_id` but received ''"):
- await async_client.benefit_products.plan_years.with_raw_response.create(
- benefit_product_id="",
- contribution_classes=[
- {
- "coverage_tier": "EE",
- "employee_contribution_cents": 20000,
- "employer_contribution_cents": 45000,
- "employment": "full_time",
- },
- {
- "coverage_tier": "EF",
- "employee_contribution_cents": 50000,
- "employer_contribution_cents": 60000,
- "employment": "full_time",
- },
- ],
- coverage_end=parse_date("2026-12-31"),
- coverage_start=parse_date("2026-01-01"),
- employer_id="empr_abc123",
- open_enrollment_end=parse_date("2025-11-30"),
- open_enrollment_start=parse_date("2025-10-15"),
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
- plan_year = await async_client.benefit_products.plan_years.list(
- benefit_product_id="bprd_abc123def456",
- )
- assert_matches_type(PlanYearListResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- plan_year = await async_client.benefit_products.plan_years.list(
- benefit_product_id="bprd_abc123def456",
- employer_id="empr_abc123def456",
- limit=20,
- page=1,
- status="draft",
- )
- assert_matches_type(PlanYearListResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_list(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.benefit_products.plan_years.with_raw_response.list(
- benefit_product_id="bprd_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- plan_year = await response.parse()
- assert_matches_type(PlanYearListResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_list(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.benefit_products.plan_years.with_streaming_response.list(
- benefit_product_id="bprd_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- plan_year = await response.parse()
- assert_matches_type(PlanYearListResponse, plan_year, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_list(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `benefit_product_id` but received ''"):
- await async_client.benefit_products.plan_years.with_raw_response.list(
- benefit_product_id="",
- )
diff --git a/tests/api_resources/employees/test_enrollments.py b/tests/api_resources/employees/test_enrollments.py
index 3508773..bcfd0c5 100644
--- a/tests/api_resources/employees/test_enrollments.py
+++ b/tests/api_resources/employees/test_enrollments.py
@@ -30,11 +30,8 @@ def test_method_list(self, client: VitableConnect) -> None:
def test_method_list_with_all_params(self, client: VitableConnect) -> None:
enrollment = client.employees.enrollments.list(
employee_id="empl_abc123def456",
- coverage_effective_start_year=2025,
limit=20,
page=1,
- plan_year=2025,
- status="pending",
)
assert_matches_type(EnrollmentList, enrollment, path=["response"])
@@ -72,96 +69,6 @@ def test_path_params_list(self, client: VitableConnect) -> None:
employee_id="",
)
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_submit_elections(self, client: VitableConnect) -> None:
- enrollment = client.employees.enrollments.submit_elections(
- employee_id="empl_abc123def456",
- elections=[
- {
- "coverage_tier": "EF",
- "decision": "Enrolled",
- "enrollment_id": "enrl_pending123abc",
- },
- {
- "coverage_tier": "Unspecified",
- "decision": "Waived",
- "enrollment_id": "enrl_pending456def",
- },
- ],
- )
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_submit_elections(self, client: VitableConnect) -> None:
- response = client.employees.enrollments.with_raw_response.submit_elections(
- employee_id="empl_abc123def456",
- elections=[
- {
- "coverage_tier": "EF",
- "decision": "Enrolled",
- "enrollment_id": "enrl_pending123abc",
- },
- {
- "coverage_tier": "Unspecified",
- "decision": "Waived",
- "enrollment_id": "enrl_pending456def",
- },
- ],
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- enrollment = response.parse()
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_submit_elections(self, client: VitableConnect) -> None:
- with client.employees.enrollments.with_streaming_response.submit_elections(
- employee_id="empl_abc123def456",
- elections=[
- {
- "coverage_tier": "EF",
- "decision": "Enrolled",
- "enrollment_id": "enrl_pending123abc",
- },
- {
- "coverage_tier": "Unspecified",
- "decision": "Waived",
- "enrollment_id": "enrl_pending456def",
- },
- ],
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- enrollment = response.parse()
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_submit_elections(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employee_id` but received ''"):
- client.employees.enrollments.with_raw_response.submit_elections(
- employee_id="",
- elections=[
- {
- "coverage_tier": "EF",
- "decision": "Enrolled",
- "enrollment_id": "enrl_pending123abc",
- },
- {
- "coverage_tier": "Unspecified",
- "decision": "Waived",
- "enrollment_id": "enrl_pending456def",
- },
- ],
- )
-
class TestAsyncEnrollments:
parametrize = pytest.mark.parametrize(
@@ -181,11 +88,8 @@ async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
async def test_method_list_with_all_params(self, async_client: AsyncVitableConnect) -> None:
enrollment = await async_client.employees.enrollments.list(
employee_id="empl_abc123def456",
- coverage_effective_start_year=2025,
limit=20,
page=1,
- plan_year=2025,
- status="pending",
)
assert_matches_type(EnrollmentList, enrollment, path=["response"])
@@ -222,93 +126,3 @@ async def test_path_params_list(self, async_client: AsyncVitableConnect) -> None
await async_client.employees.enrollments.with_raw_response.list(
employee_id="",
)
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_submit_elections(self, async_client: AsyncVitableConnect) -> None:
- enrollment = await async_client.employees.enrollments.submit_elections(
- employee_id="empl_abc123def456",
- elections=[
- {
- "coverage_tier": "EF",
- "decision": "Enrolled",
- "enrollment_id": "enrl_pending123abc",
- },
- {
- "coverage_tier": "Unspecified",
- "decision": "Waived",
- "enrollment_id": "enrl_pending456def",
- },
- ],
- )
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_submit_elections(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.employees.enrollments.with_raw_response.submit_elections(
- employee_id="empl_abc123def456",
- elections=[
- {
- "coverage_tier": "EF",
- "decision": "Enrolled",
- "enrollment_id": "enrl_pending123abc",
- },
- {
- "coverage_tier": "Unspecified",
- "decision": "Waived",
- "enrollment_id": "enrl_pending456def",
- },
- ],
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- enrollment = await response.parse()
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_submit_elections(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.employees.enrollments.with_streaming_response.submit_elections(
- employee_id="empl_abc123def456",
- elections=[
- {
- "coverage_tier": "EF",
- "decision": "Enrolled",
- "enrollment_id": "enrl_pending123abc",
- },
- {
- "coverage_tier": "Unspecified",
- "decision": "Waived",
- "enrollment_id": "enrl_pending456def",
- },
- ],
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- enrollment = await response.parse()
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_submit_elections(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employee_id` but received ''"):
- await async_client.employees.enrollments.with_raw_response.submit_elections(
- employee_id="",
- elections=[
- {
- "coverage_tier": "EF",
- "decision": "Enrolled",
- "enrollment_id": "enrl_pending123abc",
- },
- {
- "coverage_tier": "Unspecified",
- "decision": "Waived",
- "enrollment_id": "enrl_pending456def",
- },
- ],
- )
diff --git a/tests/api_resources/employers/test_employees.py b/tests/api_resources/employers/test_employees.py
index dd4349c..1f0b25c 100644
--- a/tests/api_resources/employers/test_employees.py
+++ b/tests/api_resources/employers/test_employees.py
@@ -9,8 +9,6 @@
from tests.utils import assert_matches_type
from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types import EmployeeResponse
-from vitable_connect._utils import parse_date
from vitable_connect.types.employers import EmployeeListResponse
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -19,103 +17,6 @@
class TestEmployees:
parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_create(self, client: VitableConnect) -> None:
- employee = client.employers.employees.create(
- employer_id="empr_abc123def456",
- date_of_birth=parse_date("1992-08-25"),
- email="michael.johnson@example.com",
- first_name="Michael",
- last_name="Johnson",
- sex="Male",
- ssn="123-45-6789",
- start_date=parse_date("2024-12-01"),
- )
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_create_with_all_params(self, client: VitableConnect) -> None:
- employee = client.employers.employees.create(
- employer_id="empr_abc123def456",
- date_of_birth=parse_date("1992-08-25"),
- email="michael.johnson@example.com",
- first_name="Michael",
- last_name="Johnson",
- sex="Male",
- ssn="123-45-6789",
- start_date=parse_date("2024-12-01"),
- address={
- "city": "Austin",
- "state": "TX",
- "street_1": "789 Pine Street",
- "zip_code": "78701",
- "country": "US",
- "street_2": "street_2",
- },
- employee_class="Full Time",
- gender="gender",
- phone="+1-555-222-3333",
- suffix="suffix",
- )
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_create(self, client: VitableConnect) -> None:
- response = client.employers.employees.with_raw_response.create(
- employer_id="empr_abc123def456",
- date_of_birth=parse_date("1992-08-25"),
- email="michael.johnson@example.com",
- first_name="Michael",
- last_name="Johnson",
- sex="Male",
- ssn="123-45-6789",
- start_date=parse_date("2024-12-01"),
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- employee = response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_create(self, client: VitableConnect) -> None:
- with client.employers.employees.with_streaming_response.create(
- employer_id="empr_abc123def456",
- date_of_birth=parse_date("1992-08-25"),
- email="michael.johnson@example.com",
- first_name="Michael",
- last_name="Johnson",
- sex="Male",
- ssn="123-45-6789",
- start_date=parse_date("2024-12-01"),
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- employee = response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_create(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
- client.employers.employees.with_raw_response.create(
- employer_id="",
- date_of_birth=parse_date("1992-08-25"),
- email="michael.johnson@example.com",
- first_name="Michael",
- last_name="Johnson",
- sex="Male",
- ssn="123-45-6789",
- start_date=parse_date("2024-12-01"),
- )
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_method_list(self, client: VitableConnect) -> None:
@@ -129,8 +30,6 @@ def test_method_list(self, client: VitableConnect) -> None:
def test_method_list_with_all_params(self, client: VitableConnect) -> None:
employee = client.employers.employees.list(
employer_id="empr_abc123def456",
- active_in=True,
- employee_class="Full Time",
limit=20,
page=1,
)
@@ -176,103 +75,6 @@ class TestAsyncEmployees:
"async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
)
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_create(self, async_client: AsyncVitableConnect) -> None:
- employee = await async_client.employers.employees.create(
- employer_id="empr_abc123def456",
- date_of_birth=parse_date("1992-08-25"),
- email="michael.johnson@example.com",
- first_name="Michael",
- last_name="Johnson",
- sex="Male",
- ssn="123-45-6789",
- start_date=parse_date("2024-12-01"),
- )
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_create_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- employee = await async_client.employers.employees.create(
- employer_id="empr_abc123def456",
- date_of_birth=parse_date("1992-08-25"),
- email="michael.johnson@example.com",
- first_name="Michael",
- last_name="Johnson",
- sex="Male",
- ssn="123-45-6789",
- start_date=parse_date("2024-12-01"),
- address={
- "city": "Austin",
- "state": "TX",
- "street_1": "789 Pine Street",
- "zip_code": "78701",
- "country": "US",
- "street_2": "street_2",
- },
- employee_class="Full Time",
- gender="gender",
- phone="+1-555-222-3333",
- suffix="suffix",
- )
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_create(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.employers.employees.with_raw_response.create(
- employer_id="empr_abc123def456",
- date_of_birth=parse_date("1992-08-25"),
- email="michael.johnson@example.com",
- first_name="Michael",
- last_name="Johnson",
- sex="Male",
- ssn="123-45-6789",
- start_date=parse_date("2024-12-01"),
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- employee = await response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_create(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.employers.employees.with_streaming_response.create(
- employer_id="empr_abc123def456",
- date_of_birth=parse_date("1992-08-25"),
- email="michael.johnson@example.com",
- first_name="Michael",
- last_name="Johnson",
- sex="Male",
- ssn="123-45-6789",
- start_date=parse_date("2024-12-01"),
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- employee = await response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_create(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
- await async_client.employers.employees.with_raw_response.create(
- employer_id="",
- date_of_birth=parse_date("1992-08-25"),
- email="michael.johnson@example.com",
- first_name="Michael",
- last_name="Johnson",
- sex="Male",
- ssn="123-45-6789",
- start_date=parse_date("2024-12-01"),
- )
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
@@ -286,8 +88,6 @@ async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
async def test_method_list_with_all_params(self, async_client: AsyncVitableConnect) -> None:
employee = await async_client.employers.employees.list(
employer_id="empr_abc123def456",
- active_in=True,
- employee_class="Full Time",
limit=20,
page=1,
)
diff --git a/tests/api_resources/members/__init__.py b/tests/api_resources/members/__init__.py
deleted file mode 100644
index fd8019a..0000000
--- a/tests/api_resources/members/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
diff --git a/tests/api_resources/members/test_dependents.py b/tests/api_resources/members/test_dependents.py
deleted file mode 100644
index 0ea5bf4..0000000
--- a/tests/api_resources/members/test_dependents.py
+++ /dev/null
@@ -1,290 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types import DependentResponse
-from vitable_connect._utils import parse_date
-from vitable_connect.types.members import DependentListResponse
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestDependents:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_create(self, client: VitableConnect) -> None:
- dependent = client.members.dependents.create(
- member_id="mbr_abc123def456",
- date_of_birth=parse_date("2020-05-15"),
- first_name="Emily",
- last_name="Doe",
- relationship="Child",
- sex="Female",
- )
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_create_with_all_params(self, client: VitableConnect) -> None:
- dependent = client.members.dependents.create(
- member_id="mbr_abc123def456",
- date_of_birth=parse_date("2020-05-15"),
- first_name="Emily",
- last_name="Doe",
- relationship="Child",
- sex="Female",
- gender="gender",
- ssn="123-45-6789",
- suffix="suffix",
- )
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_create(self, client: VitableConnect) -> None:
- response = client.members.dependents.with_raw_response.create(
- member_id="mbr_abc123def456",
- date_of_birth=parse_date("2020-05-15"),
- first_name="Emily",
- last_name="Doe",
- relationship="Child",
- sex="Female",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- dependent = response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_create(self, client: VitableConnect) -> None:
- with client.members.dependents.with_streaming_response.create(
- member_id="mbr_abc123def456",
- date_of_birth=parse_date("2020-05-15"),
- first_name="Emily",
- last_name="Doe",
- relationship="Child",
- sex="Female",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- dependent = response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_create(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
- client.members.dependents.with_raw_response.create(
- member_id="",
- date_of_birth=parse_date("2020-05-15"),
- first_name="Emily",
- last_name="Doe",
- relationship="Child",
- sex="Female",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: VitableConnect) -> None:
- dependent = client.members.dependents.list(
- member_id="mbr_abc123def456",
- )
- assert_matches_type(DependentListResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: VitableConnect) -> None:
- dependent = client.members.dependents.list(
- member_id="mbr_abc123def456",
- active_in=True,
- limit=20,
- page=1,
- relationship="Spouse",
- )
- assert_matches_type(DependentListResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: VitableConnect) -> None:
- response = client.members.dependents.with_raw_response.list(
- member_id="mbr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- dependent = response.parse()
- assert_matches_type(DependentListResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: VitableConnect) -> None:
- with client.members.dependents.with_streaming_response.list(
- member_id="mbr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- dependent = response.parse()
- assert_matches_type(DependentListResponse, dependent, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_list(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
- client.members.dependents.with_raw_response.list(
- member_id="",
- )
-
-
-class TestAsyncDependents:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_create(self, async_client: AsyncVitableConnect) -> None:
- dependent = await async_client.members.dependents.create(
- member_id="mbr_abc123def456",
- date_of_birth=parse_date("2020-05-15"),
- first_name="Emily",
- last_name="Doe",
- relationship="Child",
- sex="Female",
- )
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_create_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- dependent = await async_client.members.dependents.create(
- member_id="mbr_abc123def456",
- date_of_birth=parse_date("2020-05-15"),
- first_name="Emily",
- last_name="Doe",
- relationship="Child",
- sex="Female",
- gender="gender",
- ssn="123-45-6789",
- suffix="suffix",
- )
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_create(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.members.dependents.with_raw_response.create(
- member_id="mbr_abc123def456",
- date_of_birth=parse_date("2020-05-15"),
- first_name="Emily",
- last_name="Doe",
- relationship="Child",
- sex="Female",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- dependent = await response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_create(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.members.dependents.with_streaming_response.create(
- member_id="mbr_abc123def456",
- date_of_birth=parse_date("2020-05-15"),
- first_name="Emily",
- last_name="Doe",
- relationship="Child",
- sex="Female",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- dependent = await response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_create(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
- await async_client.members.dependents.with_raw_response.create(
- member_id="",
- date_of_birth=parse_date("2020-05-15"),
- first_name="Emily",
- last_name="Doe",
- relationship="Child",
- sex="Female",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
- dependent = await async_client.members.dependents.list(
- member_id="mbr_abc123def456",
- )
- assert_matches_type(DependentListResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- dependent = await async_client.members.dependents.list(
- member_id="mbr_abc123def456",
- active_in=True,
- limit=20,
- page=1,
- relationship="Spouse",
- )
- assert_matches_type(DependentListResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_list(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.members.dependents.with_raw_response.list(
- member_id="mbr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- dependent = await response.parse()
- assert_matches_type(DependentListResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_list(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.members.dependents.with_streaming_response.list(
- member_id="mbr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- dependent = await response.parse()
- assert_matches_type(DependentListResponse, dependent, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_list(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
- await async_client.members.dependents.with_raw_response.list(
- member_id="",
- )
diff --git a/tests/api_resources/members/test_qualifying_life_events.py b/tests/api_resources/members/test_qualifying_life_events.py
deleted file mode 100644
index 9917b00..0000000
--- a/tests/api_resources/members/test_qualifying_life_events.py
+++ /dev/null
@@ -1,362 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect._utils import parse_date
-from vitable_connect.types.members import (
- QualifyingLifeEventResponse,
- QualifyingLifeEventListResponse,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestQualifyingLifeEvents:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve(self, client: VitableConnect) -> None:
- qualifying_life_event = client.members.qualifying_life_events.retrieve(
- qle_id="qle_abc123def456",
- member_id="mbr_abc123def456",
- )
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve(self, client: VitableConnect) -> None:
- response = client.members.qualifying_life_events.with_raw_response.retrieve(
- qle_id="qle_abc123def456",
- member_id="mbr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- qualifying_life_event = response.parse()
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve(self, client: VitableConnect) -> None:
- with client.members.qualifying_life_events.with_streaming_response.retrieve(
- qle_id="qle_abc123def456",
- member_id="mbr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- qualifying_life_event = response.parse()
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_retrieve(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
- client.members.qualifying_life_events.with_raw_response.retrieve(
- qle_id="qle_abc123def456",
- member_id="",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `qle_id` but received ''"):
- client.members.qualifying_life_events.with_raw_response.retrieve(
- qle_id="",
- member_id="mbr_abc123def456",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: VitableConnect) -> None:
- qualifying_life_event = client.members.qualifying_life_events.list(
- member_id="mbr_abc123def456",
- )
- assert_matches_type(QualifyingLifeEventListResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: VitableConnect) -> None:
- qualifying_life_event = client.members.qualifying_life_events.list(
- member_id="mbr_abc123def456",
- event_type="Marriage",
- limit=20,
- page=1,
- status="pending",
- )
- assert_matches_type(QualifyingLifeEventListResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: VitableConnect) -> None:
- response = client.members.qualifying_life_events.with_raw_response.list(
- member_id="mbr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- qualifying_life_event = response.parse()
- assert_matches_type(QualifyingLifeEventListResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: VitableConnect) -> None:
- with client.members.qualifying_life_events.with_streaming_response.list(
- member_id="mbr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- qualifying_life_event = response.parse()
- assert_matches_type(QualifyingLifeEventListResponse, qualifying_life_event, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_list(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
- client.members.qualifying_life_events.with_raw_response.list(
- member_id="",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_record(self, client: VitableConnect) -> None:
- qualifying_life_event = client.members.qualifying_life_events.record(
- member_id="mbr_abc123def456",
- event_date=parse_date("2024-11-15"),
- event_type="Marriage",
- )
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_record_with_all_params(self, client: VitableConnect) -> None:
- qualifying_life_event = client.members.qualifying_life_events.record(
- member_id="mbr_abc123def456",
- event_date=parse_date("2024-11-15"),
- event_type="Marriage",
- notes="Employee got married, adding spouse to coverage",
- )
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_record(self, client: VitableConnect) -> None:
- response = client.members.qualifying_life_events.with_raw_response.record(
- member_id="mbr_abc123def456",
- event_date=parse_date("2024-11-15"),
- event_type="Marriage",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- qualifying_life_event = response.parse()
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_record(self, client: VitableConnect) -> None:
- with client.members.qualifying_life_events.with_streaming_response.record(
- member_id="mbr_abc123def456",
- event_date=parse_date("2024-11-15"),
- event_type="Marriage",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- qualifying_life_event = response.parse()
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_record(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
- client.members.qualifying_life_events.with_raw_response.record(
- member_id="",
- event_date=parse_date("2024-11-15"),
- event_type="Marriage",
- )
-
-
-class TestAsyncQualifyingLifeEvents:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_retrieve(self, async_client: AsyncVitableConnect) -> None:
- qualifying_life_event = await async_client.members.qualifying_life_events.retrieve(
- qle_id="qle_abc123def456",
- member_id="mbr_abc123def456",
- )
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_retrieve(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.members.qualifying_life_events.with_raw_response.retrieve(
- qle_id="qle_abc123def456",
- member_id="mbr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- qualifying_life_event = await response.parse()
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_retrieve(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.members.qualifying_life_events.with_streaming_response.retrieve(
- qle_id="qle_abc123def456",
- member_id="mbr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- qualifying_life_event = await response.parse()
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_retrieve(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
- await async_client.members.qualifying_life_events.with_raw_response.retrieve(
- qle_id="qle_abc123def456",
- member_id="",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `qle_id` but received ''"):
- await async_client.members.qualifying_life_events.with_raw_response.retrieve(
- qle_id="",
- member_id="mbr_abc123def456",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
- qualifying_life_event = await async_client.members.qualifying_life_events.list(
- member_id="mbr_abc123def456",
- )
- assert_matches_type(QualifyingLifeEventListResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- qualifying_life_event = await async_client.members.qualifying_life_events.list(
- member_id="mbr_abc123def456",
- event_type="Marriage",
- limit=20,
- page=1,
- status="pending",
- )
- assert_matches_type(QualifyingLifeEventListResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_list(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.members.qualifying_life_events.with_raw_response.list(
- member_id="mbr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- qualifying_life_event = await response.parse()
- assert_matches_type(QualifyingLifeEventListResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_list(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.members.qualifying_life_events.with_streaming_response.list(
- member_id="mbr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- qualifying_life_event = await response.parse()
- assert_matches_type(QualifyingLifeEventListResponse, qualifying_life_event, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_list(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
- await async_client.members.qualifying_life_events.with_raw_response.list(
- member_id="",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_record(self, async_client: AsyncVitableConnect) -> None:
- qualifying_life_event = await async_client.members.qualifying_life_events.record(
- member_id="mbr_abc123def456",
- event_date=parse_date("2024-11-15"),
- event_type="Marriage",
- )
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_record_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- qualifying_life_event = await async_client.members.qualifying_life_events.record(
- member_id="mbr_abc123def456",
- event_date=parse_date("2024-11-15"),
- event_type="Marriage",
- notes="Employee got married, adding spouse to coverage",
- )
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_record(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.members.qualifying_life_events.with_raw_response.record(
- member_id="mbr_abc123def456",
- event_date=parse_date("2024-11-15"),
- event_type="Marriage",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- qualifying_life_event = await response.parse()
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_record(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.members.qualifying_life_events.with_streaming_response.record(
- member_id="mbr_abc123def456",
- event_date=parse_date("2024-11-15"),
- event_type="Marriage",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- qualifying_life_event = await response.parse()
- assert_matches_type(QualifyingLifeEventResponse, qualifying_life_event, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_record(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
- await async_client.members.qualifying_life_events.with_raw_response.record(
- member_id="",
- event_date=parse_date("2024-11-15"),
- event_type="Marriage",
- )
diff --git a/tests/api_resources/test_benefit_products.py b/tests/api_resources/test_benefit_products.py
deleted file mode 100644
index 9d2aff4..0000000
--- a/tests/api_resources/test_benefit_products.py
+++ /dev/null
@@ -1,104 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types import BenefitProductListResponse
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestBenefitProducts:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: VitableConnect) -> None:
- benefit_product = client.benefit_products.list()
- assert_matches_type(BenefitProductListResponse, benefit_product, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: VitableConnect) -> None:
- benefit_product = client.benefit_products.list(
- active_in=True,
- category="Medical",
- limit=20,
- page=1,
- product_code="EBA",
- )
- assert_matches_type(BenefitProductListResponse, benefit_product, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: VitableConnect) -> None:
- response = client.benefit_products.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- benefit_product = response.parse()
- assert_matches_type(BenefitProductListResponse, benefit_product, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: VitableConnect) -> None:
- with client.benefit_products.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- benefit_product = response.parse()
- assert_matches_type(BenefitProductListResponse, benefit_product, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
-
-class TestAsyncBenefitProducts:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
- benefit_product = await async_client.benefit_products.list()
- assert_matches_type(BenefitProductListResponse, benefit_product, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- benefit_product = await async_client.benefit_products.list(
- active_in=True,
- category="Medical",
- limit=20,
- page=1,
- product_code="EBA",
- )
- assert_matches_type(BenefitProductListResponse, benefit_product, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_list(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.benefit_products.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- benefit_product = await response.parse()
- assert_matches_type(BenefitProductListResponse, benefit_product, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_list(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.benefit_products.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- benefit_product = await response.parse()
- assert_matches_type(BenefitProductListResponse, benefit_product, path=["response"])
-
- assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_dependents.py b/tests/api_resources/test_dependents.py
deleted file mode 100644
index d573545..0000000
--- a/tests/api_resources/test_dependents.py
+++ /dev/null
@@ -1,214 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types import DependentResponse
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestDependents:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve(self, client: VitableConnect) -> None:
- dependent = client.dependents.retrieve(
- "dpnd_abc123def456",
- )
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve(self, client: VitableConnect) -> None:
- response = client.dependents.with_raw_response.retrieve(
- "dpnd_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- dependent = response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve(self, client: VitableConnect) -> None:
- with client.dependents.with_streaming_response.retrieve(
- "dpnd_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- dependent = response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_retrieve(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `dependent_id` but received ''"):
- client.dependents.with_raw_response.retrieve(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update(self, client: VitableConnect) -> None:
- dependent = client.dependents.update(
- dependent_id="dpnd_abc123def456",
- )
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update_with_all_params(self, client: VitableConnect) -> None:
- dependent = client.dependents.update(
- dependent_id="dpnd_abc123def456",
- active=True,
- gender="gender",
- relationship="Spouse",
- )
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_update(self, client: VitableConnect) -> None:
- response = client.dependents.with_raw_response.update(
- dependent_id="dpnd_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- dependent = response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_update(self, client: VitableConnect) -> None:
- with client.dependents.with_streaming_response.update(
- dependent_id="dpnd_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- dependent = response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_update(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `dependent_id` but received ''"):
- client.dependents.with_raw_response.update(
- dependent_id="",
- )
-
-
-class TestAsyncDependents:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_retrieve(self, async_client: AsyncVitableConnect) -> None:
- dependent = await async_client.dependents.retrieve(
- "dpnd_abc123def456",
- )
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_retrieve(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.dependents.with_raw_response.retrieve(
- "dpnd_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- dependent = await response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_retrieve(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.dependents.with_streaming_response.retrieve(
- "dpnd_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- dependent = await response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_retrieve(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `dependent_id` but received ''"):
- await async_client.dependents.with_raw_response.retrieve(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update(self, async_client: AsyncVitableConnect) -> None:
- dependent = await async_client.dependents.update(
- dependent_id="dpnd_abc123def456",
- )
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- dependent = await async_client.dependents.update(
- dependent_id="dpnd_abc123def456",
- active=True,
- gender="gender",
- relationship="Spouse",
- )
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_update(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.dependents.with_raw_response.update(
- dependent_id="dpnd_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- dependent = await response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_update(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.dependents.with_streaming_response.update(
- dependent_id="dpnd_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- dependent = await response.parse()
- assert_matches_type(DependentResponse, dependent, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_update(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `dependent_id` but received ''"):
- await async_client.dependents.with_raw_response.update(
- dependent_id="",
- )
diff --git a/tests/api_resources/test_employees.py b/tests/api_resources/test_employees.py
index df5fe1e..d44932d 100644
--- a/tests/api_resources/test_employees.py
+++ b/tests/api_resources/test_employees.py
@@ -10,7 +10,6 @@
from tests.utils import assert_matches_type
from vitable_connect import VitableConnect, AsyncVitableConnect
from vitable_connect.types import EmployeeResponse
-from vitable_connect._utils import parse_date
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -60,111 +59,6 @@ def test_path_params_retrieve(self, client: VitableConnect) -> None:
"",
)
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update(self, client: VitableConnect) -> None:
- employee = client.employees.update(
- employee_id="empl_abc123def456",
- )
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update_with_all_params(self, client: VitableConnect) -> None:
- employee = client.employees.update(
- employee_id="empl_abc123def456",
- address={
- "city": "Los Angeles",
- "state": "CA",
- "street_1": "123 New Street",
- "zip_code": "90001",
- "country": "US",
- "street_2": "street_2",
- },
- email="john.doe.updated@example.com",
- employee_class="Part Time",
- gender="gender",
- phone="+1-555-999-8888",
- termination_date=parse_date("2019-12-27"),
- )
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_update(self, client: VitableConnect) -> None:
- response = client.employees.with_raw_response.update(
- employee_id="empl_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- employee = response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_update(self, client: VitableConnect) -> None:
- with client.employees.with_streaming_response.update(
- employee_id="empl_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- employee = response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_update(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employee_id` but received ''"):
- client.employees.with_raw_response.update(
- employee_id="",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_terminate(self, client: VitableConnect) -> None:
- employee = client.employees.terminate(
- "empl_abc123def456",
- )
- assert employee is None
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_terminate(self, client: VitableConnect) -> None:
- response = client.employees.with_raw_response.terminate(
- "empl_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- employee = response.parse()
- assert employee is None
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_terminate(self, client: VitableConnect) -> None:
- with client.employees.with_streaming_response.terminate(
- "empl_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- employee = response.parse()
- assert employee is None
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_terminate(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employee_id` but received ''"):
- client.employees.with_raw_response.terminate(
- "",
- )
-
class TestAsyncEmployees:
parametrize = pytest.mark.parametrize(
@@ -212,108 +106,3 @@ async def test_path_params_retrieve(self, async_client: AsyncVitableConnect) ->
await async_client.employees.with_raw_response.retrieve(
"",
)
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update(self, async_client: AsyncVitableConnect) -> None:
- employee = await async_client.employees.update(
- employee_id="empl_abc123def456",
- )
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- employee = await async_client.employees.update(
- employee_id="empl_abc123def456",
- address={
- "city": "Los Angeles",
- "state": "CA",
- "street_1": "123 New Street",
- "zip_code": "90001",
- "country": "US",
- "street_2": "street_2",
- },
- email="john.doe.updated@example.com",
- employee_class="Part Time",
- gender="gender",
- phone="+1-555-999-8888",
- termination_date=parse_date("2019-12-27"),
- )
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_update(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.employees.with_raw_response.update(
- employee_id="empl_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- employee = await response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_update(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.employees.with_streaming_response.update(
- employee_id="empl_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- employee = await response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_update(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employee_id` but received ''"):
- await async_client.employees.with_raw_response.update(
- employee_id="",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_terminate(self, async_client: AsyncVitableConnect) -> None:
- employee = await async_client.employees.terminate(
- "empl_abc123def456",
- )
- assert employee is None
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_terminate(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.employees.with_raw_response.terminate(
- "empl_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- employee = await response.parse()
- assert employee is None
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_terminate(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.employees.with_streaming_response.terminate(
- "empl_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- employee = await response.parse()
- assert employee is None
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_terminate(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employee_id` but received ''"):
- await async_client.employees.with_raw_response.terminate(
- "",
- )
diff --git a/tests/api_resources/test_employers.py b/tests/api_resources/test_employers.py
index 8dbe731..c501c34 100644
--- a/tests/api_resources/test_employers.py
+++ b/tests/api_resources/test_employers.py
@@ -14,7 +14,6 @@
EmployerListResponse,
BenefitEligibilityPolicy,
)
-from vitable_connect._utils import parse_date
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -143,66 +142,6 @@ def test_path_params_retrieve(self, client: VitableConnect) -> None:
"",
)
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update(self, client: VitableConnect) -> None:
- employer = client.employers.update(
- employer_id="empr_abc123def456",
- )
- assert_matches_type(EmployerResponse, employer, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update_with_all_params(self, client: VitableConnect) -> None:
- employer = client.employers.update(
- employer_id="empr_abc123def456",
- active=True,
- address={
- "address_line_1": "456 New Address Ave",
- "city": "San Francisco",
- "state": "CA",
- "zipcode": "94103",
- "address_line_2": "Suite 200",
- },
- legal_name="x",
- name="Acme Corp (Updated)",
- )
- assert_matches_type(EmployerResponse, employer, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_update(self, client: VitableConnect) -> None:
- response = client.employers.with_raw_response.update(
- employer_id="empr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- employer = response.parse()
- assert_matches_type(EmployerResponse, employer, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_update(self, client: VitableConnect) -> None:
- with client.employers.with_streaming_response.update(
- employer_id="empr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- employer = response.parse()
- assert_matches_type(EmployerResponse, employer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_update(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
- client.employers.with_raw_response.update(
- employer_id="",
- )
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_method_list(self, client: VitableConnect) -> None:
@@ -213,9 +152,7 @@ def test_method_list(self, client: VitableConnect) -> None:
@parametrize
def test_method_list_with_all_params(self, client: VitableConnect) -> None:
employer = client.employers.list(
- active_in=True,
limit=20,
- name="Acme",
page=1,
)
assert_matches_type(EmployerListResponse, employer, path=["response"])
@@ -247,44 +184,8 @@ def test_streaming_response_list(self, client: VitableConnect) -> None:
def test_method_create_eligibility_policy(self, client: VitableConnect) -> None:
employer = client.employers.create_eligibility_policy(
employer_id="empr_abc123def456",
- effective_date=parse_date("2025-01-01"),
- name="Standard Full-Time Eligibility",
- rules=[
- {
- "operator": "in",
- "rule_type": "employment_status",
- "value": "full_time,part_time_30_plus",
- },
- {
- "operator": "greater_than_or_equal",
- "rule_type": "waiting_period_days",
- "value": "30",
- },
- ],
- )
- assert_matches_type(BenefitEligibilityPolicy, employer, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_create_eligibility_policy_with_all_params(self, client: VitableConnect) -> None:
- employer = client.employers.create_eligibility_policy(
- employer_id="empr_abc123def456",
- effective_date=parse_date("2025-01-01"),
- name="Standard Full-Time Eligibility",
- rules=[
- {
- "operator": "in",
- "rule_type": "employment_status",
- "value": "full_time,part_time_30_plus",
- },
- {
- "operator": "greater_than_or_equal",
- "rule_type": "waiting_period_days",
- "value": "30",
- },
- ],
- policy_to_replace_id="epol_abc123def456",
- description="Eligibility policy for full-time employees working 30+ hours per week",
+ classification="classification",
+ waiting_period="waiting_period",
)
assert_matches_type(BenefitEligibilityPolicy, employer, path=["response"])
@@ -293,20 +194,8 @@ def test_method_create_eligibility_policy_with_all_params(self, client: VitableC
def test_raw_response_create_eligibility_policy(self, client: VitableConnect) -> None:
response = client.employers.with_raw_response.create_eligibility_policy(
employer_id="empr_abc123def456",
- effective_date=parse_date("2025-01-01"),
- name="Standard Full-Time Eligibility",
- rules=[
- {
- "operator": "in",
- "rule_type": "employment_status",
- "value": "full_time,part_time_30_plus",
- },
- {
- "operator": "greater_than_or_equal",
- "rule_type": "waiting_period_days",
- "value": "30",
- },
- ],
+ classification="classification",
+ waiting_period="waiting_period",
)
assert response.is_closed is True
@@ -319,20 +208,8 @@ def test_raw_response_create_eligibility_policy(self, client: VitableConnect) ->
def test_streaming_response_create_eligibility_policy(self, client: VitableConnect) -> None:
with client.employers.with_streaming_response.create_eligibility_policy(
employer_id="empr_abc123def456",
- effective_date=parse_date("2025-01-01"),
- name="Standard Full-Time Eligibility",
- rules=[
- {
- "operator": "in",
- "rule_type": "employment_status",
- "value": "full_time,part_time_30_plus",
- },
- {
- "operator": "greater_than_or_equal",
- "rule_type": "waiting_period_days",
- "value": "30",
- },
- ],
+ classification="classification",
+ waiting_period="waiting_period",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -348,20 +225,8 @@ def test_path_params_create_eligibility_policy(self, client: VitableConnect) ->
with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
client.employers.with_raw_response.create_eligibility_policy(
employer_id="",
- effective_date=parse_date("2025-01-01"),
- name="Standard Full-Time Eligibility",
- rules=[
- {
- "operator": "in",
- "rule_type": "employment_status",
- "value": "full_time,part_time_30_plus",
- },
- {
- "operator": "greater_than_or_equal",
- "rule_type": "waiting_period_days",
- "value": "30",
- },
- ],
+ classification="classification",
+ waiting_period="waiting_period",
)
@@ -491,66 +356,6 @@ async def test_path_params_retrieve(self, async_client: AsyncVitableConnect) ->
"",
)
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update(self, async_client: AsyncVitableConnect) -> None:
- employer = await async_client.employers.update(
- employer_id="empr_abc123def456",
- )
- assert_matches_type(EmployerResponse, employer, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- employer = await async_client.employers.update(
- employer_id="empr_abc123def456",
- active=True,
- address={
- "address_line_1": "456 New Address Ave",
- "city": "San Francisco",
- "state": "CA",
- "zipcode": "94103",
- "address_line_2": "Suite 200",
- },
- legal_name="x",
- name="Acme Corp (Updated)",
- )
- assert_matches_type(EmployerResponse, employer, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_update(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.employers.with_raw_response.update(
- employer_id="empr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- employer = await response.parse()
- assert_matches_type(EmployerResponse, employer, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_update(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.employers.with_streaming_response.update(
- employer_id="empr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- employer = await response.parse()
- assert_matches_type(EmployerResponse, employer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_update(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
- await async_client.employers.with_raw_response.update(
- employer_id="",
- )
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
@@ -561,9 +366,7 @@ async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
@parametrize
async def test_method_list_with_all_params(self, async_client: AsyncVitableConnect) -> None:
employer = await async_client.employers.list(
- active_in=True,
limit=20,
- name="Acme",
page=1,
)
assert_matches_type(EmployerListResponse, employer, path=["response"])
@@ -595,44 +398,8 @@ async def test_streaming_response_list(self, async_client: AsyncVitableConnect)
async def test_method_create_eligibility_policy(self, async_client: AsyncVitableConnect) -> None:
employer = await async_client.employers.create_eligibility_policy(
employer_id="empr_abc123def456",
- effective_date=parse_date("2025-01-01"),
- name="Standard Full-Time Eligibility",
- rules=[
- {
- "operator": "in",
- "rule_type": "employment_status",
- "value": "full_time,part_time_30_plus",
- },
- {
- "operator": "greater_than_or_equal",
- "rule_type": "waiting_period_days",
- "value": "30",
- },
- ],
- )
- assert_matches_type(BenefitEligibilityPolicy, employer, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_create_eligibility_policy_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- employer = await async_client.employers.create_eligibility_policy(
- employer_id="empr_abc123def456",
- effective_date=parse_date("2025-01-01"),
- name="Standard Full-Time Eligibility",
- rules=[
- {
- "operator": "in",
- "rule_type": "employment_status",
- "value": "full_time,part_time_30_plus",
- },
- {
- "operator": "greater_than_or_equal",
- "rule_type": "waiting_period_days",
- "value": "30",
- },
- ],
- policy_to_replace_id="epol_abc123def456",
- description="Eligibility policy for full-time employees working 30+ hours per week",
+ classification="classification",
+ waiting_period="waiting_period",
)
assert_matches_type(BenefitEligibilityPolicy, employer, path=["response"])
@@ -641,20 +408,8 @@ async def test_method_create_eligibility_policy_with_all_params(self, async_clie
async def test_raw_response_create_eligibility_policy(self, async_client: AsyncVitableConnect) -> None:
response = await async_client.employers.with_raw_response.create_eligibility_policy(
employer_id="empr_abc123def456",
- effective_date=parse_date("2025-01-01"),
- name="Standard Full-Time Eligibility",
- rules=[
- {
- "operator": "in",
- "rule_type": "employment_status",
- "value": "full_time,part_time_30_plus",
- },
- {
- "operator": "greater_than_or_equal",
- "rule_type": "waiting_period_days",
- "value": "30",
- },
- ],
+ classification="classification",
+ waiting_period="waiting_period",
)
assert response.is_closed is True
@@ -667,20 +422,8 @@ async def test_raw_response_create_eligibility_policy(self, async_client: AsyncV
async def test_streaming_response_create_eligibility_policy(self, async_client: AsyncVitableConnect) -> None:
async with async_client.employers.with_streaming_response.create_eligibility_policy(
employer_id="empr_abc123def456",
- effective_date=parse_date("2025-01-01"),
- name="Standard Full-Time Eligibility",
- rules=[
- {
- "operator": "in",
- "rule_type": "employment_status",
- "value": "full_time,part_time_30_plus",
- },
- {
- "operator": "greater_than_or_equal",
- "rule_type": "waiting_period_days",
- "value": "30",
- },
- ],
+ classification="classification",
+ waiting_period="waiting_period",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -696,18 +439,6 @@ async def test_path_params_create_eligibility_policy(self, async_client: AsyncVi
with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
await async_client.employers.with_raw_response.create_eligibility_policy(
employer_id="",
- effective_date=parse_date("2025-01-01"),
- name="Standard Full-Time Eligibility",
- rules=[
- {
- "operator": "in",
- "rule_type": "employment_status",
- "value": "full_time,part_time_30_plus",
- },
- {
- "operator": "greater_than_or_equal",
- "rule_type": "waiting_period_days",
- "value": "30",
- },
- ],
+ classification="classification",
+ waiting_period="waiting_period",
)
diff --git a/tests/api_resources/test_enrollments.py b/tests/api_resources/test_enrollments.py
index ba4eac6..06a7c57 100644
--- a/tests/api_resources/test_enrollments.py
+++ b/tests/api_resources/test_enrollments.py
@@ -9,7 +9,7 @@
from tests.utils import assert_matches_type
from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types import EnrollmentResponse, EnrollmentListPlansResponse
+from vitable_connect.types import EnrollmentResponse
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -59,104 +59,6 @@ def test_path_params_retrieve(self, client: VitableConnect) -> None:
"",
)
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_plans(self, client: VitableConnect) -> None:
- enrollment = client.enrollments.list_plans(
- "enrl_abc123def456",
- )
- assert_matches_type(EnrollmentListPlansResponse, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list_plans(self, client: VitableConnect) -> None:
- response = client.enrollments.with_raw_response.list_plans(
- "enrl_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- enrollment = response.parse()
- assert_matches_type(EnrollmentListPlansResponse, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list_plans(self, client: VitableConnect) -> None:
- with client.enrollments.with_streaming_response.list_plans(
- "enrl_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- enrollment = response.parse()
- assert_matches_type(EnrollmentListPlansResponse, enrollment, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_list_plans(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `enrollment_id` but received ''"):
- client.enrollments.with_raw_response.list_plans(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_reissue(self, client: VitableConnect) -> None:
- enrollment = client.enrollments.reissue(
- enrollment_id="enrl_abc123def456",
- qle_id="qle_marriage123abc",
- )
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_reissue_with_all_params(self, client: VitableConnect) -> None:
- enrollment = client.enrollments.reissue(
- enrollment_id="enrl_abc123def456",
- qle_id="qle_marriage123abc",
- reason="reason",
- )
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_reissue(self, client: VitableConnect) -> None:
- response = client.enrollments.with_raw_response.reissue(
- enrollment_id="enrl_abc123def456",
- qle_id="qle_marriage123abc",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- enrollment = response.parse()
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_reissue(self, client: VitableConnect) -> None:
- with client.enrollments.with_streaming_response.reissue(
- enrollment_id="enrl_abc123def456",
- qle_id="qle_marriage123abc",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- enrollment = response.parse()
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_reissue(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `enrollment_id` but received ''"):
- client.enrollments.with_raw_response.reissue(
- enrollment_id="",
- qle_id="qle_marriage123abc",
- )
-
class TestAsyncEnrollments:
parametrize = pytest.mark.parametrize(
@@ -204,101 +106,3 @@ async def test_path_params_retrieve(self, async_client: AsyncVitableConnect) ->
await async_client.enrollments.with_raw_response.retrieve(
"",
)
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list_plans(self, async_client: AsyncVitableConnect) -> None:
- enrollment = await async_client.enrollments.list_plans(
- "enrl_abc123def456",
- )
- assert_matches_type(EnrollmentListPlansResponse, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_list_plans(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.enrollments.with_raw_response.list_plans(
- "enrl_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- enrollment = await response.parse()
- assert_matches_type(EnrollmentListPlansResponse, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_list_plans(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.enrollments.with_streaming_response.list_plans(
- "enrl_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- enrollment = await response.parse()
- assert_matches_type(EnrollmentListPlansResponse, enrollment, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_list_plans(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `enrollment_id` but received ''"):
- await async_client.enrollments.with_raw_response.list_plans(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_reissue(self, async_client: AsyncVitableConnect) -> None:
- enrollment = await async_client.enrollments.reissue(
- enrollment_id="enrl_abc123def456",
- qle_id="qle_marriage123abc",
- )
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_reissue_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- enrollment = await async_client.enrollments.reissue(
- enrollment_id="enrl_abc123def456",
- qle_id="qle_marriage123abc",
- reason="reason",
- )
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_reissue(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.enrollments.with_raw_response.reissue(
- enrollment_id="enrl_abc123def456",
- qle_id="qle_marriage123abc",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- enrollment = await response.parse()
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_reissue(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.enrollments.with_streaming_response.reissue(
- enrollment_id="enrl_abc123def456",
- qle_id="qle_marriage123abc",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- enrollment = await response.parse()
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_reissue(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `enrollment_id` but received ''"):
- await async_client.enrollments.with_raw_response.reissue(
- enrollment_id="",
- qle_id="qle_marriage123abc",
- )
diff --git a/tests/api_resources/test_plan_years.py b/tests/api_resources/test_plan_years.py
deleted file mode 100644
index f68c79b..0000000
--- a/tests/api_resources/test_plan_years.py
+++ /dev/null
@@ -1,243 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect._utils import parse_date
-from vitable_connect.types.benefit_products import PlanYearResponse
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestPlanYears:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve(self, client: VitableConnect) -> None:
- plan_year = client.plan_years.retrieve(
- "plyr_abc123def456",
- )
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve(self, client: VitableConnect) -> None:
- response = client.plan_years.with_raw_response.retrieve(
- "plyr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- plan_year = response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve(self, client: VitableConnect) -> None:
- with client.plan_years.with_streaming_response.retrieve(
- "plyr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- plan_year = response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_retrieve(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `plan_year_id` but received ''"):
- client.plan_years.with_raw_response.retrieve(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update(self, client: VitableConnect) -> None:
- plan_year = client.plan_years.update(
- plan_year_id="plyr_abc123def456",
- )
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update_with_all_params(self, client: VitableConnect) -> None:
- plan_year = client.plan_years.update(
- plan_year_id="plyr_abc123def456",
- contribution_classes=[
- {
- "coverage_tier": "EE",
- "employee_contribution_cents": 18000,
- "employer_contribution_cents": 47000,
- "employment": "full_time",
- },
- {
- "coverage_tier": "EF",
- "employee_contribution_cents": 48000,
- "employer_contribution_cents": 62000,
- "employment": "full_time",
- },
- ],
- open_enrollment_end=parse_date("2024-11-15"),
- open_enrollment_start=parse_date("2024-10-01"),
- status="active",
- )
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_update(self, client: VitableConnect) -> None:
- response = client.plan_years.with_raw_response.update(
- plan_year_id="plyr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- plan_year = response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_update(self, client: VitableConnect) -> None:
- with client.plan_years.with_streaming_response.update(
- plan_year_id="plyr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- plan_year = response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_update(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `plan_year_id` but received ''"):
- client.plan_years.with_raw_response.update(
- plan_year_id="",
- )
-
-
-class TestAsyncPlanYears:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_retrieve(self, async_client: AsyncVitableConnect) -> None:
- plan_year = await async_client.plan_years.retrieve(
- "plyr_abc123def456",
- )
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_retrieve(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.plan_years.with_raw_response.retrieve(
- "plyr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- plan_year = await response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_retrieve(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.plan_years.with_streaming_response.retrieve(
- "plyr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- plan_year = await response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_retrieve(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `plan_year_id` but received ''"):
- await async_client.plan_years.with_raw_response.retrieve(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update(self, async_client: AsyncVitableConnect) -> None:
- plan_year = await async_client.plan_years.update(
- plan_year_id="plyr_abc123def456",
- )
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- plan_year = await async_client.plan_years.update(
- plan_year_id="plyr_abc123def456",
- contribution_classes=[
- {
- "coverage_tier": "EE",
- "employee_contribution_cents": 18000,
- "employer_contribution_cents": 47000,
- "employment": "full_time",
- },
- {
- "coverage_tier": "EF",
- "employee_contribution_cents": 48000,
- "employer_contribution_cents": 62000,
- "employment": "full_time",
- },
- ],
- open_enrollment_end=parse_date("2024-11-15"),
- open_enrollment_start=parse_date("2024-10-01"),
- status="active",
- )
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_update(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.plan_years.with_raw_response.update(
- plan_year_id="plyr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- plan_year = await response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_update(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.plan_years.with_streaming_response.update(
- plan_year_id="plyr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- plan_year = await response.parse()
- assert_matches_type(PlanYearResponse, plan_year, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_update(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `plan_year_id` but received ''"):
- await async_client.plan_years.with_raw_response.update(
- plan_year_id="",
- )
From 81fa03e7036aeb56052384dfbd31de5f554d2d74 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 19 Mar 2026 00:06:04 +0000
Subject: [PATCH 05/14] feat(api): manual updates
---
.github/workflows/publish-pypi.yml | 29 --
.github/workflows/release-doctor.yml | 19 -
.release-please-manifest.json | 3 -
.stats.yml | 4 +-
CONTRIBUTING.md | 4 +-
README.md | 17 +-
api.md | 65 ++--
bin/check-release-environment | 17 -
bin/publish-pypi | 6 +-
pyproject.toml | 6 +-
release-please-config.json | 66 ----
src/vitable_connect/_client.py | 10 +-
src/vitable_connect/_version.py | 2 +-
src/vitable_connect/resources/auth.py | 8 +-
.../resources/benefit_eligibility_policies.py | 8 +-
src/vitable_connect/resources/employees.py | 288 ++++++++++++++
.../resources/employees/__init__.py | 33 --
.../resources/employees/employees.py | 213 -----------
.../resources/employees/enrollments.py | 205 ----------
.../resources/{employers => }/employers.py | 312 ++++++++++++----
.../resources/employers/__init__.py | 33 --
.../resources/employers/employees.py | 209 -----------
src/vitable_connect/resources/enrollments.py | 18 +-
src/vitable_connect/types/__init__.py | 16 +-
.../types/benefit_products/__init__.py | 3 -
src/vitable_connect/types/category.py | 7 -
...py => employee_list_enrollments_params.py} | 4 +-
... => employee_list_enrollments_response.py} | 10 +-
...ponse.py => employee_retrieve_response.py} | 4 +-
.../types/employees/__init__.py | 6 -
...eate_benefit_eligibility_policy_params.py} | 4 +-
...s.py => employer_list_employees_params.py} | 4 +-
...py => employer_list_employees_response.py} | 10 +-
.../employer_submit_census_sync_params.py | 191 ++++++++++
.../employer_submit_census_sync_response.py | 19 +
.../types/employers/__init__.py | 6 -
src/vitable_connect/types/enrollment.py | 23 +-
...nse.py => enrollment_retrieve_response.py} | 4 +-
src/vitable_connect/types/members/__init__.py | 3 -
src/vitable_connect/types/product_code.py | 23 --
tests/api_resources/employees/__init__.py | 1 -
.../employees/test_enrollments.py | 128 -------
tests/api_resources/employers/__init__.py | 1 -
.../api_resources/employers/test_employees.py | 128 -------
tests/api_resources/test_employees.py | 121 +++++-
tests/api_resources/test_employers.py | 353 +++++++++++++++++-
tests/api_resources/test_enrollments.py | 14 +-
47 files changed, 1316 insertions(+), 1342 deletions(-)
delete mode 100644 .github/workflows/publish-pypi.yml
delete mode 100644 .github/workflows/release-doctor.yml
delete mode 100644 .release-please-manifest.json
delete mode 100644 bin/check-release-environment
delete mode 100644 release-please-config.json
create mode 100644 src/vitable_connect/resources/employees.py
delete mode 100644 src/vitable_connect/resources/employees/__init__.py
delete mode 100644 src/vitable_connect/resources/employees/employees.py
delete mode 100644 src/vitable_connect/resources/employees/enrollments.py
rename src/vitable_connect/resources/{employers => }/employers.py (62%)
delete mode 100644 src/vitable_connect/resources/employers/__init__.py
delete mode 100644 src/vitable_connect/resources/employers/employees.py
delete mode 100644 src/vitable_connect/types/benefit_products/__init__.py
delete mode 100644 src/vitable_connect/types/category.py
rename src/vitable_connect/types/{employees/enrollment_list_params.py => employee_list_enrollments_params.py} (72%)
rename src/vitable_connect/types/{employees/enrollment_list.py => employee_list_enrollments_response.py} (59%)
rename src/vitable_connect/types/{employee_response.py => employee_retrieve_response.py} (73%)
delete mode 100644 src/vitable_connect/types/employees/__init__.py
rename src/vitable_connect/types/{employer_create_eligibility_policy_params.py => employer_create_benefit_eligibility_policy_params.py} (76%)
rename src/vitable_connect/types/{employers/employee_list_params.py => employer_list_employees_params.py} (73%)
rename src/vitable_connect/types/{employers/employee_list_response.py => employer_list_employees_response.py} (59%)
create mode 100644 src/vitable_connect/types/employer_submit_census_sync_params.py
create mode 100644 src/vitable_connect/types/employer_submit_census_sync_response.py
delete mode 100644 src/vitable_connect/types/employers/__init__.py
rename src/vitable_connect/types/{enrollment_response.py => enrollment_retrieve_response.py} (73%)
delete mode 100644 src/vitable_connect/types/members/__init__.py
delete mode 100644 src/vitable_connect/types/product_code.py
delete mode 100644 tests/api_resources/employees/__init__.py
delete mode 100644 tests/api_resources/employees/test_enrollments.py
delete mode 100644 tests/api_resources/employers/__init__.py
delete mode 100644 tests/api_resources/employers/test_employees.py
diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml
deleted file mode 100644
index e68bab9..0000000
--- a/.github/workflows/publish-pypi.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-# This workflow is triggered when a GitHub release is created.
-# It can also be run manually to re-publish to PyPI in case it failed for some reason.
-# You can run this workflow by navigating to https://www.github.com/Vitable-Inc/vitable-connect-python/actions/workflows/publish-pypi.yml
-name: Publish PyPI
-on:
- workflow_dispatch:
-
- release:
- types: [published]
-
-jobs:
- publish:
- name: publish
- runs-on: ubuntu-latest
- permissions:
- contents: read
- id-token: write
-
- steps:
- - uses: actions/checkout@v6
-
- - name: Install uv
- uses: astral-sh/setup-uv@v5
- with:
- version: '0.9.13'
-
- - name: Publish to PyPI
- run: |
- bash ./bin/publish-pypi
diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml
deleted file mode 100644
index 56f0bce..0000000
--- a/.github/workflows/release-doctor.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-name: Release Doctor
-on:
- pull_request:
- branches:
- - main
- workflow_dispatch:
-
-jobs:
- release_doctor:
- name: release doctor
- runs-on: ubuntu-latest
- if: github.repository == 'Vitable-Inc/vitable-connect-python' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')
-
- steps:
- - uses: actions/checkout@v6
-
- - name: Check release environment
- run: |
- bash ./bin/check-release-environment
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
deleted file mode 100644
index cda9cbd..0000000
--- a/.release-please-manifest.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- ".": "0.1.2"
-}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index 5f6a219..cd64a23 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 10
+configured_endpoints: 11
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-0320b76d8102774d1e66595d7afa37964a6b6d8df15bf01fc90998f83576be1d.yml
openapi_spec_hash: 8d72aaaef87e5e28fcff79bfc13929e2
-config_hash: 686598ed50ce0ac460d9a06417655317
+config_hash: 8b9bb6e47640ef6f4c00f17f1f2c279b
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d86e412..33d9197 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -62,7 +62,7 @@ If you’d like to use the repository from source, you can either install from g
To install via git:
```sh
-$ pip install git+ssh://git@github.com/Vitable-Inc/vitable-connect-python.git
+$ pip install git+ssh://git@github.com/stainless-sdks/vitable-connect-python.git
```
Alternatively, you can build from source and install the wheel file:
@@ -113,7 +113,7 @@ the changes aren't made through the automated pipeline, you may want to make rel
### Publish with a GitHub workflow
-You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/Vitable-Inc/vitable-connect-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up.
+You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/stainless-sdks/vitable-connect-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up.
### Publish manually
diff --git a/README.md b/README.md
index 1b976a2..9f3d18d 100644
--- a/README.md
+++ b/README.md
@@ -16,10 +16,13 @@ The REST API documentation can be found on [vitablehealth.com](https://vitablehe
## Installation
```sh
-# install from PyPI
-pip install vitable_connect
+# install from this staging repo
+pip install git+ssh://git@github.com/stainless-sdks/vitable-connect-python.git
```
+> [!NOTE]
+> Once this package is [published to PyPI](https://www.stainless.com/docs/guides/publish), this will become: `pip install vitable_connect`
+
## Usage
The full API of this library can be found in [api.md](api.md).
@@ -80,8 +83,8 @@ By default, the async client uses `httpx` for HTTP requests. However, for improv
You can enable this by installing `aiohttp`:
```sh
-# install from PyPI
-pip install vitable_connect[aiohttp]
+# install from this staging repo
+pip install 'vitable_connect[aiohttp] @ git+ssh://git@github.com/stainless-sdks/vitable-connect-python.git'
```
Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
@@ -273,9 +276,9 @@ auth = response.parse() # get the object that `auth.issue_access_token()` would
print(auth.access_token)
```
-These methods return an [`APIResponse`](https://github.com/Vitable-Inc/vitable-connect-python/tree/main/src/vitable_connect/_response.py) object.
+These methods return an [`APIResponse`](https://github.com/stainless-sdks/vitable-connect-python/tree/main/src/vitable_connect/_response.py) object.
-The async client returns an [`AsyncAPIResponse`](https://github.com/Vitable-Inc/vitable-connect-python/tree/main/src/vitable_connect/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.
+The async client returns an [`AsyncAPIResponse`](https://github.com/stainless-sdks/vitable-connect-python/tree/main/src/vitable_connect/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.
#### `.with_streaming_response`
@@ -381,7 +384,7 @@ This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) con
We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.
-We are keen for your feedback; please open an [issue](https://www.github.com/Vitable-Inc/vitable-connect-python/issues) with questions, bugs, or suggestions.
+We are keen for your feedback; please open an [issue](https://www.github.com/stainless-sdks/vitable-connect-python/issues) with questions, bugs, or suggestions.
### Determining the installed version
diff --git a/api.md b/api.md
index cb3a689..2429fb5 100644
--- a/api.md
+++ b/api.md
@@ -22,73 +22,56 @@ Methods:
- client.benefit_eligibility_policies.retrieve(policy_id) -> BenefitEligibilityPolicy
-# BenefitProducts
-
-Types:
-
-```python
-from vitable_connect.types import Category, Pagination, ProductCode
-```
-
# Employees
Types:
```python
-from vitable_connect.types import Employee, EmployeeClass, EmployeeResponse
-```
-
-Methods:
-
-- client.employees.retrieve(employee_id) -> EmployeeResponse
-
-## Enrollments
-
-Types:
-
-```python
-from vitable_connect.types.employees import EnrollmentList
+from vitable_connect.types import (
+ Employee,
+ EmployeeClass,
+ Pagination,
+ EmployeeRetrieveResponse,
+ EmployeeListEnrollmentsResponse,
+)
```
Methods:
-- client.employees.enrollments.list(employee_id, \*\*params) -> EnrollmentList
+- client.employees.retrieve(employee_id) -> EmployeeRetrieveResponse
+- client.employees.list_enrollments(employee_id, \*\*params) -> EmployeeListEnrollmentsResponse
# Employers
Types:
```python
-from vitable_connect.types import Employer, EmployerResponse, EmployerListResponse
-```
-
-Methods:
-
-- client.employers.create(\*\*params) -> EmployerResponse
-- client.employers.retrieve(employer_id) -> EmployerResponse
-- client.employers.list(\*\*params) -> EmployerListResponse
-- client.employers.create_eligibility_policy(employer_id, \*\*params) -> BenefitEligibilityPolicy
-
-## Employees
-
-Types:
-
-```python
-from vitable_connect.types.employers import EmployeeListResponse
+from vitable_connect.types import (
+ Employer,
+ EmployerResponse,
+ EmployerListResponse,
+ EmployerListEmployeesResponse,
+ EmployerSubmitCensusSyncResponse,
+)
```
Methods:
-- client.employers.employees.list(employer_id, \*\*params) -> EmployeeListResponse
+- client.employers.create(\*\*params) -> EmployerResponse
+- client.employers.retrieve(employer_id) -> EmployerResponse
+- client.employers.list(\*\*params) -> EmployerListResponse
+- client.employers.create_benefit_eligibility_policy(employer_id, \*\*params) -> BenefitEligibilityPolicy
+- client.employers.list_employees(employer_id, \*\*params) -> EmployerListEmployeesResponse
+- client.employers.submit_census_sync(employer_id, \*\*params) -> EmployerSubmitCensusSyncResponse
# Enrollments
Types:
```python
-from vitable_connect.types import Enrollment, EnrollmentResponse, EnrollmentStatus
+from vitable_connect.types import Enrollment, EnrollmentStatus, EnrollmentRetrieveResponse
```
Methods:
-- client.enrollments.retrieve(enrollment_id) -> EnrollmentResponse
+- client.enrollments.retrieve(enrollment_id) -> EnrollmentRetrieveResponse
diff --git a/bin/check-release-environment b/bin/check-release-environment
deleted file mode 100644
index 1e951e9..0000000
--- a/bin/check-release-environment
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-
-errors=()
-
-lenErrors=${#errors[@]}
-
-if [[ lenErrors -gt 0 ]]; then
- echo -e "Found the following errors in the release environment:\n"
-
- for error in "${errors[@]}"; do
- echo -e "- $error\n"
- done
-
- exit 1
-fi
-
-echo "The environment is ready to push releases!"
diff --git a/bin/publish-pypi b/bin/publish-pypi
index 5895700..e72ca2f 100644
--- a/bin/publish-pypi
+++ b/bin/publish-pypi
@@ -4,8 +4,4 @@ set -eux
rm -rf dist
mkdir -p dist
uv build
-if [ -n "${PYPI_TOKEN:-}" ]; then
- uv publish --token=$PYPI_TOKEN
-else
- uv publish
-fi
+uv publish --token=$PYPI_TOKEN
diff --git a/pyproject.toml b/pyproject.toml
index c021b62..e155c5d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -37,8 +37,8 @@ classifiers = [
]
[project.urls]
-Homepage = "https://github.com/Vitable-Inc/vitable-connect-python"
-Repository = "https://github.com/Vitable-Inc/vitable-connect-python"
+Homepage = "https://github.com/stainless-sdks/vitable-connect-python"
+Repository = "https://github.com/stainless-sdks/vitable-connect-python"
[project.optional-dependencies]
aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
@@ -112,7 +112,7 @@ path = "README.md"
[[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]]
# replace relative links with absolute links
pattern = '\[(.+?)\]\(((?!https?://)\S+?)\)'
-replacement = '[\1](https://github.com/Vitable-Inc/vitable-connect-python/tree/main/\g<2>)'
+replacement = '[\1](https://github.com/stainless-sdks/vitable-connect-python/tree/main/\g<2>)'
[tool.pytest.ini_options]
testpaths = ["tests"]
diff --git a/release-please-config.json b/release-please-config.json
deleted file mode 100644
index c3536c4..0000000
--- a/release-please-config.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "packages": {
- ".": {}
- },
- "$schema": "https://raw.githubusercontent.com/stainless-api/release-please/main/schemas/config.json",
- "include-v-in-tag": true,
- "include-component-in-tag": false,
- "versioning": "prerelease",
- "prerelease": true,
- "bump-minor-pre-major": true,
- "bump-patch-for-minor-pre-major": false,
- "pull-request-header": "Automated Release PR",
- "pull-request-title-pattern": "release: ${version}",
- "changelog-sections": [
- {
- "type": "feat",
- "section": "Features"
- },
- {
- "type": "fix",
- "section": "Bug Fixes"
- },
- {
- "type": "perf",
- "section": "Performance Improvements"
- },
- {
- "type": "revert",
- "section": "Reverts"
- },
- {
- "type": "chore",
- "section": "Chores"
- },
- {
- "type": "docs",
- "section": "Documentation"
- },
- {
- "type": "style",
- "section": "Styles"
- },
- {
- "type": "refactor",
- "section": "Refactors"
- },
- {
- "type": "test",
- "section": "Tests",
- "hidden": true
- },
- {
- "type": "build",
- "section": "Build System"
- },
- {
- "type": "ci",
- "section": "Continuous Integration",
- "hidden": true
- }
- ],
- "release-type": "python",
- "extra-files": [
- "src/vitable_connect/_version.py"
- ]
-}
\ No newline at end of file
diff --git a/src/vitable_connect/_client.py b/src/vitable_connect/_client.py
index e3403b9..1f06d83 100644
--- a/src/vitable_connect/_client.py
+++ b/src/vitable_connect/_client.py
@@ -34,9 +34,9 @@
if TYPE_CHECKING:
from .resources import auth, employees, employers, enrollments, benefit_eligibility_policies
from .resources.auth import AuthResource, AsyncAuthResource
+ from .resources.employees import EmployeesResource, AsyncEmployeesResource
+ from .resources.employers import EmployersResource, AsyncEmployersResource
from .resources.enrollments import EnrollmentsResource, AsyncEnrollmentsResource
- from .resources.employees.employees import EmployeesResource, AsyncEmployeesResource
- from .resources.employers.employers import EmployersResource, AsyncEmployersResource
from .resources.benefit_eligibility_policies import (
BenefitEligibilityPoliciesResource,
AsyncBenefitEligibilityPoliciesResource,
@@ -155,7 +155,6 @@ def benefit_eligibility_policies(self) -> BenefitEligibilityPoliciesResource:
@cached_property
def employees(self) -> EmployeesResource:
- """Manage employee records for employers"""
from .resources.employees import EmployeesResource
return EmployeesResource(self)
@@ -388,7 +387,6 @@ def benefit_eligibility_policies(self) -> AsyncBenefitEligibilityPoliciesResourc
@cached_property
def employees(self) -> AsyncEmployeesResource:
- """Manage employee records for employers"""
from .resources.employees import AsyncEmployeesResource
return AsyncEmployeesResource(self)
@@ -550,7 +548,6 @@ def benefit_eligibility_policies(
@cached_property
def employees(self) -> employees.EmployeesResourceWithRawResponse:
- """Manage employee records for employers"""
from .resources.employees import EmployeesResourceWithRawResponse
return EmployeesResourceWithRawResponse(self._client.employees)
@@ -593,7 +590,6 @@ def benefit_eligibility_policies(
@cached_property
def employees(self) -> employees.AsyncEmployeesResourceWithRawResponse:
- """Manage employee records for employers"""
from .resources.employees import AsyncEmployeesResourceWithRawResponse
return AsyncEmployeesResourceWithRawResponse(self._client.employees)
@@ -636,7 +632,6 @@ def benefit_eligibility_policies(
@cached_property
def employees(self) -> employees.EmployeesResourceWithStreamingResponse:
- """Manage employee records for employers"""
from .resources.employees import EmployeesResourceWithStreamingResponse
return EmployeesResourceWithStreamingResponse(self._client.employees)
@@ -679,7 +674,6 @@ def benefit_eligibility_policies(
@cached_property
def employees(self) -> employees.AsyncEmployeesResourceWithStreamingResponse:
- """Manage employee records for employers"""
from .resources.employees import AsyncEmployeesResourceWithStreamingResponse
return AsyncEmployeesResourceWithStreamingResponse(self._client.employees)
diff --git a/src/vitable_connect/_version.py b/src/vitable_connect/_version.py
index 4c6c097..cee8792 100644
--- a/src/vitable_connect/_version.py
+++ b/src/vitable_connect/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "vitable_connect"
-__version__ = "0.1.2" # x-release-please-version
+__version__ = "0.1.2"
diff --git a/src/vitable_connect/resources/auth.py b/src/vitable_connect/resources/auth.py
index 77344a0..f08a3fe 100644
--- a/src/vitable_connect/resources/auth.py
+++ b/src/vitable_connect/resources/auth.py
@@ -33,7 +33,7 @@ def with_raw_response(self) -> AuthResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AuthResourceWithRawResponse(self)
@@ -42,7 +42,7 @@ def with_streaming_response(self) -> AuthResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
"""
return AuthResourceWithStreamingResponse(self)
@@ -102,7 +102,7 @@ def with_raw_response(self) -> AsyncAuthResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AsyncAuthResourceWithRawResponse(self)
@@ -111,7 +111,7 @@ def with_streaming_response(self) -> AsyncAuthResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
"""
return AsyncAuthResourceWithStreamingResponse(self)
diff --git a/src/vitable_connect/resources/benefit_eligibility_policies.py b/src/vitable_connect/resources/benefit_eligibility_policies.py
index a707f3e..5ec7ec5 100644
--- a/src/vitable_connect/resources/benefit_eligibility_policies.py
+++ b/src/vitable_connect/resources/benefit_eligibility_policies.py
@@ -28,7 +28,7 @@ def with_raw_response(self) -> BenefitEligibilityPoliciesResourceWithRawResponse
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return BenefitEligibilityPoliciesResourceWithRawResponse(self)
@@ -37,7 +37,7 @@ def with_streaming_response(self) -> BenefitEligibilityPoliciesResourceWithStrea
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
"""
return BenefitEligibilityPoliciesResourceWithStreamingResponse(self)
@@ -86,7 +86,7 @@ def with_raw_response(self) -> AsyncBenefitEligibilityPoliciesResourceWithRawRes
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AsyncBenefitEligibilityPoliciesResourceWithRawResponse(self)
@@ -95,7 +95,7 @@ def with_streaming_response(self) -> AsyncBenefitEligibilityPoliciesResourceWith
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
"""
return AsyncBenefitEligibilityPoliciesResourceWithStreamingResponse(self)
diff --git a/src/vitable_connect/resources/employees.py b/src/vitable_connect/resources/employees.py
new file mode 100644
index 0000000..5a5365b
--- /dev/null
+++ b/src/vitable_connect/resources/employees.py
@@ -0,0 +1,288 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import httpx
+
+from ..types import employee_list_enrollments_params
+from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from .._utils import maybe_transform, async_maybe_transform
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
+ to_raw_response_wrapper,
+ to_streamed_response_wrapper,
+ async_to_raw_response_wrapper,
+ async_to_streamed_response_wrapper,
+)
+from .._base_client import make_request_options
+from ..types.employee_retrieve_response import EmployeeRetrieveResponse
+from ..types.employee_list_enrollments_response import EmployeeListEnrollmentsResponse
+
+__all__ = ["EmployeesResource", "AsyncEmployeesResource"]
+
+
+class EmployeesResource(SyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> EmployeesResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ """
+ return EmployeesResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> EmployeesResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ """
+ return EmployeesResourceWithStreamingResponse(self)
+
+ def retrieve(
+ self,
+ employee_id: str,
+ *,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> EmployeeRetrieveResponse:
+ """Retrieves detailed information for a specific employee by ID.
+
+ Returns employee
+ details including personal information and employment status.
+
+ Args:
+ employee_id: Unique employee identifier (empl\\__\\**)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not employee_id:
+ raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
+ return self._get(
+ f"/v1/employees/{employee_id}",
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=EmployeeRetrieveResponse,
+ )
+
+ def list_enrollments(
+ self,
+ employee_id: str,
+ *,
+ limit: int | Omit = omit,
+ page: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> EmployeeListEnrollmentsResponse:
+ """
+ Retrieves a paginated list of benefit enrollments for an employee.
+
+ Args:
+ employee_id: Unique employee identifier (empl\\__\\**)
+
+ limit: Items per page (default: 20, max: 100)
+
+ page: Page number (default: 1)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not employee_id:
+ raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
+ return self._get(
+ f"/v1/employees/{employee_id}/enrollments",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "limit": limit,
+ "page": page,
+ },
+ employee_list_enrollments_params.EmployeeListEnrollmentsParams,
+ ),
+ ),
+ cast_to=EmployeeListEnrollmentsResponse,
+ )
+
+
+class AsyncEmployeesResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncEmployeesResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ """
+ return AsyncEmployeesResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncEmployeesResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ """
+ return AsyncEmployeesResourceWithStreamingResponse(self)
+
+ async def retrieve(
+ self,
+ employee_id: str,
+ *,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> EmployeeRetrieveResponse:
+ """Retrieves detailed information for a specific employee by ID.
+
+ Returns employee
+ details including personal information and employment status.
+
+ Args:
+ employee_id: Unique employee identifier (empl\\__\\**)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not employee_id:
+ raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
+ return await self._get(
+ f"/v1/employees/{employee_id}",
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=EmployeeRetrieveResponse,
+ )
+
+ async def list_enrollments(
+ self,
+ employee_id: str,
+ *,
+ limit: int | Omit = omit,
+ page: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> EmployeeListEnrollmentsResponse:
+ """
+ Retrieves a paginated list of benefit enrollments for an employee.
+
+ Args:
+ employee_id: Unique employee identifier (empl\\__\\**)
+
+ limit: Items per page (default: 20, max: 100)
+
+ page: Page number (default: 1)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not employee_id:
+ raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
+ return await self._get(
+ f"/v1/employees/{employee_id}/enrollments",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform(
+ {
+ "limit": limit,
+ "page": page,
+ },
+ employee_list_enrollments_params.EmployeeListEnrollmentsParams,
+ ),
+ ),
+ cast_to=EmployeeListEnrollmentsResponse,
+ )
+
+
+class EmployeesResourceWithRawResponse:
+ def __init__(self, employees: EmployeesResource) -> None:
+ self._employees = employees
+
+ self.retrieve = to_raw_response_wrapper(
+ employees.retrieve,
+ )
+ self.list_enrollments = to_raw_response_wrapper(
+ employees.list_enrollments,
+ )
+
+
+class AsyncEmployeesResourceWithRawResponse:
+ def __init__(self, employees: AsyncEmployeesResource) -> None:
+ self._employees = employees
+
+ self.retrieve = async_to_raw_response_wrapper(
+ employees.retrieve,
+ )
+ self.list_enrollments = async_to_raw_response_wrapper(
+ employees.list_enrollments,
+ )
+
+
+class EmployeesResourceWithStreamingResponse:
+ def __init__(self, employees: EmployeesResource) -> None:
+ self._employees = employees
+
+ self.retrieve = to_streamed_response_wrapper(
+ employees.retrieve,
+ )
+ self.list_enrollments = to_streamed_response_wrapper(
+ employees.list_enrollments,
+ )
+
+
+class AsyncEmployeesResourceWithStreamingResponse:
+ def __init__(self, employees: AsyncEmployeesResource) -> None:
+ self._employees = employees
+
+ self.retrieve = async_to_streamed_response_wrapper(
+ employees.retrieve,
+ )
+ self.list_enrollments = async_to_streamed_response_wrapper(
+ employees.list_enrollments,
+ )
diff --git a/src/vitable_connect/resources/employees/__init__.py b/src/vitable_connect/resources/employees/__init__.py
deleted file mode 100644
index a15fac2..0000000
--- a/src/vitable_connect/resources/employees/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .employees import (
- EmployeesResource,
- AsyncEmployeesResource,
- EmployeesResourceWithRawResponse,
- AsyncEmployeesResourceWithRawResponse,
- EmployeesResourceWithStreamingResponse,
- AsyncEmployeesResourceWithStreamingResponse,
-)
-from .enrollments import (
- EnrollmentsResource,
- AsyncEnrollmentsResource,
- EnrollmentsResourceWithRawResponse,
- AsyncEnrollmentsResourceWithRawResponse,
- EnrollmentsResourceWithStreamingResponse,
- AsyncEnrollmentsResourceWithStreamingResponse,
-)
-
-__all__ = [
- "EnrollmentsResource",
- "AsyncEnrollmentsResource",
- "EnrollmentsResourceWithRawResponse",
- "AsyncEnrollmentsResourceWithRawResponse",
- "EnrollmentsResourceWithStreamingResponse",
- "AsyncEnrollmentsResourceWithStreamingResponse",
- "EmployeesResource",
- "AsyncEmployeesResource",
- "EmployeesResourceWithRawResponse",
- "AsyncEmployeesResourceWithRawResponse",
- "EmployeesResourceWithStreamingResponse",
- "AsyncEmployeesResourceWithStreamingResponse",
-]
diff --git a/src/vitable_connect/resources/employees/employees.py b/src/vitable_connect/resources/employees/employees.py
deleted file mode 100644
index 0be7a15..0000000
--- a/src/vitable_connect/resources/employees/employees.py
+++ /dev/null
@@ -1,213 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ..._types import Body, Query, Headers, NotGiven, not_given
-from ..._compat import cached_property
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from .enrollments import (
- EnrollmentsResource,
- AsyncEnrollmentsResource,
- EnrollmentsResourceWithRawResponse,
- AsyncEnrollmentsResourceWithRawResponse,
- EnrollmentsResourceWithStreamingResponse,
- AsyncEnrollmentsResourceWithStreamingResponse,
-)
-from ..._base_client import make_request_options
-from ...types.employee_response import EmployeeResponse
-
-__all__ = ["EmployeesResource", "AsyncEmployeesResource"]
-
-
-class EmployeesResource(SyncAPIResource):
- """Manage employee records for employers"""
-
- @cached_property
- def enrollments(self) -> EnrollmentsResource:
- """Manage benefit enrollments and elections for employees"""
- return EnrollmentsResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> EmployeesResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return EmployeesResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> EmployeesResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return EmployeesResourceWithStreamingResponse(self)
-
- def retrieve(
- self,
- employee_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployeeResponse:
- """Retrieves detailed information for a specific employee by ID.
-
- Returns employee
- details including personal information and employment status.
-
- Args:
- employee_id: Unique employee identifier (empl\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employee_id:
- raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- return self._get(
- f"/v1/employees/{employee_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EmployeeResponse,
- )
-
-
-class AsyncEmployeesResource(AsyncAPIResource):
- """Manage employee records for employers"""
-
- @cached_property
- def enrollments(self) -> AsyncEnrollmentsResource:
- """Manage benefit enrollments and elections for employees"""
- return AsyncEnrollmentsResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> AsyncEmployeesResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return AsyncEmployeesResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncEmployeesResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return AsyncEmployeesResourceWithStreamingResponse(self)
-
- async def retrieve(
- self,
- employee_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployeeResponse:
- """Retrieves detailed information for a specific employee by ID.
-
- Returns employee
- details including personal information and employment status.
-
- Args:
- employee_id: Unique employee identifier (empl\\__\\**)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employee_id:
- raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- return await self._get(
- f"/v1/employees/{employee_id}",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=EmployeeResponse,
- )
-
-
-class EmployeesResourceWithRawResponse:
- def __init__(self, employees: EmployeesResource) -> None:
- self._employees = employees
-
- self.retrieve = to_raw_response_wrapper(
- employees.retrieve,
- )
-
- @cached_property
- def enrollments(self) -> EnrollmentsResourceWithRawResponse:
- """Manage benefit enrollments and elections for employees"""
- return EnrollmentsResourceWithRawResponse(self._employees.enrollments)
-
-
-class AsyncEmployeesResourceWithRawResponse:
- def __init__(self, employees: AsyncEmployeesResource) -> None:
- self._employees = employees
-
- self.retrieve = async_to_raw_response_wrapper(
- employees.retrieve,
- )
-
- @cached_property
- def enrollments(self) -> AsyncEnrollmentsResourceWithRawResponse:
- """Manage benefit enrollments and elections for employees"""
- return AsyncEnrollmentsResourceWithRawResponse(self._employees.enrollments)
-
-
-class EmployeesResourceWithStreamingResponse:
- def __init__(self, employees: EmployeesResource) -> None:
- self._employees = employees
-
- self.retrieve = to_streamed_response_wrapper(
- employees.retrieve,
- )
-
- @cached_property
- def enrollments(self) -> EnrollmentsResourceWithStreamingResponse:
- """Manage benefit enrollments and elections for employees"""
- return EnrollmentsResourceWithStreamingResponse(self._employees.enrollments)
-
-
-class AsyncEmployeesResourceWithStreamingResponse:
- def __init__(self, employees: AsyncEmployeesResource) -> None:
- self._employees = employees
-
- self.retrieve = async_to_streamed_response_wrapper(
- employees.retrieve,
- )
-
- @cached_property
- def enrollments(self) -> AsyncEnrollmentsResourceWithStreamingResponse:
- """Manage benefit enrollments and elections for employees"""
- return AsyncEnrollmentsResourceWithStreamingResponse(self._employees.enrollments)
diff --git a/src/vitable_connect/resources/employees/enrollments.py b/src/vitable_connect/resources/employees/enrollments.py
deleted file mode 100644
index 1391b83..0000000
--- a/src/vitable_connect/resources/employees/enrollments.py
+++ /dev/null
@@ -1,205 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ..._utils import maybe_transform, async_maybe_transform
-from ..._compat import cached_property
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from ..._base_client import make_request_options
-from ...types.employees import enrollment_list_params
-from ...types.employees.enrollment_list import EnrollmentList
-
-__all__ = ["EnrollmentsResource", "AsyncEnrollmentsResource"]
-
-
-class EnrollmentsResource(SyncAPIResource):
- """Manage benefit enrollments and elections for employees"""
-
- @cached_property
- def with_raw_response(self) -> EnrollmentsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return EnrollmentsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> EnrollmentsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return EnrollmentsResourceWithStreamingResponse(self)
-
- def list(
- self,
- employee_id: str,
- *,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EnrollmentList:
- """
- Retrieves a paginated list of benefit enrollments for an employee.
-
- Args:
- employee_id: Unique employee identifier (empl\\__\\**)
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employee_id:
- raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- return self._get(
- f"/v1/employees/{employee_id}/enrollments",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "limit": limit,
- "page": page,
- },
- enrollment_list_params.EnrollmentListParams,
- ),
- ),
- cast_to=EnrollmentList,
- )
-
-
-class AsyncEnrollmentsResource(AsyncAPIResource):
- """Manage benefit enrollments and elections for employees"""
-
- @cached_property
- def with_raw_response(self) -> AsyncEnrollmentsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return AsyncEnrollmentsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncEnrollmentsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return AsyncEnrollmentsResourceWithStreamingResponse(self)
-
- async def list(
- self,
- employee_id: str,
- *,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EnrollmentList:
- """
- Retrieves a paginated list of benefit enrollments for an employee.
-
- Args:
- employee_id: Unique employee identifier (empl\\__\\**)
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employee_id:
- raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- return await self._get(
- f"/v1/employees/{employee_id}/enrollments",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "limit": limit,
- "page": page,
- },
- enrollment_list_params.EnrollmentListParams,
- ),
- ),
- cast_to=EnrollmentList,
- )
-
-
-class EnrollmentsResourceWithRawResponse:
- def __init__(self, enrollments: EnrollmentsResource) -> None:
- self._enrollments = enrollments
-
- self.list = to_raw_response_wrapper(
- enrollments.list,
- )
-
-
-class AsyncEnrollmentsResourceWithRawResponse:
- def __init__(self, enrollments: AsyncEnrollmentsResource) -> None:
- self._enrollments = enrollments
-
- self.list = async_to_raw_response_wrapper(
- enrollments.list,
- )
-
-
-class EnrollmentsResourceWithStreamingResponse:
- def __init__(self, enrollments: EnrollmentsResource) -> None:
- self._enrollments = enrollments
-
- self.list = to_streamed_response_wrapper(
- enrollments.list,
- )
-
-
-class AsyncEnrollmentsResourceWithStreamingResponse:
- def __init__(self, enrollments: AsyncEnrollmentsResource) -> None:
- self._enrollments = enrollments
-
- self.list = async_to_streamed_response_wrapper(
- enrollments.list,
- )
diff --git a/src/vitable_connect/resources/employers/employers.py b/src/vitable_connect/resources/employers.py
similarity index 62%
rename from src/vitable_connect/resources/employers/employers.py
rename to src/vitable_connect/resources/employers.py
index e387445..648f627 100644
--- a/src/vitable_connect/resources/employers/employers.py
+++ b/src/vitable_connect/resources/employers.py
@@ -2,48 +2,45 @@
from __future__ import annotations
+from typing import Iterable
+
import httpx
-from ...types import employer_list_params, employer_create_params, employer_create_eligibility_policy_params
-from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ..._utils import maybe_transform, async_maybe_transform
-from ..._compat import cached_property
-from .employees import (
- EmployeesResource,
- AsyncEmployeesResource,
- EmployeesResourceWithRawResponse,
- AsyncEmployeesResourceWithRawResponse,
- EmployeesResourceWithStreamingResponse,
- AsyncEmployeesResourceWithStreamingResponse,
+from ..types import (
+ employer_list_params,
+ employer_create_params,
+ employer_list_employees_params,
+ employer_submit_census_sync_params,
+ employer_create_benefit_eligibility_policy_params,
)
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
+from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from .._utils import maybe_transform, async_maybe_transform
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
to_raw_response_wrapper,
to_streamed_response_wrapper,
async_to_raw_response_wrapper,
async_to_streamed_response_wrapper,
)
-from ..._base_client import make_request_options
-from ...types.employer_response import EmployerResponse
-from ...types.employer_list_response import EmployerListResponse
-from ...types.benefit_eligibility_policy import BenefitEligibilityPolicy
+from .._base_client import make_request_options
+from ..types.employer_response import EmployerResponse
+from ..types.employer_list_response import EmployerListResponse
+from ..types.benefit_eligibility_policy import BenefitEligibilityPolicy
+from ..types.employer_list_employees_response import EmployerListEmployeesResponse
+from ..types.employer_submit_census_sync_response import EmployerSubmitCensusSyncResponse
__all__ = ["EmployersResource", "AsyncEmployersResource"]
class EmployersResource(SyncAPIResource):
- @cached_property
- def employees(self) -> EmployeesResource:
- """Manage employee records for employers"""
- return EmployeesResource(self._client)
-
@cached_property
def with_raw_response(self) -> EmployersResourceWithRawResponse:
"""
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return EmployersResourceWithRawResponse(self)
@@ -52,7 +49,7 @@ def with_streaming_response(self) -> EmployersResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
"""
return EmployersResourceWithStreamingResponse(self)
@@ -199,7 +196,7 @@ def list(
cast_to=EmployerListResponse,
)
- def create_eligibility_policy(
+ def create_benefit_eligibility_policy(
self,
employer_id: str,
*,
@@ -240,7 +237,7 @@ def create_eligibility_policy(
"classification": classification,
"waiting_period": waiting_period,
},
- employer_create_eligibility_policy_params.EmployerCreateEligibilityPolicyParams,
+ employer_create_benefit_eligibility_policy_params.EmployerCreateBenefitEligibilityPolicyParams,
),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -248,20 +245,110 @@ def create_eligibility_policy(
cast_to=BenefitEligibilityPolicy,
)
+ def list_employees(
+ self,
+ employer_id: str,
+ *,
+ limit: int | Omit = omit,
+ page: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> EmployerListEmployeesResponse:
+ """Retrieves a paginated list of all employees for a specific employer.
+
+ Results are
+ paginated using page and limit parameters.
-class AsyncEmployersResource(AsyncAPIResource):
- @cached_property
- def employees(self) -> AsyncEmployeesResource:
- """Manage employee records for employers"""
- return AsyncEmployeesResource(self._client)
+ Args:
+ employer_id: Unique employer identifier (empr\\__\\**)
+
+ limit: Items per page (default: 20, max: 100)
+
+ page: Page number (default: 1)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not employer_id:
+ raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
+ return self._get(
+ f"/v1/employers/{employer_id}/employees",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "limit": limit,
+ "page": page,
+ },
+ employer_list_employees_params.EmployerListEmployeesParams,
+ ),
+ ),
+ cast_to=EmployerListEmployeesResponse,
+ )
+
+ def submit_census_sync(
+ self,
+ employer_id: str,
+ *,
+ employees: Iterable[employer_submit_census_sync_params.Employee],
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> EmployerSubmitCensusSyncResponse:
+ """Submits a census sync payload for the specified employer.
+
+ The employees in the
+ payload will be queued for processing. Returns an accepted response with the
+ timestamp of acceptance.
+
+ Args:
+ employer_id: Unique employer identifier (empr\\__\\**)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not employer_id:
+ raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
+ return self._post(
+ f"/v1/employers/{employer_id}/census-sync",
+ body=maybe_transform(
+ {"employees": employees}, employer_submit_census_sync_params.EmployerSubmitCensusSyncParams
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=EmployerSubmitCensusSyncResponse,
+ )
+
+
+class AsyncEmployersResource(AsyncAPIResource):
@cached_property
def with_raw_response(self) -> AsyncEmployersResourceWithRawResponse:
"""
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AsyncEmployersResourceWithRawResponse(self)
@@ -270,7 +357,7 @@ def with_streaming_response(self) -> AsyncEmployersResourceWithStreamingResponse
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
"""
return AsyncEmployersResourceWithStreamingResponse(self)
@@ -417,7 +504,7 @@ async def list(
cast_to=EmployerListResponse,
)
- async def create_eligibility_policy(
+ async def create_benefit_eligibility_policy(
self,
employer_id: str,
*,
@@ -458,7 +545,7 @@ async def create_eligibility_policy(
"classification": classification,
"waiting_period": waiting_period,
},
- employer_create_eligibility_policy_params.EmployerCreateEligibilityPolicyParams,
+ employer_create_benefit_eligibility_policy_params.EmployerCreateBenefitEligibilityPolicyParams,
),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -466,6 +553,101 @@ async def create_eligibility_policy(
cast_to=BenefitEligibilityPolicy,
)
+ async def list_employees(
+ self,
+ employer_id: str,
+ *,
+ limit: int | Omit = omit,
+ page: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> EmployerListEmployeesResponse:
+ """Retrieves a paginated list of all employees for a specific employer.
+
+ Results are
+ paginated using page and limit parameters.
+
+ Args:
+ employer_id: Unique employer identifier (empr\\__\\**)
+
+ limit: Items per page (default: 20, max: 100)
+
+ page: Page number (default: 1)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not employer_id:
+ raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
+ return await self._get(
+ f"/v1/employers/{employer_id}/employees",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform(
+ {
+ "limit": limit,
+ "page": page,
+ },
+ employer_list_employees_params.EmployerListEmployeesParams,
+ ),
+ ),
+ cast_to=EmployerListEmployeesResponse,
+ )
+
+ async def submit_census_sync(
+ self,
+ employer_id: str,
+ *,
+ employees: Iterable[employer_submit_census_sync_params.Employee],
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> EmployerSubmitCensusSyncResponse:
+ """Submits a census sync payload for the specified employer.
+
+ The employees in the
+ payload will be queued for processing. Returns an accepted response with the
+ timestamp of acceptance.
+
+ Args:
+ employer_id: Unique employer identifier (empr\\__\\**)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not employer_id:
+ raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
+ return await self._post(
+ f"/v1/employers/{employer_id}/census-sync",
+ body=await async_maybe_transform(
+ {"employees": employees}, employer_submit_census_sync_params.EmployerSubmitCensusSyncParams
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=EmployerSubmitCensusSyncResponse,
+ )
+
class EmployersResourceWithRawResponse:
def __init__(self, employers: EmployersResource) -> None:
@@ -480,14 +662,15 @@ def __init__(self, employers: EmployersResource) -> None:
self.list = to_raw_response_wrapper(
employers.list,
)
- self.create_eligibility_policy = to_raw_response_wrapper(
- employers.create_eligibility_policy,
+ self.create_benefit_eligibility_policy = to_raw_response_wrapper(
+ employers.create_benefit_eligibility_policy,
+ )
+ self.list_employees = to_raw_response_wrapper(
+ employers.list_employees,
+ )
+ self.submit_census_sync = to_raw_response_wrapper(
+ employers.submit_census_sync,
)
-
- @cached_property
- def employees(self) -> EmployeesResourceWithRawResponse:
- """Manage employee records for employers"""
- return EmployeesResourceWithRawResponse(self._employers.employees)
class AsyncEmployersResourceWithRawResponse:
@@ -503,14 +686,15 @@ def __init__(self, employers: AsyncEmployersResource) -> None:
self.list = async_to_raw_response_wrapper(
employers.list,
)
- self.create_eligibility_policy = async_to_raw_response_wrapper(
- employers.create_eligibility_policy,
+ self.create_benefit_eligibility_policy = async_to_raw_response_wrapper(
+ employers.create_benefit_eligibility_policy,
+ )
+ self.list_employees = async_to_raw_response_wrapper(
+ employers.list_employees,
+ )
+ self.submit_census_sync = async_to_raw_response_wrapper(
+ employers.submit_census_sync,
)
-
- @cached_property
- def employees(self) -> AsyncEmployeesResourceWithRawResponse:
- """Manage employee records for employers"""
- return AsyncEmployeesResourceWithRawResponse(self._employers.employees)
class EmployersResourceWithStreamingResponse:
@@ -526,14 +710,15 @@ def __init__(self, employers: EmployersResource) -> None:
self.list = to_streamed_response_wrapper(
employers.list,
)
- self.create_eligibility_policy = to_streamed_response_wrapper(
- employers.create_eligibility_policy,
+ self.create_benefit_eligibility_policy = to_streamed_response_wrapper(
+ employers.create_benefit_eligibility_policy,
+ )
+ self.list_employees = to_streamed_response_wrapper(
+ employers.list_employees,
+ )
+ self.submit_census_sync = to_streamed_response_wrapper(
+ employers.submit_census_sync,
)
-
- @cached_property
- def employees(self) -> EmployeesResourceWithStreamingResponse:
- """Manage employee records for employers"""
- return EmployeesResourceWithStreamingResponse(self._employers.employees)
class AsyncEmployersResourceWithStreamingResponse:
@@ -549,11 +734,12 @@ def __init__(self, employers: AsyncEmployersResource) -> None:
self.list = async_to_streamed_response_wrapper(
employers.list,
)
- self.create_eligibility_policy = async_to_streamed_response_wrapper(
- employers.create_eligibility_policy,
+ self.create_benefit_eligibility_policy = async_to_streamed_response_wrapper(
+ employers.create_benefit_eligibility_policy,
+ )
+ self.list_employees = async_to_streamed_response_wrapper(
+ employers.list_employees,
+ )
+ self.submit_census_sync = async_to_streamed_response_wrapper(
+ employers.submit_census_sync,
)
-
- @cached_property
- def employees(self) -> AsyncEmployeesResourceWithStreamingResponse:
- """Manage employee records for employers"""
- return AsyncEmployeesResourceWithStreamingResponse(self._employers.employees)
diff --git a/src/vitable_connect/resources/employers/__init__.py b/src/vitable_connect/resources/employers/__init__.py
deleted file mode 100644
index 0237dd1..0000000
--- a/src/vitable_connect/resources/employers/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .employees import (
- EmployeesResource,
- AsyncEmployeesResource,
- EmployeesResourceWithRawResponse,
- AsyncEmployeesResourceWithRawResponse,
- EmployeesResourceWithStreamingResponse,
- AsyncEmployeesResourceWithStreamingResponse,
-)
-from .employers import (
- EmployersResource,
- AsyncEmployersResource,
- EmployersResourceWithRawResponse,
- AsyncEmployersResourceWithRawResponse,
- EmployersResourceWithStreamingResponse,
- AsyncEmployersResourceWithStreamingResponse,
-)
-
-__all__ = [
- "EmployeesResource",
- "AsyncEmployeesResource",
- "EmployeesResourceWithRawResponse",
- "AsyncEmployeesResourceWithRawResponse",
- "EmployeesResourceWithStreamingResponse",
- "AsyncEmployeesResourceWithStreamingResponse",
- "EmployersResource",
- "AsyncEmployersResource",
- "EmployersResourceWithRawResponse",
- "AsyncEmployersResourceWithRawResponse",
- "EmployersResourceWithStreamingResponse",
- "AsyncEmployersResourceWithStreamingResponse",
-]
diff --git a/src/vitable_connect/resources/employers/employees.py b/src/vitable_connect/resources/employers/employees.py
deleted file mode 100644
index b412719..0000000
--- a/src/vitable_connect/resources/employers/employees.py
+++ /dev/null
@@ -1,209 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ..._utils import maybe_transform, async_maybe_transform
-from ..._compat import cached_property
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from ..._base_client import make_request_options
-from ...types.employers import employee_list_params
-from ...types.employers.employee_list_response import EmployeeListResponse
-
-__all__ = ["EmployeesResource", "AsyncEmployeesResource"]
-
-
-class EmployeesResource(SyncAPIResource):
- """Manage employee records for employers"""
-
- @cached_property
- def with_raw_response(self) -> EmployeesResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return EmployeesResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> EmployeesResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return EmployeesResourceWithStreamingResponse(self)
-
- def list(
- self,
- employer_id: str,
- *,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployeeListResponse:
- """Retrieves a paginated list of all employees for a specific employer.
-
- Results are
- paginated using page and limit parameters.
-
- Args:
- employer_id: Unique employer identifier (empr\\__\\**)
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employer_id:
- raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
- return self._get(
- f"/v1/employers/{employer_id}/employees",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "limit": limit,
- "page": page,
- },
- employee_list_params.EmployeeListParams,
- ),
- ),
- cast_to=EmployeeListResponse,
- )
-
-
-class AsyncEmployeesResource(AsyncAPIResource):
- """Manage employee records for employers"""
-
- @cached_property
- def with_raw_response(self) -> AsyncEmployeesResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
- """
- return AsyncEmployeesResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncEmployeesResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
- """
- return AsyncEmployeesResourceWithStreamingResponse(self)
-
- async def list(
- self,
- employer_id: str,
- *,
- limit: int | Omit = omit,
- page: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployeeListResponse:
- """Retrieves a paginated list of all employees for a specific employer.
-
- Results are
- paginated using page and limit parameters.
-
- Args:
- employer_id: Unique employer identifier (empr\\__\\**)
-
- limit: Items per page (default: 20, max: 100)
-
- page: Page number (default: 1)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not employer_id:
- raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
- return await self._get(
- f"/v1/employers/{employer_id}/employees",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "limit": limit,
- "page": page,
- },
- employee_list_params.EmployeeListParams,
- ),
- ),
- cast_to=EmployeeListResponse,
- )
-
-
-class EmployeesResourceWithRawResponse:
- def __init__(self, employees: EmployeesResource) -> None:
- self._employees = employees
-
- self.list = to_raw_response_wrapper(
- employees.list,
- )
-
-
-class AsyncEmployeesResourceWithRawResponse:
- def __init__(self, employees: AsyncEmployeesResource) -> None:
- self._employees = employees
-
- self.list = async_to_raw_response_wrapper(
- employees.list,
- )
-
-
-class EmployeesResourceWithStreamingResponse:
- def __init__(self, employees: EmployeesResource) -> None:
- self._employees = employees
-
- self.list = to_streamed_response_wrapper(
- employees.list,
- )
-
-
-class AsyncEmployeesResourceWithStreamingResponse:
- def __init__(self, employees: AsyncEmployeesResource) -> None:
- self._employees = employees
-
- self.list = async_to_streamed_response_wrapper(
- employees.list,
- )
diff --git a/src/vitable_connect/resources/enrollments.py b/src/vitable_connect/resources/enrollments.py
index e3f4d04..3e05a79 100644
--- a/src/vitable_connect/resources/enrollments.py
+++ b/src/vitable_connect/resources/enrollments.py
@@ -14,7 +14,7 @@
async_to_streamed_response_wrapper,
)
from .._base_client import make_request_options
-from ..types.enrollment_response import EnrollmentResponse
+from ..types.enrollment_retrieve_response import EnrollmentRetrieveResponse
__all__ = ["EnrollmentsResource", "AsyncEnrollmentsResource"]
@@ -28,7 +28,7 @@ def with_raw_response(self) -> EnrollmentsResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return EnrollmentsResourceWithRawResponse(self)
@@ -37,7 +37,7 @@ def with_streaming_response(self) -> EnrollmentsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
"""
return EnrollmentsResourceWithStreamingResponse(self)
@@ -51,7 +51,7 @@ def retrieve(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EnrollmentResponse:
+ ) -> EnrollmentRetrieveResponse:
"""
Retrieves detailed information for a specific enrollment by ID.
@@ -73,7 +73,7 @@ def retrieve(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- cast_to=EnrollmentResponse,
+ cast_to=EnrollmentRetrieveResponse,
)
@@ -86,7 +86,7 @@ def with_raw_response(self) -> AsyncEnrollmentsResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AsyncEnrollmentsResourceWithRawResponse(self)
@@ -95,7 +95,7 @@ def with_streaming_response(self) -> AsyncEnrollmentsResourceWithStreamingRespon
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
"""
return AsyncEnrollmentsResourceWithStreamingResponse(self)
@@ -109,7 +109,7 @@ async def retrieve(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EnrollmentResponse:
+ ) -> EnrollmentRetrieveResponse:
"""
Retrieves detailed information for a specific enrollment by ID.
@@ -131,7 +131,7 @@ async def retrieve(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- cast_to=EnrollmentResponse,
+ cast_to=EnrollmentRetrieveResponse,
)
diff --git a/src/vitable_connect/types/__init__.py b/src/vitable_connect/types/__init__.py
index 8bf0c68..79c8128 100644
--- a/src/vitable_connect/types/__init__.py
+++ b/src/vitable_connect/types/__init__.py
@@ -3,23 +3,27 @@
from __future__ import annotations
from .type import Type as Type
-from .category import Category as Category
from .employee import Employee as Employee
from .employer import Employer as Employer
from .enrollment import Enrollment as Enrollment
from .pagination import Pagination as Pagination
-from .product_code import ProductCode as ProductCode
from .employee_class import EmployeeClass as EmployeeClass
-from .employee_response import EmployeeResponse as EmployeeResponse
from .employer_response import EmployerResponse as EmployerResponse
from .enrollment_status import EnrollmentStatus as EnrollmentStatus
-from .enrollment_response import EnrollmentResponse as EnrollmentResponse
from .employer_list_params import EmployerListParams as EmployerListParams
from .employer_create_params import EmployerCreateParams as EmployerCreateParams
from .employer_list_response import EmployerListResponse as EmployerListResponse
from .benefit_eligibility_policy import BenefitEligibilityPolicy as BenefitEligibilityPolicy
+from .employee_retrieve_response import EmployeeRetrieveResponse as EmployeeRetrieveResponse
+from .enrollment_retrieve_response import EnrollmentRetrieveResponse as EnrollmentRetrieveResponse
from .auth_issue_access_token_params import AuthIssueAccessTokenParams as AuthIssueAccessTokenParams
+from .employer_list_employees_params import EmployerListEmployeesParams as EmployerListEmployeesParams
from .auth_issue_access_token_response import AuthIssueAccessTokenResponse as AuthIssueAccessTokenResponse
-from .employer_create_eligibility_policy_params import (
- EmployerCreateEligibilityPolicyParams as EmployerCreateEligibilityPolicyParams,
+from .employee_list_enrollments_params import EmployeeListEnrollmentsParams as EmployeeListEnrollmentsParams
+from .employer_list_employees_response import EmployerListEmployeesResponse as EmployerListEmployeesResponse
+from .employee_list_enrollments_response import EmployeeListEnrollmentsResponse as EmployeeListEnrollmentsResponse
+from .employer_submit_census_sync_params import EmployerSubmitCensusSyncParams as EmployerSubmitCensusSyncParams
+from .employer_submit_census_sync_response import EmployerSubmitCensusSyncResponse as EmployerSubmitCensusSyncResponse
+from .employer_create_benefit_eligibility_policy_params import (
+ EmployerCreateBenefitEligibilityPolicyParams as EmployerCreateBenefitEligibilityPolicyParams,
)
diff --git a/src/vitable_connect/types/benefit_products/__init__.py b/src/vitable_connect/types/benefit_products/__init__.py
deleted file mode 100644
index f8ee8b1..0000000
--- a/src/vitable_connect/types/benefit_products/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
diff --git a/src/vitable_connect/types/category.py b/src/vitable_connect/types/category.py
deleted file mode 100644
index bfa7e3b..0000000
--- a/src/vitable_connect/types/category.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["Category"]
-
-Category: TypeAlias = Literal["Medical", "Dental", "Vision", "Hospital"]
diff --git a/src/vitable_connect/types/employees/enrollment_list_params.py b/src/vitable_connect/types/employee_list_enrollments_params.py
similarity index 72%
rename from src/vitable_connect/types/employees/enrollment_list_params.py
rename to src/vitable_connect/types/employee_list_enrollments_params.py
index 75fd128..458062a 100644
--- a/src/vitable_connect/types/employees/enrollment_list_params.py
+++ b/src/vitable_connect/types/employee_list_enrollments_params.py
@@ -4,10 +4,10 @@
from typing_extensions import TypedDict
-__all__ = ["EnrollmentListParams"]
+__all__ = ["EmployeeListEnrollmentsParams"]
-class EnrollmentListParams(TypedDict, total=False):
+class EmployeeListEnrollmentsParams(TypedDict, total=False):
limit: int
"""Items per page (default: 20, max: 100)"""
diff --git a/src/vitable_connect/types/employees/enrollment_list.py b/src/vitable_connect/types/employee_list_enrollments_response.py
similarity index 59%
rename from src/vitable_connect/types/employees/enrollment_list.py
rename to src/vitable_connect/types/employee_list_enrollments_response.py
index 9b03e87..f8ee923 100644
--- a/src/vitable_connect/types/employees/enrollment_list.py
+++ b/src/vitable_connect/types/employee_list_enrollments_response.py
@@ -2,14 +2,14 @@
from typing import List
-from ..._models import BaseModel
-from ..enrollment import Enrollment
-from ..pagination import Pagination
+from .._models import BaseModel
+from .enrollment import Enrollment
+from .pagination import Pagination
-__all__ = ["EnrollmentList"]
+__all__ = ["EmployeeListEnrollmentsResponse"]
-class EnrollmentList(BaseModel):
+class EmployeeListEnrollmentsResponse(BaseModel):
"""Paginated list response containing enrollment resources."""
data: List[Enrollment]
diff --git a/src/vitable_connect/types/employee_response.py b/src/vitable_connect/types/employee_retrieve_response.py
similarity index 73%
rename from src/vitable_connect/types/employee_response.py
rename to src/vitable_connect/types/employee_retrieve_response.py
index fb41ca9..7d8ae10 100644
--- a/src/vitable_connect/types/employee_response.py
+++ b/src/vitable_connect/types/employee_retrieve_response.py
@@ -3,10 +3,10 @@
from .._models import BaseModel
from .employee import Employee
-__all__ = ["EmployeeResponse"]
+__all__ = ["EmployeeRetrieveResponse"]
-class EmployeeResponse(BaseModel):
+class EmployeeRetrieveResponse(BaseModel):
"""Response containing a single employee resource."""
data: Employee
diff --git a/src/vitable_connect/types/employees/__init__.py b/src/vitable_connect/types/employees/__init__.py
deleted file mode 100644
index 758110a..0000000
--- a/src/vitable_connect/types/employees/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from .enrollment_list import EnrollmentList as EnrollmentList
-from .enrollment_list_params import EnrollmentListParams as EnrollmentListParams
diff --git a/src/vitable_connect/types/employer_create_eligibility_policy_params.py b/src/vitable_connect/types/employer_create_benefit_eligibility_policy_params.py
similarity index 76%
rename from src/vitable_connect/types/employer_create_eligibility_policy_params.py
rename to src/vitable_connect/types/employer_create_benefit_eligibility_policy_params.py
index d5cfa35..055d104 100644
--- a/src/vitable_connect/types/employer_create_eligibility_policy_params.py
+++ b/src/vitable_connect/types/employer_create_benefit_eligibility_policy_params.py
@@ -4,10 +4,10 @@
from typing_extensions import Required, TypedDict
-__all__ = ["EmployerCreateEligibilityPolicyParams"]
+__all__ = ["EmployerCreateBenefitEligibilityPolicyParams"]
-class EmployerCreateEligibilityPolicyParams(TypedDict, total=False):
+class EmployerCreateBenefitEligibilityPolicyParams(TypedDict, total=False):
classification: Required[str]
"""Which employee classifications are eligible. One of: full_time, part_time, all"""
diff --git a/src/vitable_connect/types/employers/employee_list_params.py b/src/vitable_connect/types/employer_list_employees_params.py
similarity index 73%
rename from src/vitable_connect/types/employers/employee_list_params.py
rename to src/vitable_connect/types/employer_list_employees_params.py
index 058b1d0..f5a61f9 100644
--- a/src/vitable_connect/types/employers/employee_list_params.py
+++ b/src/vitable_connect/types/employer_list_employees_params.py
@@ -4,10 +4,10 @@
from typing_extensions import TypedDict
-__all__ = ["EmployeeListParams"]
+__all__ = ["EmployerListEmployeesParams"]
-class EmployeeListParams(TypedDict, total=False):
+class EmployerListEmployeesParams(TypedDict, total=False):
limit: int
"""Items per page (default: 20, max: 100)"""
diff --git a/src/vitable_connect/types/employers/employee_list_response.py b/src/vitable_connect/types/employer_list_employees_response.py
similarity index 59%
rename from src/vitable_connect/types/employers/employee_list_response.py
rename to src/vitable_connect/types/employer_list_employees_response.py
index d7776ce..fba5d85 100644
--- a/src/vitable_connect/types/employers/employee_list_response.py
+++ b/src/vitable_connect/types/employer_list_employees_response.py
@@ -2,14 +2,14 @@
from typing import List
-from ..._models import BaseModel
-from ..employee import Employee
-from ..pagination import Pagination
+from .._models import BaseModel
+from .employee import Employee
+from .pagination import Pagination
-__all__ = ["EmployeeListResponse"]
+__all__ = ["EmployerListEmployeesResponse"]
-class EmployeeListResponse(BaseModel):
+class EmployerListEmployeesResponse(BaseModel):
"""Paginated list response containing employee resources."""
data: List[Employee]
diff --git a/src/vitable_connect/types/employer_submit_census_sync_params.py b/src/vitable_connect/types/employer_submit_census_sync_params.py
new file mode 100644
index 0000000..ce0782b
--- /dev/null
+++ b/src/vitable_connect/types/employer_submit_census_sync_params.py
@@ -0,0 +1,191 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union, Iterable, Optional
+from datetime import date
+from typing_extensions import Literal, Required, Annotated, TypedDict
+
+from .._utils import PropertyInfo
+from .employee_class import EmployeeClass
+
+__all__ = ["EmployerSubmitCensusSyncParams", "Employee", "EmployeeAddress"]
+
+
+class EmployerSubmitCensusSyncParams(TypedDict, total=False):
+ employees: Required[Iterable[Employee]]
+
+
+class EmployeeAddress(TypedDict, total=False):
+ address_line_1: Required[str]
+
+ city: Required[str]
+
+ state: Required[
+ Literal[
+ "AL",
+ "AK",
+ "AZ",
+ "AR",
+ "CA",
+ "CO",
+ "CT",
+ "DC",
+ "DE",
+ "FL",
+ "GA",
+ "HI",
+ "ID",
+ "IL",
+ "IN",
+ "IA",
+ "KS",
+ "KY",
+ "LA",
+ "ME",
+ "MD",
+ "MA",
+ "MI",
+ "MN",
+ "MS",
+ "MO",
+ "MT",
+ "NE",
+ "NV",
+ "NH",
+ "NJ",
+ "NM",
+ "NY",
+ "NC",
+ "ND",
+ "OH",
+ "OK",
+ "OR",
+ "PA",
+ "RI",
+ "SC",
+ "SD",
+ "TN",
+ "TX",
+ "UT",
+ "VT",
+ "VA",
+ "WA",
+ "WI",
+ "WV",
+ "WY",
+ "PR",
+ "GU",
+ "AS",
+ "VI",
+ "MP",
+ "MH",
+ "PW",
+ "FM",
+ "AE",
+ "AA",
+ "AP",
+ ]
+ ]
+ """
+ - `AL` - AL
+ - `AK` - AK
+ - `AZ` - AZ
+ - `AR` - AR
+ - `CA` - CA
+ - `CO` - CO
+ - `CT` - CT
+ - `DC` - DC
+ - `DE` - DE
+ - `FL` - FL
+ - `GA` - GA
+ - `HI` - HI
+ - `ID` - ID
+ - `IL` - IL
+ - `IN` - IN
+ - `IA` - IA
+ - `KS` - KS
+ - `KY` - KY
+ - `LA` - LA
+ - `ME` - ME
+ - `MD` - MD
+ - `MA` - MA
+ - `MI` - MI
+ - `MN` - MN
+ - `MS` - MS
+ - `MO` - MO
+ - `MT` - MT
+ - `NE` - NE
+ - `NV` - NV
+ - `NH` - NH
+ - `NJ` - NJ
+ - `NM` - NM
+ - `NY` - NY
+ - `NC` - NC
+ - `ND` - ND
+ - `OH` - OH
+ - `OK` - OK
+ - `OR` - OR
+ - `PA` - PA
+ - `RI` - RI
+ - `SC` - SC
+ - `SD` - SD
+ - `TN` - TN
+ - `TX` - TX
+ - `UT` - UT
+ - `VT` - VT
+ - `VA` - VA
+ - `WA` - WA
+ - `WI` - WI
+ - `WV` - WV
+ - `WY` - WY
+ - `PR` - PR
+ - `GU` - GU
+ - `AS` - AS
+ - `VI` - VI
+ - `MP` - MP
+ - `MH` - MH
+ - `PW` - PW
+ - `FM` - FM
+ - `AE` - AE
+ - `AA` - AA
+ - `AP` - AP
+ """
+
+ zipcode: Required[str]
+
+ address_line_2: Optional[str]
+
+
+class Employee(TypedDict, total=False):
+ date_of_birth: Required[Annotated[Union[str, date], PropertyInfo(format="iso8601")]]
+
+ email: Required[str]
+
+ first_name: Required[str]
+
+ last_name: Required[str]
+
+ phone: Required[str]
+
+ address: Optional[EmployeeAddress]
+
+ compensation_type: Optional[Literal["Salary", "Hourly"]]
+ """
+ - `Salary` - Salary
+ - `Hourly` - Hourly
+ """
+
+ employee_class: Optional[EmployeeClass]
+ """
+ - `Full Time` - Full Time
+ - `Part Time` - Part Time
+ - `Temporary` - Temporary
+ - `Intern` - Intern
+ - `Seasonal` - Seasonal
+ - `Individual Contractor` - Individual Contractor
+ """
+
+ reference_id: Optional[str]
+
+ start_date: Annotated[Union[str, date, None], PropertyInfo(format="iso8601")]
diff --git a/src/vitable_connect/types/employer_submit_census_sync_response.py b/src/vitable_connect/types/employer_submit_census_sync_response.py
new file mode 100644
index 0000000..1e53430
--- /dev/null
+++ b/src/vitable_connect/types/employer_submit_census_sync_response.py
@@ -0,0 +1,19 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+
+from .._models import BaseModel
+
+__all__ = ["EmployerSubmitCensusSyncResponse", "Data"]
+
+
+class Data(BaseModel):
+ accepted_at: datetime
+
+ employer_id: str
+
+
+class EmployerSubmitCensusSyncResponse(BaseModel):
+ """Response containing a single census sync detail resource."""
+
+ data: Data
diff --git a/src/vitable_connect/types/employers/__init__.py b/src/vitable_connect/types/employers/__init__.py
deleted file mode 100644
index 3a2b0c0..0000000
--- a/src/vitable_connect/types/employers/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from .employee_list_params import EmployeeListParams as EmployeeListParams
-from .employee_list_response import EmployeeListResponse as EmployeeListResponse
diff --git a/src/vitable_connect/types/enrollment.py b/src/vitable_connect/types/enrollment.py
index 19f8a49..e7694b9 100644
--- a/src/vitable_connect/types/enrollment.py
+++ b/src/vitable_connect/types/enrollment.py
@@ -2,10 +2,9 @@
from typing import Optional
from datetime import date, datetime
+from typing_extensions import Literal
from .._models import BaseModel
-from .category import Category
-from .product_code import ProductCode
from .enrollment_status import EnrollmentStatus
__all__ = ["Enrollment", "Benefit"]
@@ -17,7 +16,7 @@ class Benefit(BaseModel):
id: str
"""Benefit product ID (bprd\\__\\**)"""
- category: Category
+ category: Literal["Medical", "Dental", "Vision", "Hospital"]
"""
- `Medical` - Medical
- `Dental` - Dental
@@ -28,7 +27,23 @@ class Benefit(BaseModel):
name: str
"""Display name of the benefit product"""
- product_code: ProductCode
+ product_code: Literal[
+ "EBA",
+ "VPC",
+ "VPC_CORE",
+ "MEC",
+ "MEC2",
+ "MEC_PLUS",
+ "MVP",
+ "MVP2",
+ "MVPSL",
+ "MVPSL2",
+ "VD",
+ "VV",
+ "ICHRA",
+ "ICHRA_PREMIUM_PLUS",
+ "ICHRA_REIMBURSEMENT_ONLY",
+ ]
"""
- `EBA` - Eba Mec
- `VPC` - Vpc Enhanced
diff --git a/src/vitable_connect/types/enrollment_response.py b/src/vitable_connect/types/enrollment_retrieve_response.py
similarity index 73%
rename from src/vitable_connect/types/enrollment_response.py
rename to src/vitable_connect/types/enrollment_retrieve_response.py
index 4170224..22f2afb 100644
--- a/src/vitable_connect/types/enrollment_response.py
+++ b/src/vitable_connect/types/enrollment_retrieve_response.py
@@ -3,10 +3,10 @@
from .._models import BaseModel
from .enrollment import Enrollment
-__all__ = ["EnrollmentResponse"]
+__all__ = ["EnrollmentRetrieveResponse"]
-class EnrollmentResponse(BaseModel):
+class EnrollmentRetrieveResponse(BaseModel):
"""Response containing a single enrollment resource."""
data: Enrollment
diff --git a/src/vitable_connect/types/members/__init__.py b/src/vitable_connect/types/members/__init__.py
deleted file mode 100644
index f8ee8b1..0000000
--- a/src/vitable_connect/types/members/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
diff --git a/src/vitable_connect/types/product_code.py b/src/vitable_connect/types/product_code.py
deleted file mode 100644
index 55938bd..0000000
--- a/src/vitable_connect/types/product_code.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["ProductCode"]
-
-ProductCode: TypeAlias = Literal[
- "EBA",
- "VPC",
- "VPC_CORE",
- "MEC",
- "MEC2",
- "MEC_PLUS",
- "MVP",
- "MVP2",
- "MVPSL",
- "MVPSL2",
- "VD",
- "VV",
- "ICHRA",
- "ICHRA_PREMIUM_PLUS",
- "ICHRA_REIMBURSEMENT_ONLY",
-]
diff --git a/tests/api_resources/employees/__init__.py b/tests/api_resources/employees/__init__.py
deleted file mode 100644
index fd8019a..0000000
--- a/tests/api_resources/employees/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
diff --git a/tests/api_resources/employees/test_enrollments.py b/tests/api_resources/employees/test_enrollments.py
deleted file mode 100644
index bcfd0c5..0000000
--- a/tests/api_resources/employees/test_enrollments.py
+++ /dev/null
@@ -1,128 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types.employees import EnrollmentList
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestEnrollments:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: VitableConnect) -> None:
- enrollment = client.employees.enrollments.list(
- employee_id="empl_abc123def456",
- )
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: VitableConnect) -> None:
- enrollment = client.employees.enrollments.list(
- employee_id="empl_abc123def456",
- limit=20,
- page=1,
- )
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: VitableConnect) -> None:
- response = client.employees.enrollments.with_raw_response.list(
- employee_id="empl_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- enrollment = response.parse()
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: VitableConnect) -> None:
- with client.employees.enrollments.with_streaming_response.list(
- employee_id="empl_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- enrollment = response.parse()
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_list(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employee_id` but received ''"):
- client.employees.enrollments.with_raw_response.list(
- employee_id="",
- )
-
-
-class TestAsyncEnrollments:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
- enrollment = await async_client.employees.enrollments.list(
- employee_id="empl_abc123def456",
- )
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- enrollment = await async_client.employees.enrollments.list(
- employee_id="empl_abc123def456",
- limit=20,
- page=1,
- )
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_list(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.employees.enrollments.with_raw_response.list(
- employee_id="empl_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- enrollment = await response.parse()
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_list(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.employees.enrollments.with_streaming_response.list(
- employee_id="empl_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- enrollment = await response.parse()
- assert_matches_type(EnrollmentList, enrollment, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_list(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employee_id` but received ''"):
- await async_client.employees.enrollments.with_raw_response.list(
- employee_id="",
- )
diff --git a/tests/api_resources/employers/__init__.py b/tests/api_resources/employers/__init__.py
deleted file mode 100644
index fd8019a..0000000
--- a/tests/api_resources/employers/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
diff --git a/tests/api_resources/employers/test_employees.py b/tests/api_resources/employers/test_employees.py
deleted file mode 100644
index 1f0b25c..0000000
--- a/tests/api_resources/employers/test_employees.py
+++ /dev/null
@@ -1,128 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types.employers import EmployeeListResponse
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestEmployees:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: VitableConnect) -> None:
- employee = client.employers.employees.list(
- employer_id="empr_abc123def456",
- )
- assert_matches_type(EmployeeListResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: VitableConnect) -> None:
- employee = client.employers.employees.list(
- employer_id="empr_abc123def456",
- limit=20,
- page=1,
- )
- assert_matches_type(EmployeeListResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: VitableConnect) -> None:
- response = client.employers.employees.with_raw_response.list(
- employer_id="empr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- employee = response.parse()
- assert_matches_type(EmployeeListResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: VitableConnect) -> None:
- with client.employers.employees.with_streaming_response.list(
- employer_id="empr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- employee = response.parse()
- assert_matches_type(EmployeeListResponse, employee, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_list(self, client: VitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
- client.employers.employees.with_raw_response.list(
- employer_id="",
- )
-
-
-class TestAsyncEmployees:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
- employee = await async_client.employers.employees.list(
- employer_id="empr_abc123def456",
- )
- assert_matches_type(EmployeeListResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list_with_all_params(self, async_client: AsyncVitableConnect) -> None:
- employee = await async_client.employers.employees.list(
- employer_id="empr_abc123def456",
- limit=20,
- page=1,
- )
- assert_matches_type(EmployeeListResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_list(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.employers.employees.with_raw_response.list(
- employer_id="empr_abc123def456",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- employee = await response.parse()
- assert_matches_type(EmployeeListResponse, employee, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_list(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.employers.employees.with_streaming_response.list(
- employer_id="empr_abc123def456",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- employee = await response.parse()
- assert_matches_type(EmployeeListResponse, employee, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_list(self, async_client: AsyncVitableConnect) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
- await async_client.employers.employees.with_raw_response.list(
- employer_id="",
- )
diff --git a/tests/api_resources/test_employees.py b/tests/api_resources/test_employees.py
index d44932d..3580072 100644
--- a/tests/api_resources/test_employees.py
+++ b/tests/api_resources/test_employees.py
@@ -9,7 +9,10 @@
from tests.utils import assert_matches_type
from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types import EmployeeResponse
+from vitable_connect.types import (
+ EmployeeRetrieveResponse,
+ EmployeeListEnrollmentsResponse,
+)
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -23,7 +26,7 @@ def test_method_retrieve(self, client: VitableConnect) -> None:
employee = client.employees.retrieve(
"empl_abc123def456",
)
- assert_matches_type(EmployeeResponse, employee, path=["response"])
+ assert_matches_type(EmployeeRetrieveResponse, employee, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -35,7 +38,7 @@ def test_raw_response_retrieve(self, client: VitableConnect) -> None:
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employee = response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
+ assert_matches_type(EmployeeRetrieveResponse, employee, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -47,7 +50,7 @@ def test_streaming_response_retrieve(self, client: VitableConnect) -> None:
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employee = response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
+ assert_matches_type(EmployeeRetrieveResponse, employee, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -59,6 +62,58 @@ def test_path_params_retrieve(self, client: VitableConnect) -> None:
"",
)
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_enrollments(self, client: VitableConnect) -> None:
+ employee = client.employees.list_enrollments(
+ employee_id="empl_abc123def456",
+ )
+ assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_enrollments_with_all_params(self, client: VitableConnect) -> None:
+ employee = client.employees.list_enrollments(
+ employee_id="empl_abc123def456",
+ limit=20,
+ page=1,
+ )
+ assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_list_enrollments(self, client: VitableConnect) -> None:
+ response = client.employees.with_raw_response.list_enrollments(
+ employee_id="empl_abc123def456",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ employee = response.parse()
+ assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_list_enrollments(self, client: VitableConnect) -> None:
+ with client.employees.with_streaming_response.list_enrollments(
+ employee_id="empl_abc123def456",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ employee = response.parse()
+ assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_list_enrollments(self, client: VitableConnect) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `employee_id` but received ''"):
+ client.employees.with_raw_response.list_enrollments(
+ employee_id="",
+ )
+
class TestAsyncEmployees:
parametrize = pytest.mark.parametrize(
@@ -71,7 +126,7 @@ async def test_method_retrieve(self, async_client: AsyncVitableConnect) -> None:
employee = await async_client.employees.retrieve(
"empl_abc123def456",
)
- assert_matches_type(EmployeeResponse, employee, path=["response"])
+ assert_matches_type(EmployeeRetrieveResponse, employee, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -83,7 +138,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncVitableConnect) ->
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employee = await response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
+ assert_matches_type(EmployeeRetrieveResponse, employee, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -95,7 +150,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncVitableConne
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employee = await response.parse()
- assert_matches_type(EmployeeResponse, employee, path=["response"])
+ assert_matches_type(EmployeeRetrieveResponse, employee, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -106,3 +161,55 @@ async def test_path_params_retrieve(self, async_client: AsyncVitableConnect) ->
await async_client.employees.with_raw_response.retrieve(
"",
)
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list_enrollments(self, async_client: AsyncVitableConnect) -> None:
+ employee = await async_client.employees.list_enrollments(
+ employee_id="empl_abc123def456",
+ )
+ assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list_enrollments_with_all_params(self, async_client: AsyncVitableConnect) -> None:
+ employee = await async_client.employees.list_enrollments(
+ employee_id="empl_abc123def456",
+ limit=20,
+ page=1,
+ )
+ assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_list_enrollments(self, async_client: AsyncVitableConnect) -> None:
+ response = await async_client.employees.with_raw_response.list_enrollments(
+ employee_id="empl_abc123def456",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ employee = await response.parse()
+ assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_list_enrollments(self, async_client: AsyncVitableConnect) -> None:
+ async with async_client.employees.with_streaming_response.list_enrollments(
+ employee_id="empl_abc123def456",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ employee = await response.parse()
+ assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_path_params_list_enrollments(self, async_client: AsyncVitableConnect) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `employee_id` but received ''"):
+ await async_client.employees.with_raw_response.list_enrollments(
+ employee_id="",
+ )
diff --git a/tests/api_resources/test_employers.py b/tests/api_resources/test_employers.py
index c501c34..d84dd92 100644
--- a/tests/api_resources/test_employers.py
+++ b/tests/api_resources/test_employers.py
@@ -13,7 +13,10 @@
EmployerResponse,
EmployerListResponse,
BenefitEligibilityPolicy,
+ EmployerListEmployeesResponse,
+ EmployerSubmitCensusSyncResponse,
)
+from vitable_connect._utils import parse_date
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -181,8 +184,8 @@ def test_streaming_response_list(self, client: VitableConnect) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- def test_method_create_eligibility_policy(self, client: VitableConnect) -> None:
- employer = client.employers.create_eligibility_policy(
+ def test_method_create_benefit_eligibility_policy(self, client: VitableConnect) -> None:
+ employer = client.employers.create_benefit_eligibility_policy(
employer_id="empr_abc123def456",
classification="classification",
waiting_period="waiting_period",
@@ -191,8 +194,8 @@ def test_method_create_eligibility_policy(self, client: VitableConnect) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- def test_raw_response_create_eligibility_policy(self, client: VitableConnect) -> None:
- response = client.employers.with_raw_response.create_eligibility_policy(
+ def test_raw_response_create_benefit_eligibility_policy(self, client: VitableConnect) -> None:
+ response = client.employers.with_raw_response.create_benefit_eligibility_policy(
employer_id="empr_abc123def456",
classification="classification",
waiting_period="waiting_period",
@@ -205,8 +208,8 @@ def test_raw_response_create_eligibility_policy(self, client: VitableConnect) ->
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- def test_streaming_response_create_eligibility_policy(self, client: VitableConnect) -> None:
- with client.employers.with_streaming_response.create_eligibility_policy(
+ def test_streaming_response_create_benefit_eligibility_policy(self, client: VitableConnect) -> None:
+ with client.employers.with_streaming_response.create_benefit_eligibility_policy(
employer_id="empr_abc123def456",
classification="classification",
waiting_period="waiting_period",
@@ -221,14 +224,172 @@ def test_streaming_response_create_eligibility_policy(self, client: VitableConne
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- def test_path_params_create_eligibility_policy(self, client: VitableConnect) -> None:
+ def test_path_params_create_benefit_eligibility_policy(self, client: VitableConnect) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
- client.employers.with_raw_response.create_eligibility_policy(
+ client.employers.with_raw_response.create_benefit_eligibility_policy(
employer_id="",
classification="classification",
waiting_period="waiting_period",
)
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_employees(self, client: VitableConnect) -> None:
+ employer = client.employers.list_employees(
+ employer_id="empr_abc123def456",
+ )
+ assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_employees_with_all_params(self, client: VitableConnect) -> None:
+ employer = client.employers.list_employees(
+ employer_id="empr_abc123def456",
+ limit=20,
+ page=1,
+ )
+ assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_list_employees(self, client: VitableConnect) -> None:
+ response = client.employers.with_raw_response.list_employees(
+ employer_id="empr_abc123def456",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ employer = response.parse()
+ assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_list_employees(self, client: VitableConnect) -> None:
+ with client.employers.with_streaming_response.list_employees(
+ employer_id="empr_abc123def456",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ employer = response.parse()
+ assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_list_employees(self, client: VitableConnect) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
+ client.employers.with_raw_response.list_employees(
+ employer_id="",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_submit_census_sync(self, client: VitableConnect) -> None:
+ employer = client.employers.submit_census_sync(
+ employer_id="empr_abc123def456",
+ employees=[
+ {
+ "date_of_birth": parse_date("1990-05-15"),
+ "email": "jane.doe@acme.com",
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "phone": "4155550100",
+ },
+ {
+ "date_of_birth": parse_date("1985-11-20"),
+ "email": "john.smith@acme.com",
+ "first_name": "John",
+ "last_name": "Smith",
+ "phone": "4155550101",
+ },
+ ],
+ )
+ assert_matches_type(EmployerSubmitCensusSyncResponse, employer, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_submit_census_sync(self, client: VitableConnect) -> None:
+ response = client.employers.with_raw_response.submit_census_sync(
+ employer_id="empr_abc123def456",
+ employees=[
+ {
+ "date_of_birth": parse_date("1990-05-15"),
+ "email": "jane.doe@acme.com",
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "phone": "4155550100",
+ },
+ {
+ "date_of_birth": parse_date("1985-11-20"),
+ "email": "john.smith@acme.com",
+ "first_name": "John",
+ "last_name": "Smith",
+ "phone": "4155550101",
+ },
+ ],
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ employer = response.parse()
+ assert_matches_type(EmployerSubmitCensusSyncResponse, employer, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_submit_census_sync(self, client: VitableConnect) -> None:
+ with client.employers.with_streaming_response.submit_census_sync(
+ employer_id="empr_abc123def456",
+ employees=[
+ {
+ "date_of_birth": parse_date("1990-05-15"),
+ "email": "jane.doe@acme.com",
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "phone": "4155550100",
+ },
+ {
+ "date_of_birth": parse_date("1985-11-20"),
+ "email": "john.smith@acme.com",
+ "first_name": "John",
+ "last_name": "Smith",
+ "phone": "4155550101",
+ },
+ ],
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ employer = response.parse()
+ assert_matches_type(EmployerSubmitCensusSyncResponse, employer, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_submit_census_sync(self, client: VitableConnect) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
+ client.employers.with_raw_response.submit_census_sync(
+ employer_id="",
+ employees=[
+ {
+ "date_of_birth": parse_date("1990-05-15"),
+ "email": "jane.doe@acme.com",
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "phone": "4155550100",
+ },
+ {
+ "date_of_birth": parse_date("1985-11-20"),
+ "email": "john.smith@acme.com",
+ "first_name": "John",
+ "last_name": "Smith",
+ "phone": "4155550101",
+ },
+ ],
+ )
+
class TestAsyncEmployers:
parametrize = pytest.mark.parametrize(
@@ -395,8 +556,8 @@ async def test_streaming_response_list(self, async_client: AsyncVitableConnect)
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_create_eligibility_policy(self, async_client: AsyncVitableConnect) -> None:
- employer = await async_client.employers.create_eligibility_policy(
+ async def test_method_create_benefit_eligibility_policy(self, async_client: AsyncVitableConnect) -> None:
+ employer = await async_client.employers.create_benefit_eligibility_policy(
employer_id="empr_abc123def456",
classification="classification",
waiting_period="waiting_period",
@@ -405,8 +566,8 @@ async def test_method_create_eligibility_policy(self, async_client: AsyncVitable
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_raw_response_create_eligibility_policy(self, async_client: AsyncVitableConnect) -> None:
- response = await async_client.employers.with_raw_response.create_eligibility_policy(
+ async def test_raw_response_create_benefit_eligibility_policy(self, async_client: AsyncVitableConnect) -> None:
+ response = await async_client.employers.with_raw_response.create_benefit_eligibility_policy(
employer_id="empr_abc123def456",
classification="classification",
waiting_period="waiting_period",
@@ -419,8 +580,10 @@ async def test_raw_response_create_eligibility_policy(self, async_client: AsyncV
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_streaming_response_create_eligibility_policy(self, async_client: AsyncVitableConnect) -> None:
- async with async_client.employers.with_streaming_response.create_eligibility_policy(
+ async def test_streaming_response_create_benefit_eligibility_policy(
+ self, async_client: AsyncVitableConnect
+ ) -> None:
+ async with async_client.employers.with_streaming_response.create_benefit_eligibility_policy(
employer_id="empr_abc123def456",
classification="classification",
waiting_period="waiting_period",
@@ -435,10 +598,168 @@ async def test_streaming_response_create_eligibility_policy(self, async_client:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_path_params_create_eligibility_policy(self, async_client: AsyncVitableConnect) -> None:
+ async def test_path_params_create_benefit_eligibility_policy(self, async_client: AsyncVitableConnect) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
- await async_client.employers.with_raw_response.create_eligibility_policy(
+ await async_client.employers.with_raw_response.create_benefit_eligibility_policy(
employer_id="",
classification="classification",
waiting_period="waiting_period",
)
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list_employees(self, async_client: AsyncVitableConnect) -> None:
+ employer = await async_client.employers.list_employees(
+ employer_id="empr_abc123def456",
+ )
+ assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list_employees_with_all_params(self, async_client: AsyncVitableConnect) -> None:
+ employer = await async_client.employers.list_employees(
+ employer_id="empr_abc123def456",
+ limit=20,
+ page=1,
+ )
+ assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_list_employees(self, async_client: AsyncVitableConnect) -> None:
+ response = await async_client.employers.with_raw_response.list_employees(
+ employer_id="empr_abc123def456",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ employer = await response.parse()
+ assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_list_employees(self, async_client: AsyncVitableConnect) -> None:
+ async with async_client.employers.with_streaming_response.list_employees(
+ employer_id="empr_abc123def456",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ employer = await response.parse()
+ assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_path_params_list_employees(self, async_client: AsyncVitableConnect) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
+ await async_client.employers.with_raw_response.list_employees(
+ employer_id="",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_submit_census_sync(self, async_client: AsyncVitableConnect) -> None:
+ employer = await async_client.employers.submit_census_sync(
+ employer_id="empr_abc123def456",
+ employees=[
+ {
+ "date_of_birth": parse_date("1990-05-15"),
+ "email": "jane.doe@acme.com",
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "phone": "4155550100",
+ },
+ {
+ "date_of_birth": parse_date("1985-11-20"),
+ "email": "john.smith@acme.com",
+ "first_name": "John",
+ "last_name": "Smith",
+ "phone": "4155550101",
+ },
+ ],
+ )
+ assert_matches_type(EmployerSubmitCensusSyncResponse, employer, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_submit_census_sync(self, async_client: AsyncVitableConnect) -> None:
+ response = await async_client.employers.with_raw_response.submit_census_sync(
+ employer_id="empr_abc123def456",
+ employees=[
+ {
+ "date_of_birth": parse_date("1990-05-15"),
+ "email": "jane.doe@acme.com",
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "phone": "4155550100",
+ },
+ {
+ "date_of_birth": parse_date("1985-11-20"),
+ "email": "john.smith@acme.com",
+ "first_name": "John",
+ "last_name": "Smith",
+ "phone": "4155550101",
+ },
+ ],
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ employer = await response.parse()
+ assert_matches_type(EmployerSubmitCensusSyncResponse, employer, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_submit_census_sync(self, async_client: AsyncVitableConnect) -> None:
+ async with async_client.employers.with_streaming_response.submit_census_sync(
+ employer_id="empr_abc123def456",
+ employees=[
+ {
+ "date_of_birth": parse_date("1990-05-15"),
+ "email": "jane.doe@acme.com",
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "phone": "4155550100",
+ },
+ {
+ "date_of_birth": parse_date("1985-11-20"),
+ "email": "john.smith@acme.com",
+ "first_name": "John",
+ "last_name": "Smith",
+ "phone": "4155550101",
+ },
+ ],
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ employer = await response.parse()
+ assert_matches_type(EmployerSubmitCensusSyncResponse, employer, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_path_params_submit_census_sync(self, async_client: AsyncVitableConnect) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `employer_id` but received ''"):
+ await async_client.employers.with_raw_response.submit_census_sync(
+ employer_id="",
+ employees=[
+ {
+ "date_of_birth": parse_date("1990-05-15"),
+ "email": "jane.doe@acme.com",
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "phone": "4155550100",
+ },
+ {
+ "date_of_birth": parse_date("1985-11-20"),
+ "email": "john.smith@acme.com",
+ "first_name": "John",
+ "last_name": "Smith",
+ "phone": "4155550101",
+ },
+ ],
+ )
diff --git a/tests/api_resources/test_enrollments.py b/tests/api_resources/test_enrollments.py
index 06a7c57..a8f4d75 100644
--- a/tests/api_resources/test_enrollments.py
+++ b/tests/api_resources/test_enrollments.py
@@ -9,7 +9,7 @@
from tests.utils import assert_matches_type
from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types import EnrollmentResponse
+from vitable_connect.types import EnrollmentRetrieveResponse
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -23,7 +23,7 @@ def test_method_retrieve(self, client: VitableConnect) -> None:
enrollment = client.enrollments.retrieve(
"enrl_abc123def456",
)
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
+ assert_matches_type(EnrollmentRetrieveResponse, enrollment, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -35,7 +35,7 @@ def test_raw_response_retrieve(self, client: VitableConnect) -> None:
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
enrollment = response.parse()
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
+ assert_matches_type(EnrollmentRetrieveResponse, enrollment, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -47,7 +47,7 @@ def test_streaming_response_retrieve(self, client: VitableConnect) -> None:
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
enrollment = response.parse()
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
+ assert_matches_type(EnrollmentRetrieveResponse, enrollment, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -71,7 +71,7 @@ async def test_method_retrieve(self, async_client: AsyncVitableConnect) -> None:
enrollment = await async_client.enrollments.retrieve(
"enrl_abc123def456",
)
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
+ assert_matches_type(EnrollmentRetrieveResponse, enrollment, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -83,7 +83,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncVitableConnect) ->
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
enrollment = await response.parse()
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
+ assert_matches_type(EnrollmentRetrieveResponse, enrollment, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -95,7 +95,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncVitableConne
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
enrollment = await response.parse()
- assert_matches_type(EnrollmentResponse, enrollment, path=["response"])
+ assert_matches_type(EnrollmentRetrieveResponse, enrollment, path=["response"])
assert cast(Any, response.is_closed) is True
From 311d294e50fb62fde627e0e0619064ff05018cb7 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 19 Mar 2026 14:44:35 +0000
Subject: [PATCH 06/14] feat(api): manual updates
---
.stats.yml | 2 +-
README.md | 71 +++++++++++++++++
api.md | 28 ++-----
src/vitable_connect/pagination.py | 77 +++++++++++++++++++
.../resources/benefit_eligibility_policies.py | 10 +--
src/vitable_connect/resources/employees.py | 25 +++---
src/vitable_connect/resources/employers.py | 53 +++++++------
src/vitable_connect/types/__init__.py | 4 +-
.../types/benefit_eligibility_policy.py | 10 +--
.../benefit_eligibility_policy_response.py | 12 +++
.../employee_list_enrollments_response.py | 18 -----
.../types/employer_list_employees_response.py | 18 -----
.../types/employer_list_response.py | 18 -----
.../test_benefit_eligibility_policies.py | 14 ++--
tests/api_resources/test_employees.py | 22 +++---
tests/api_resources/test_employers.py | 51 ++++++------
16 files changed, 263 insertions(+), 170 deletions(-)
create mode 100644 src/vitable_connect/pagination.py
create mode 100644 src/vitable_connect/types/benefit_eligibility_policy_response.py
delete mode 100644 src/vitable_connect/types/employee_list_enrollments_response.py
delete mode 100644 src/vitable_connect/types/employer_list_employees_response.py
delete mode 100644 src/vitable_connect/types/employer_list_response.py
diff --git a/.stats.yml b/.stats.yml
index cd64a23..bbfa7d4 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 11
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-0320b76d8102774d1e66595d7afa37964a6b6d8df15bf01fc90998f83576be1d.yml
openapi_spec_hash: 8d72aaaef87e5e28fcff79bfc13929e2
-config_hash: 8b9bb6e47640ef6f4c00f17f1f2c279b
+config_hash: 34d8b2878ff22e8e12e6213b1fd321f8
diff --git a/README.md b/README.md
index 9f3d18d..3125536 100644
--- a/README.md
+++ b/README.md
@@ -119,6 +119,77 @@ Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typ
Typed requests and responses provide autocomplete and documentation within your editor. If you would like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`.
+## Pagination
+
+List methods in the Vitable Connect API are paginated.
+
+This library provides auto-paginating iterators with each list response, so you do not have to request successive pages manually:
+
+```python
+from vitable_connect import VitableConnect
+
+client = VitableConnect()
+
+all_employees = []
+# Automatically fetches more pages as needed.
+for employee in client.employees.list_enrollments(
+ employee_id="empl_abc123def456",
+):
+ # Do something with employee here
+ all_employees.append(employee)
+print(all_employees)
+```
+
+Or, asynchronously:
+
+```python
+import asyncio
+from vitable_connect import AsyncVitableConnect
+
+client = AsyncVitableConnect()
+
+
+async def main() -> None:
+ all_employees = []
+ # Iterate through items across all pages, issuing requests as needed.
+ async for employee in client.employees.list_enrollments(
+ employee_id="empl_abc123def456",
+ ):
+ all_employees.append(employee)
+ print(all_employees)
+
+
+asyncio.run(main())
+```
+
+Alternatively, you can use the `.has_next_page()`, `.next_page_info()`, or `.get_next_page()` methods for more granular control working with pages:
+
+```python
+first_page = await client.employees.list_enrollments(
+ employee_id="empl_abc123def456",
+)
+if first_page.has_next_page():
+ print(f"will fetch next page using these details: {first_page.next_page_info()}")
+ next_page = await first_page.get_next_page()
+ print(f"number of items we just fetched: {len(next_page.data)}")
+
+# Remove `await` for non-async usage.
+```
+
+Or just work directly with the returned data:
+
+```python
+first_page = await client.employees.list_enrollments(
+ employee_id="empl_abc123def456",
+)
+
+print(f"page number: {first_page.pagination.page}") # => "page number: 1"
+for employee in first_page.data:
+ print(employee.id)
+
+# Remove `await` for non-async usage.
+```
+
## Nested params
Nested parameters are dictionaries, typed using `TypedDict`, for example:
diff --git a/api.md b/api.md
index 2429fb5..b614d80 100644
--- a/api.md
+++ b/api.md
@@ -15,53 +15,41 @@ Methods:
Types:
```python
-from vitable_connect.types import BenefitEligibilityPolicy
+from vitable_connect.types import BenefitEligibilityPolicy, BenefitEligibilityPolicyResponse
```
Methods:
-- client.benefit_eligibility_policies.retrieve(policy_id) -> BenefitEligibilityPolicy
+- client.benefit_eligibility_policies.retrieve(policy_id) -> BenefitEligibilityPolicyResponse
# Employees
Types:
```python
-from vitable_connect.types import (
- Employee,
- EmployeeClass,
- Pagination,
- EmployeeRetrieveResponse,
- EmployeeListEnrollmentsResponse,
-)
+from vitable_connect.types import Employee, EmployeeClass, Pagination, EmployeeRetrieveResponse
```
Methods:
- client.employees.retrieve(employee_id) -> EmployeeRetrieveResponse
-- client.employees.list_enrollments(employee_id, \*\*params) -> EmployeeListEnrollmentsResponse
+- client.employees.list_enrollments(employee_id, \*\*params) -> SyncPageNumberPage[Enrollment]
# Employers
Types:
```python
-from vitable_connect.types import (
- Employer,
- EmployerResponse,
- EmployerListResponse,
- EmployerListEmployeesResponse,
- EmployerSubmitCensusSyncResponse,
-)
+from vitable_connect.types import Employer, EmployerResponse, EmployerSubmitCensusSyncResponse
```
Methods:
- client.employers.create(\*\*params) -> EmployerResponse
- client.employers.retrieve(employer_id) -> EmployerResponse
-- client.employers.list(\*\*params) -> EmployerListResponse
-- client.employers.create_benefit_eligibility_policy(employer_id, \*\*params) -> BenefitEligibilityPolicy
-- client.employers.list_employees(employer_id, \*\*params) -> EmployerListEmployeesResponse
+- client.employers.list(\*\*params) -> SyncPageNumberPage[Employer]
+- client.employers.create_benefit_eligibility_policy(employer_id, \*\*params) -> BenefitEligibilityPolicyResponse
+- client.employers.list_employees(employer_id, \*\*params) -> SyncPageNumberPage[Employee]
- client.employers.submit_census_sync(employer_id, \*\*params) -> EmployerSubmitCensusSyncResponse
# Enrollments
diff --git a/src/vitable_connect/pagination.py b/src/vitable_connect/pagination.py
new file mode 100644
index 0000000..8f5cbce
--- /dev/null
+++ b/src/vitable_connect/pagination.py
@@ -0,0 +1,77 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List, Generic, TypeVar, Optional
+from typing_extensions import override
+
+from ._models import BaseModel
+from ._base_client import BasePage, PageInfo, BaseSyncPage, BaseAsyncPage
+
+__all__ = ["PageNumberPagePagination", "SyncPageNumberPage", "AsyncPageNumberPage"]
+
+_T = TypeVar("_T")
+
+
+class PageNumberPagePagination(BaseModel):
+ page: Optional[int] = None
+
+ total_pages: Optional[int] = None
+
+
+class SyncPageNumberPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
+ data: List[_T]
+ pagination: Optional[PageNumberPagePagination] = None
+
+ @override
+ def _get_page_items(self) -> List[_T]:
+ data = self.data
+ if not data:
+ return []
+ return data
+
+ @override
+ def next_page_info(self) -> Optional[PageInfo]:
+ current_page = None
+ if self.pagination is not None:
+ if self.pagination.page is not None:
+ current_page = self.pagination.page
+ if current_page is None:
+ current_page = 1
+
+ total_pages = None
+ if self.pagination is not None:
+ if self.pagination.total_pages is not None:
+ total_pages = self.pagination.total_pages
+ if total_pages is not None and current_page >= total_pages:
+ return None
+
+ return PageInfo(params={"page": current_page + 1})
+
+
+class AsyncPageNumberPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
+ data: List[_T]
+ pagination: Optional[PageNumberPagePagination] = None
+
+ @override
+ def _get_page_items(self) -> List[_T]:
+ data = self.data
+ if not data:
+ return []
+ return data
+
+ @override
+ def next_page_info(self) -> Optional[PageInfo]:
+ current_page = None
+ if self.pagination is not None:
+ if self.pagination.page is not None:
+ current_page = self.pagination.page
+ if current_page is None:
+ current_page = 1
+
+ total_pages = None
+ if self.pagination is not None:
+ if self.pagination.total_pages is not None:
+ total_pages = self.pagination.total_pages
+ if total_pages is not None and current_page >= total_pages:
+ return None
+
+ return PageInfo(params={"page": current_page + 1})
diff --git a/src/vitable_connect/resources/benefit_eligibility_policies.py b/src/vitable_connect/resources/benefit_eligibility_policies.py
index 5ec7ec5..0fe514e 100644
--- a/src/vitable_connect/resources/benefit_eligibility_policies.py
+++ b/src/vitable_connect/resources/benefit_eligibility_policies.py
@@ -14,7 +14,7 @@
async_to_streamed_response_wrapper,
)
from .._base_client import make_request_options
-from ..types.benefit_eligibility_policy import BenefitEligibilityPolicy
+from ..types.benefit_eligibility_policy_response import BenefitEligibilityPolicyResponse
__all__ = ["BenefitEligibilityPoliciesResource", "AsyncBenefitEligibilityPoliciesResource"]
@@ -51,7 +51,7 @@ def retrieve(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BenefitEligibilityPolicy:
+ ) -> BenefitEligibilityPolicyResponse:
"""
Retrieves a benefit eligibility policy by ID.
@@ -73,7 +73,7 @@ def retrieve(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- cast_to=BenefitEligibilityPolicy,
+ cast_to=BenefitEligibilityPolicyResponse,
)
@@ -109,7 +109,7 @@ async def retrieve(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BenefitEligibilityPolicy:
+ ) -> BenefitEligibilityPolicyResponse:
"""
Retrieves a benefit eligibility policy by ID.
@@ -131,7 +131,7 @@ async def retrieve(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- cast_to=BenefitEligibilityPolicy,
+ cast_to=BenefitEligibilityPolicyResponse,
)
diff --git a/src/vitable_connect/resources/employees.py b/src/vitable_connect/resources/employees.py
index 5a5365b..42d6ac9 100644
--- a/src/vitable_connect/resources/employees.py
+++ b/src/vitable_connect/resources/employees.py
@@ -6,7 +6,7 @@
from ..types import employee_list_enrollments_params
from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
+from .._utils import maybe_transform
from .._compat import cached_property
from .._resource import SyncAPIResource, AsyncAPIResource
from .._response import (
@@ -15,9 +15,10 @@
async_to_raw_response_wrapper,
async_to_streamed_response_wrapper,
)
-from .._base_client import make_request_options
+from ..pagination import SyncPageNumberPage, AsyncPageNumberPage
+from .._base_client import AsyncPaginator, make_request_options
+from ..types.enrollment import Enrollment
from ..types.employee_retrieve_response import EmployeeRetrieveResponse
-from ..types.employee_list_enrollments_response import EmployeeListEnrollmentsResponse
__all__ = ["EmployeesResource", "AsyncEmployeesResource"]
@@ -91,7 +92,7 @@ def list_enrollments(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployeeListEnrollmentsResponse:
+ ) -> SyncPageNumberPage[Enrollment]:
"""
Retrieves a paginated list of benefit enrollments for an employee.
@@ -112,8 +113,9 @@ def list_enrollments(
"""
if not employee_id:
raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- return self._get(
+ return self._get_api_list(
f"/v1/employees/{employee_id}/enrollments",
+ page=SyncPageNumberPage[Enrollment],
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -127,7 +129,7 @@ def list_enrollments(
employee_list_enrollments_params.EmployeeListEnrollmentsParams,
),
),
- cast_to=EmployeeListEnrollmentsResponse,
+ model=Enrollment,
)
@@ -188,7 +190,7 @@ async def retrieve(
cast_to=EmployeeRetrieveResponse,
)
- async def list_enrollments(
+ def list_enrollments(
self,
employee_id: str,
*,
@@ -200,7 +202,7 @@ async def list_enrollments(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployeeListEnrollmentsResponse:
+ ) -> AsyncPaginator[Enrollment, AsyncPageNumberPage[Enrollment]]:
"""
Retrieves a paginated list of benefit enrollments for an employee.
@@ -221,14 +223,15 @@ async def list_enrollments(
"""
if not employee_id:
raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
- return await self._get(
+ return self._get_api_list(
f"/v1/employees/{employee_id}/enrollments",
+ page=AsyncPageNumberPage[Enrollment],
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
extra_body=extra_body,
timeout=timeout,
- query=await async_maybe_transform(
+ query=maybe_transform(
{
"limit": limit,
"page": page,
@@ -236,7 +239,7 @@ async def list_enrollments(
employee_list_enrollments_params.EmployeeListEnrollmentsParams,
),
),
- cast_to=EmployeeListEnrollmentsResponse,
+ model=Enrollment,
)
diff --git a/src/vitable_connect/resources/employers.py b/src/vitable_connect/resources/employers.py
index 648f627..f5404de 100644
--- a/src/vitable_connect/resources/employers.py
+++ b/src/vitable_connect/resources/employers.py
@@ -23,11 +23,12 @@
async_to_raw_response_wrapper,
async_to_streamed_response_wrapper,
)
-from .._base_client import make_request_options
+from ..pagination import SyncPageNumberPage, AsyncPageNumberPage
+from .._base_client import AsyncPaginator, make_request_options
+from ..types.employee import Employee
+from ..types.employer import Employer
from ..types.employer_response import EmployerResponse
-from ..types.employer_list_response import EmployerListResponse
-from ..types.benefit_eligibility_policy import BenefitEligibilityPolicy
-from ..types.employer_list_employees_response import EmployerListEmployeesResponse
+from ..types.benefit_eligibility_policy_response import BenefitEligibilityPolicyResponse
from ..types.employer_submit_census_sync_response import EmployerSubmitCensusSyncResponse
__all__ = ["EmployersResource", "AsyncEmployersResource"]
@@ -159,7 +160,7 @@ def list(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployerListResponse:
+ ) -> SyncPageNumberPage[Employer]:
"""
Retrieves a paginated list of all employers belonging to the authenticated
organization. Results are sorted by creation date (newest first) and paginated
@@ -178,8 +179,9 @@ def list(
timeout: Override the client-level default timeout for this request, in seconds
"""
- return self._get(
+ return self._get_api_list(
"/v1/employers",
+ page=SyncPageNumberPage[Employer],
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -193,7 +195,7 @@ def list(
employer_list_params.EmployerListParams,
),
),
- cast_to=EmployerListResponse,
+ model=Employer,
)
def create_benefit_eligibility_policy(
@@ -208,7 +210,7 @@ def create_benefit_eligibility_policy(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BenefitEligibilityPolicy:
+ ) -> BenefitEligibilityPolicyResponse:
"""
Creates a benefit eligibility policy for the specified employer.
@@ -242,7 +244,7 @@ def create_benefit_eligibility_policy(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- cast_to=BenefitEligibilityPolicy,
+ cast_to=BenefitEligibilityPolicyResponse,
)
def list_employees(
@@ -257,7 +259,7 @@ def list_employees(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployerListEmployeesResponse:
+ ) -> SyncPageNumberPage[Employee]:
"""Retrieves a paginated list of all employees for a specific employer.
Results are
@@ -280,8 +282,9 @@ def list_employees(
"""
if not employer_id:
raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
- return self._get(
+ return self._get_api_list(
f"/v1/employers/{employer_id}/employees",
+ page=SyncPageNumberPage[Employee],
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -295,7 +298,7 @@ def list_employees(
employer_list_employees_params.EmployerListEmployeesParams,
),
),
- cast_to=EmployerListEmployeesResponse,
+ model=Employee,
)
def submit_census_sync(
@@ -456,7 +459,7 @@ async def retrieve(
cast_to=EmployerResponse,
)
- async def list(
+ def list(
self,
*,
limit: int | Omit = omit,
@@ -467,7 +470,7 @@ async def list(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployerListResponse:
+ ) -> AsyncPaginator[Employer, AsyncPageNumberPage[Employer]]:
"""
Retrieves a paginated list of all employers belonging to the authenticated
organization. Results are sorted by creation date (newest first) and paginated
@@ -486,14 +489,15 @@ async def list(
timeout: Override the client-level default timeout for this request, in seconds
"""
- return await self._get(
+ return self._get_api_list(
"/v1/employers",
+ page=AsyncPageNumberPage[Employer],
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
extra_body=extra_body,
timeout=timeout,
- query=await async_maybe_transform(
+ query=maybe_transform(
{
"limit": limit,
"page": page,
@@ -501,7 +505,7 @@ async def list(
employer_list_params.EmployerListParams,
),
),
- cast_to=EmployerListResponse,
+ model=Employer,
)
async def create_benefit_eligibility_policy(
@@ -516,7 +520,7 @@ async def create_benefit_eligibility_policy(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BenefitEligibilityPolicy:
+ ) -> BenefitEligibilityPolicyResponse:
"""
Creates a benefit eligibility policy for the specified employer.
@@ -550,10 +554,10 @@ async def create_benefit_eligibility_policy(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- cast_to=BenefitEligibilityPolicy,
+ cast_to=BenefitEligibilityPolicyResponse,
)
- async def list_employees(
+ def list_employees(
self,
employer_id: str,
*,
@@ -565,7 +569,7 @@ async def list_employees(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> EmployerListEmployeesResponse:
+ ) -> AsyncPaginator[Employee, AsyncPageNumberPage[Employee]]:
"""Retrieves a paginated list of all employees for a specific employer.
Results are
@@ -588,14 +592,15 @@ async def list_employees(
"""
if not employer_id:
raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
- return await self._get(
+ return self._get_api_list(
f"/v1/employers/{employer_id}/employees",
+ page=AsyncPageNumberPage[Employee],
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
extra_body=extra_body,
timeout=timeout,
- query=await async_maybe_transform(
+ query=maybe_transform(
{
"limit": limit,
"page": page,
@@ -603,7 +608,7 @@ async def list_employees(
employer_list_employees_params.EmployerListEmployeesParams,
),
),
- cast_to=EmployerListEmployeesResponse,
+ model=Employee,
)
async def submit_census_sync(
diff --git a/src/vitable_connect/types/__init__.py b/src/vitable_connect/types/__init__.py
index 79c8128..83e0519 100644
--- a/src/vitable_connect/types/__init__.py
+++ b/src/vitable_connect/types/__init__.py
@@ -12,7 +12,6 @@
from .enrollment_status import EnrollmentStatus as EnrollmentStatus
from .employer_list_params import EmployerListParams as EmployerListParams
from .employer_create_params import EmployerCreateParams as EmployerCreateParams
-from .employer_list_response import EmployerListResponse as EmployerListResponse
from .benefit_eligibility_policy import BenefitEligibilityPolicy as BenefitEligibilityPolicy
from .employee_retrieve_response import EmployeeRetrieveResponse as EmployeeRetrieveResponse
from .enrollment_retrieve_response import EnrollmentRetrieveResponse as EnrollmentRetrieveResponse
@@ -20,9 +19,8 @@
from .employer_list_employees_params import EmployerListEmployeesParams as EmployerListEmployeesParams
from .auth_issue_access_token_response import AuthIssueAccessTokenResponse as AuthIssueAccessTokenResponse
from .employee_list_enrollments_params import EmployeeListEnrollmentsParams as EmployeeListEnrollmentsParams
-from .employer_list_employees_response import EmployerListEmployeesResponse as EmployerListEmployeesResponse
-from .employee_list_enrollments_response import EmployeeListEnrollmentsResponse as EmployeeListEnrollmentsResponse
from .employer_submit_census_sync_params import EmployerSubmitCensusSyncParams as EmployerSubmitCensusSyncParams
+from .benefit_eligibility_policy_response import BenefitEligibilityPolicyResponse as BenefitEligibilityPolicyResponse
from .employer_submit_census_sync_response import EmployerSubmitCensusSyncResponse as EmployerSubmitCensusSyncResponse
from .employer_create_benefit_eligibility_policy_params import (
EmployerCreateBenefitEligibilityPolicyParams as EmployerCreateBenefitEligibilityPolicyParams,
diff --git a/src/vitable_connect/types/benefit_eligibility_policy.py b/src/vitable_connect/types/benefit_eligibility_policy.py
index d113c91..8ceafc2 100644
--- a/src/vitable_connect/types/benefit_eligibility_policy.py
+++ b/src/vitable_connect/types/benefit_eligibility_policy.py
@@ -4,10 +4,10 @@
from .._models import BaseModel
-__all__ = ["BenefitEligibilityPolicy", "Data"]
+__all__ = ["BenefitEligibilityPolicy"]
-class Data(BaseModel):
+class BenefitEligibilityPolicy(BaseModel):
id: str
active: bool
@@ -21,9 +21,3 @@ class Data(BaseModel):
updated_at: datetime
waiting_period: str
-
-
-class BenefitEligibilityPolicy(BaseModel):
- """Response containing a single benefit eligibility policy resource."""
-
- data: Data
diff --git a/src/vitable_connect/types/benefit_eligibility_policy_response.py b/src/vitable_connect/types/benefit_eligibility_policy_response.py
new file mode 100644
index 0000000..bbed3f9
--- /dev/null
+++ b/src/vitable_connect/types/benefit_eligibility_policy_response.py
@@ -0,0 +1,12 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from .._models import BaseModel
+from .benefit_eligibility_policy import BenefitEligibilityPolicy
+
+__all__ = ["BenefitEligibilityPolicyResponse"]
+
+
+class BenefitEligibilityPolicyResponse(BaseModel):
+ """Response containing a single benefit eligibility policy resource."""
+
+ data: BenefitEligibilityPolicy
diff --git a/src/vitable_connect/types/employee_list_enrollments_response.py b/src/vitable_connect/types/employee_list_enrollments_response.py
deleted file mode 100644
index f8ee923..0000000
--- a/src/vitable_connect/types/employee_list_enrollments_response.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List
-
-from .._models import BaseModel
-from .enrollment import Enrollment
-from .pagination import Pagination
-
-__all__ = ["EmployeeListEnrollmentsResponse"]
-
-
-class EmployeeListEnrollmentsResponse(BaseModel):
- """Paginated list response containing enrollment resources."""
-
- data: List[Enrollment]
-
- pagination: Pagination
- """Pagination metadata for list responses."""
diff --git a/src/vitable_connect/types/employer_list_employees_response.py b/src/vitable_connect/types/employer_list_employees_response.py
deleted file mode 100644
index fba5d85..0000000
--- a/src/vitable_connect/types/employer_list_employees_response.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List
-
-from .._models import BaseModel
-from .employee import Employee
-from .pagination import Pagination
-
-__all__ = ["EmployerListEmployeesResponse"]
-
-
-class EmployerListEmployeesResponse(BaseModel):
- """Paginated list response containing employee resources."""
-
- data: List[Employee]
-
- pagination: Pagination
- """Pagination metadata for list responses."""
diff --git a/src/vitable_connect/types/employer_list_response.py b/src/vitable_connect/types/employer_list_response.py
deleted file mode 100644
index 4360508..0000000
--- a/src/vitable_connect/types/employer_list_response.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List
-
-from .._models import BaseModel
-from .employer import Employer
-from .pagination import Pagination
-
-__all__ = ["EmployerListResponse"]
-
-
-class EmployerListResponse(BaseModel):
- """Paginated list response containing employer resources."""
-
- data: List[Employer]
-
- pagination: Pagination
- """Pagination metadata for list responses."""
diff --git a/tests/api_resources/test_benefit_eligibility_policies.py b/tests/api_resources/test_benefit_eligibility_policies.py
index cd1852e..9203b81 100644
--- a/tests/api_resources/test_benefit_eligibility_policies.py
+++ b/tests/api_resources/test_benefit_eligibility_policies.py
@@ -9,7 +9,7 @@
from tests.utils import assert_matches_type
from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types import BenefitEligibilityPolicy
+from vitable_connect.types import BenefitEligibilityPolicyResponse
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -23,7 +23,7 @@ def test_method_retrieve(self, client: VitableConnect) -> None:
benefit_eligibility_policy = client.benefit_eligibility_policies.retrieve(
"epol_abc123def456",
)
- assert_matches_type(BenefitEligibilityPolicy, benefit_eligibility_policy, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, benefit_eligibility_policy, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -35,7 +35,7 @@ def test_raw_response_retrieve(self, client: VitableConnect) -> None:
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
benefit_eligibility_policy = response.parse()
- assert_matches_type(BenefitEligibilityPolicy, benefit_eligibility_policy, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, benefit_eligibility_policy, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -47,7 +47,7 @@ def test_streaming_response_retrieve(self, client: VitableConnect) -> None:
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
benefit_eligibility_policy = response.parse()
- assert_matches_type(BenefitEligibilityPolicy, benefit_eligibility_policy, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, benefit_eligibility_policy, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -71,7 +71,7 @@ async def test_method_retrieve(self, async_client: AsyncVitableConnect) -> None:
benefit_eligibility_policy = await async_client.benefit_eligibility_policies.retrieve(
"epol_abc123def456",
)
- assert_matches_type(BenefitEligibilityPolicy, benefit_eligibility_policy, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, benefit_eligibility_policy, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -83,7 +83,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncVitableConnect) ->
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
benefit_eligibility_policy = await response.parse()
- assert_matches_type(BenefitEligibilityPolicy, benefit_eligibility_policy, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, benefit_eligibility_policy, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -95,7 +95,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncVitableConne
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
benefit_eligibility_policy = await response.parse()
- assert_matches_type(BenefitEligibilityPolicy, benefit_eligibility_policy, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, benefit_eligibility_policy, path=["response"])
assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_employees.py b/tests/api_resources/test_employees.py
index 3580072..fd13498 100644
--- a/tests/api_resources/test_employees.py
+++ b/tests/api_resources/test_employees.py
@@ -9,10 +9,8 @@
from tests.utils import assert_matches_type
from vitable_connect import VitableConnect, AsyncVitableConnect
-from vitable_connect.types import (
- EmployeeRetrieveResponse,
- EmployeeListEnrollmentsResponse,
-)
+from vitable_connect.types import Enrollment, EmployeeRetrieveResponse
+from vitable_connect.pagination import SyncPageNumberPage, AsyncPageNumberPage
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -68,7 +66,7 @@ def test_method_list_enrollments(self, client: VitableConnect) -> None:
employee = client.employees.list_enrollments(
employee_id="empl_abc123def456",
)
- assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Enrollment], employee, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -78,7 +76,7 @@ def test_method_list_enrollments_with_all_params(self, client: VitableConnect) -
limit=20,
page=1,
)
- assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Enrollment], employee, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -90,7 +88,7 @@ def test_raw_response_list_enrollments(self, client: VitableConnect) -> None:
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employee = response.parse()
- assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Enrollment], employee, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -102,7 +100,7 @@ def test_streaming_response_list_enrollments(self, client: VitableConnect) -> No
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employee = response.parse()
- assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Enrollment], employee, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -168,7 +166,7 @@ async def test_method_list_enrollments(self, async_client: AsyncVitableConnect)
employee = await async_client.employees.list_enrollments(
employee_id="empl_abc123def456",
)
- assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Enrollment], employee, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -178,7 +176,7 @@ async def test_method_list_enrollments_with_all_params(self, async_client: Async
limit=20,
page=1,
)
- assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Enrollment], employee, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -190,7 +188,7 @@ async def test_raw_response_list_enrollments(self, async_client: AsyncVitableCon
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employee = await response.parse()
- assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Enrollment], employee, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -202,7 +200,7 @@ async def test_streaming_response_list_enrollments(self, async_client: AsyncVita
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employee = await response.parse()
- assert_matches_type(EmployeeListEnrollmentsResponse, employee, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Enrollment], employee, path=["response"])
assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_employers.py b/tests/api_resources/test_employers.py
index d84dd92..6587e47 100644
--- a/tests/api_resources/test_employers.py
+++ b/tests/api_resources/test_employers.py
@@ -10,13 +10,14 @@
from tests.utils import assert_matches_type
from vitable_connect import VitableConnect, AsyncVitableConnect
from vitable_connect.types import (
+ Employee,
+ Employer,
EmployerResponse,
- EmployerListResponse,
- BenefitEligibilityPolicy,
- EmployerListEmployeesResponse,
+ BenefitEligibilityPolicyResponse,
EmployerSubmitCensusSyncResponse,
)
from vitable_connect._utils import parse_date
+from vitable_connect.pagination import SyncPageNumberPage, AsyncPageNumberPage
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -149,7 +150,7 @@ def test_path_params_retrieve(self, client: VitableConnect) -> None:
@parametrize
def test_method_list(self, client: VitableConnect) -> None:
employer = client.employers.list()
- assert_matches_type(EmployerListResponse, employer, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Employer], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -158,7 +159,7 @@ def test_method_list_with_all_params(self, client: VitableConnect) -> None:
limit=20,
page=1,
)
- assert_matches_type(EmployerListResponse, employer, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Employer], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -168,7 +169,7 @@ def test_raw_response_list(self, client: VitableConnect) -> None:
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = response.parse()
- assert_matches_type(EmployerListResponse, employer, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Employer], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -178,7 +179,7 @@ def test_streaming_response_list(self, client: VitableConnect) -> None:
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = response.parse()
- assert_matches_type(EmployerListResponse, employer, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Employer], employer, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -190,7 +191,7 @@ def test_method_create_benefit_eligibility_policy(self, client: VitableConnect)
classification="classification",
waiting_period="waiting_period",
)
- assert_matches_type(BenefitEligibilityPolicy, employer, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -204,7 +205,7 @@ def test_raw_response_create_benefit_eligibility_policy(self, client: VitableCon
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = response.parse()
- assert_matches_type(BenefitEligibilityPolicy, employer, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -218,7 +219,7 @@ def test_streaming_response_create_benefit_eligibility_policy(self, client: Vita
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = response.parse()
- assert_matches_type(BenefitEligibilityPolicy, employer, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, employer, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -238,7 +239,7 @@ def test_method_list_employees(self, client: VitableConnect) -> None:
employer = client.employers.list_employees(
employer_id="empr_abc123def456",
)
- assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Employee], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -248,7 +249,7 @@ def test_method_list_employees_with_all_params(self, client: VitableConnect) ->
limit=20,
page=1,
)
- assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Employee], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -260,7 +261,7 @@ def test_raw_response_list_employees(self, client: VitableConnect) -> None:
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = response.parse()
- assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Employee], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -272,7 +273,7 @@ def test_streaming_response_list_employees(self, client: VitableConnect) -> None
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = response.parse()
- assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+ assert_matches_type(SyncPageNumberPage[Employee], employer, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -521,7 +522,7 @@ async def test_path_params_retrieve(self, async_client: AsyncVitableConnect) ->
@parametrize
async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
employer = await async_client.employers.list()
- assert_matches_type(EmployerListResponse, employer, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Employer], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -530,7 +531,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncVitableConne
limit=20,
page=1,
)
- assert_matches_type(EmployerListResponse, employer, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Employer], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -540,7 +541,7 @@ async def test_raw_response_list(self, async_client: AsyncVitableConnect) -> Non
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = await response.parse()
- assert_matches_type(EmployerListResponse, employer, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Employer], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -550,7 +551,7 @@ async def test_streaming_response_list(self, async_client: AsyncVitableConnect)
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = await response.parse()
- assert_matches_type(EmployerListResponse, employer, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Employer], employer, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -562,7 +563,7 @@ async def test_method_create_benefit_eligibility_policy(self, async_client: Asyn
classification="classification",
waiting_period="waiting_period",
)
- assert_matches_type(BenefitEligibilityPolicy, employer, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -576,7 +577,7 @@ async def test_raw_response_create_benefit_eligibility_policy(self, async_client
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = await response.parse()
- assert_matches_type(BenefitEligibilityPolicy, employer, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -592,7 +593,7 @@ async def test_streaming_response_create_benefit_eligibility_policy(
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = await response.parse()
- assert_matches_type(BenefitEligibilityPolicy, employer, path=["response"])
+ assert_matches_type(BenefitEligibilityPolicyResponse, employer, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -612,7 +613,7 @@ async def test_method_list_employees(self, async_client: AsyncVitableConnect) ->
employer = await async_client.employers.list_employees(
employer_id="empr_abc123def456",
)
- assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Employee], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -622,7 +623,7 @@ async def test_method_list_employees_with_all_params(self, async_client: AsyncVi
limit=20,
page=1,
)
- assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Employee], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -634,7 +635,7 @@ async def test_raw_response_list_employees(self, async_client: AsyncVitableConne
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = await response.parse()
- assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Employee], employer, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
@@ -646,7 +647,7 @@ async def test_streaming_response_list_employees(self, async_client: AsyncVitabl
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
employer = await response.parse()
- assert_matches_type(EmployerListEmployeesResponse, employer, path=["response"])
+ assert_matches_type(AsyncPageNumberPage[Employee], employer, path=["response"])
assert cast(Any, response.is_closed) is True
From 514d3d619ae119991b45b51628bba9e841f830e8 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 19 Mar 2026 14:45:46 +0000
Subject: [PATCH 07/14] codegen metadata
---
.stats.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.stats.yml b/.stats.yml
index bbfa7d4..080972c 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 11
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-0320b76d8102774d1e66595d7afa37964a6b6d8df15bf01fc90998f83576be1d.yml
openapi_spec_hash: 8d72aaaef87e5e28fcff79bfc13929e2
-config_hash: 34d8b2878ff22e8e12e6213b1fd321f8
+config_hash: b2785e64755992b57f6a246545070920
From f29a9244a92c5205cd978c2adc176b9428c0be4f Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 19 Mar 2026 23:27:32 +0000
Subject: [PATCH 08/14] chore: update SDK settings
---
.github/workflows/publish-pypi.yml | 28 ++++++++
.github/workflows/release-doctor.yml | 21 ++++++
.release-please-manifest.json | 3 +
.stats.yml | 2 +-
CONTRIBUTING.md | 4 +-
README.md | 14 ++--
bin/check-release-environment | 21 ++++++
pyproject.toml | 6 +-
release-please-config.json | 66 +++++++++++++++++++
src/vitable_connect/_version.py | 2 +-
src/vitable_connect/resources/auth.py | 8 +--
.../resources/benefit_eligibility_policies.py | 8 +--
src/vitable_connect/resources/employees.py | 8 +--
src/vitable_connect/resources/employers.py | 8 +--
src/vitable_connect/resources/enrollments.py | 8 +--
15 files changed, 173 insertions(+), 34 deletions(-)
create mode 100644 .github/workflows/publish-pypi.yml
create mode 100644 .github/workflows/release-doctor.yml
create mode 100644 .release-please-manifest.json
create mode 100644 bin/check-release-environment
create mode 100644 release-please-config.json
diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml
new file mode 100644
index 0000000..68f7a19
--- /dev/null
+++ b/.github/workflows/publish-pypi.yml
@@ -0,0 +1,28 @@
+# This workflow is triggered when a GitHub release is created.
+# It can also be run manually to re-publish to PyPI in case it failed for some reason.
+# You can run this workflow by navigating to https://www.github.com/Vitable-Inc/vitable-connect-python/actions/workflows/publish-pypi.yml
+name: Publish PyPI
+on:
+ workflow_dispatch:
+
+ release:
+ types: [published]
+
+jobs:
+ publish:
+ name: publish
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@v5
+ with:
+ version: '0.9.13'
+
+ - name: Publish to PyPI
+ run: |
+ bash ./bin/publish-pypi
+ env:
+ PYPI_TOKEN: ${{ secrets.VITABLE_CONNECT_PYPI_TOKEN || secrets.PYPI_TOKEN }}
diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml
new file mode 100644
index 0000000..756818e
--- /dev/null
+++ b/.github/workflows/release-doctor.yml
@@ -0,0 +1,21 @@
+name: Release Doctor
+on:
+ pull_request:
+ branches:
+ - main
+ workflow_dispatch:
+
+jobs:
+ release_doctor:
+ name: release doctor
+ runs-on: ubuntu-latest
+ if: github.repository == 'Vitable-Inc/vitable-connect-python' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - name: Check release environment
+ run: |
+ bash ./bin/check-release-environment
+ env:
+ PYPI_TOKEN: ${{ secrets.VITABLE_CONNECT_PYPI_TOKEN || secrets.PYPI_TOKEN }}
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
new file mode 100644
index 0000000..cda9cbd
--- /dev/null
+++ b/.release-please-manifest.json
@@ -0,0 +1,3 @@
+{
+ ".": "0.1.2"
+}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index 080972c..964f684 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 11
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-0320b76d8102774d1e66595d7afa37964a6b6d8df15bf01fc90998f83576be1d.yml
openapi_spec_hash: 8d72aaaef87e5e28fcff79bfc13929e2
-config_hash: b2785e64755992b57f6a246545070920
+config_hash: 0ab0eb782e8ec37e6ad3475838a7ba8f
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 33d9197..d86e412 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -62,7 +62,7 @@ If you’d like to use the repository from source, you can either install from g
To install via git:
```sh
-$ pip install git+ssh://git@github.com/stainless-sdks/vitable-connect-python.git
+$ pip install git+ssh://git@github.com/Vitable-Inc/vitable-connect-python.git
```
Alternatively, you can build from source and install the wheel file:
@@ -113,7 +113,7 @@ the changes aren't made through the automated pipeline, you may want to make rel
### Publish with a GitHub workflow
-You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/stainless-sdks/vitable-connect-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up.
+You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/Vitable-Inc/vitable-connect-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up.
### Publish manually
diff --git a/README.md b/README.md
index 3125536..98c5277 100644
--- a/README.md
+++ b/README.md
@@ -16,8 +16,8 @@ The REST API documentation can be found on [vitablehealth.com](https://vitablehe
## Installation
```sh
-# install from this staging repo
-pip install git+ssh://git@github.com/stainless-sdks/vitable-connect-python.git
+# install from the production repo
+pip install git+ssh://git@github.com/Vitable-Inc/vitable-connect-python.git
```
> [!NOTE]
@@ -83,8 +83,8 @@ By default, the async client uses `httpx` for HTTP requests. However, for improv
You can enable this by installing `aiohttp`:
```sh
-# install from this staging repo
-pip install 'vitable_connect[aiohttp] @ git+ssh://git@github.com/stainless-sdks/vitable-connect-python.git'
+# install from the production repo
+pip install 'vitable_connect[aiohttp] @ git+ssh://git@github.com/Vitable-Inc/vitable-connect-python.git'
```
Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
@@ -347,9 +347,9 @@ auth = response.parse() # get the object that `auth.issue_access_token()` would
print(auth.access_token)
```
-These methods return an [`APIResponse`](https://github.com/stainless-sdks/vitable-connect-python/tree/main/src/vitable_connect/_response.py) object.
+These methods return an [`APIResponse`](https://github.com/Vitable-Inc/vitable-connect-python/tree/main/src/vitable_connect/_response.py) object.
-The async client returns an [`AsyncAPIResponse`](https://github.com/stainless-sdks/vitable-connect-python/tree/main/src/vitable_connect/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.
+The async client returns an [`AsyncAPIResponse`](https://github.com/Vitable-Inc/vitable-connect-python/tree/main/src/vitable_connect/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.
#### `.with_streaming_response`
@@ -455,7 +455,7 @@ This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) con
We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.
-We are keen for your feedback; please open an [issue](https://www.github.com/stainless-sdks/vitable-connect-python/issues) with questions, bugs, or suggestions.
+We are keen for your feedback; please open an [issue](https://www.github.com/Vitable-Inc/vitable-connect-python/issues) with questions, bugs, or suggestions.
### Determining the installed version
diff --git a/bin/check-release-environment b/bin/check-release-environment
new file mode 100644
index 0000000..b845b0f
--- /dev/null
+++ b/bin/check-release-environment
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+errors=()
+
+if [ -z "${PYPI_TOKEN}" ]; then
+ errors+=("The PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets.")
+fi
+
+lenErrors=${#errors[@]}
+
+if [[ lenErrors -gt 0 ]]; then
+ echo -e "Found the following errors in the release environment:\n"
+
+ for error in "${errors[@]}"; do
+ echo -e "- $error\n"
+ done
+
+ exit 1
+fi
+
+echo "The environment is ready to push releases!"
diff --git a/pyproject.toml b/pyproject.toml
index e155c5d..c021b62 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -37,8 +37,8 @@ classifiers = [
]
[project.urls]
-Homepage = "https://github.com/stainless-sdks/vitable-connect-python"
-Repository = "https://github.com/stainless-sdks/vitable-connect-python"
+Homepage = "https://github.com/Vitable-Inc/vitable-connect-python"
+Repository = "https://github.com/Vitable-Inc/vitable-connect-python"
[project.optional-dependencies]
aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
@@ -112,7 +112,7 @@ path = "README.md"
[[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]]
# replace relative links with absolute links
pattern = '\[(.+?)\]\(((?!https?://)\S+?)\)'
-replacement = '[\1](https://github.com/stainless-sdks/vitable-connect-python/tree/main/\g<2>)'
+replacement = '[\1](https://github.com/Vitable-Inc/vitable-connect-python/tree/main/\g<2>)'
[tool.pytest.ini_options]
testpaths = ["tests"]
diff --git a/release-please-config.json b/release-please-config.json
new file mode 100644
index 0000000..c3536c4
--- /dev/null
+++ b/release-please-config.json
@@ -0,0 +1,66 @@
+{
+ "packages": {
+ ".": {}
+ },
+ "$schema": "https://raw.githubusercontent.com/stainless-api/release-please/main/schemas/config.json",
+ "include-v-in-tag": true,
+ "include-component-in-tag": false,
+ "versioning": "prerelease",
+ "prerelease": true,
+ "bump-minor-pre-major": true,
+ "bump-patch-for-minor-pre-major": false,
+ "pull-request-header": "Automated Release PR",
+ "pull-request-title-pattern": "release: ${version}",
+ "changelog-sections": [
+ {
+ "type": "feat",
+ "section": "Features"
+ },
+ {
+ "type": "fix",
+ "section": "Bug Fixes"
+ },
+ {
+ "type": "perf",
+ "section": "Performance Improvements"
+ },
+ {
+ "type": "revert",
+ "section": "Reverts"
+ },
+ {
+ "type": "chore",
+ "section": "Chores"
+ },
+ {
+ "type": "docs",
+ "section": "Documentation"
+ },
+ {
+ "type": "style",
+ "section": "Styles"
+ },
+ {
+ "type": "refactor",
+ "section": "Refactors"
+ },
+ {
+ "type": "test",
+ "section": "Tests",
+ "hidden": true
+ },
+ {
+ "type": "build",
+ "section": "Build System"
+ },
+ {
+ "type": "ci",
+ "section": "Continuous Integration",
+ "hidden": true
+ }
+ ],
+ "release-type": "python",
+ "extra-files": [
+ "src/vitable_connect/_version.py"
+ ]
+}
\ No newline at end of file
diff --git a/src/vitable_connect/_version.py b/src/vitable_connect/_version.py
index cee8792..4c6c097 100644
--- a/src/vitable_connect/_version.py
+++ b/src/vitable_connect/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "vitable_connect"
-__version__ = "0.1.2"
+__version__ = "0.1.2" # x-release-please-version
diff --git a/src/vitable_connect/resources/auth.py b/src/vitable_connect/resources/auth.py
index f08a3fe..77344a0 100644
--- a/src/vitable_connect/resources/auth.py
+++ b/src/vitable_connect/resources/auth.py
@@ -33,7 +33,7 @@ def with_raw_response(self) -> AuthResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AuthResourceWithRawResponse(self)
@@ -42,7 +42,7 @@ def with_streaming_response(self) -> AuthResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
"""
return AuthResourceWithStreamingResponse(self)
@@ -102,7 +102,7 @@ def with_raw_response(self) -> AsyncAuthResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AsyncAuthResourceWithRawResponse(self)
@@ -111,7 +111,7 @@ def with_streaming_response(self) -> AsyncAuthResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
"""
return AsyncAuthResourceWithStreamingResponse(self)
diff --git a/src/vitable_connect/resources/benefit_eligibility_policies.py b/src/vitable_connect/resources/benefit_eligibility_policies.py
index 0fe514e..3030237 100644
--- a/src/vitable_connect/resources/benefit_eligibility_policies.py
+++ b/src/vitable_connect/resources/benefit_eligibility_policies.py
@@ -28,7 +28,7 @@ def with_raw_response(self) -> BenefitEligibilityPoliciesResourceWithRawResponse
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return BenefitEligibilityPoliciesResourceWithRawResponse(self)
@@ -37,7 +37,7 @@ def with_streaming_response(self) -> BenefitEligibilityPoliciesResourceWithStrea
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
"""
return BenefitEligibilityPoliciesResourceWithStreamingResponse(self)
@@ -86,7 +86,7 @@ def with_raw_response(self) -> AsyncBenefitEligibilityPoliciesResourceWithRawRes
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AsyncBenefitEligibilityPoliciesResourceWithRawResponse(self)
@@ -95,7 +95,7 @@ def with_streaming_response(self) -> AsyncBenefitEligibilityPoliciesResourceWith
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
"""
return AsyncBenefitEligibilityPoliciesResourceWithStreamingResponse(self)
diff --git a/src/vitable_connect/resources/employees.py b/src/vitable_connect/resources/employees.py
index 42d6ac9..3952d15 100644
--- a/src/vitable_connect/resources/employees.py
+++ b/src/vitable_connect/resources/employees.py
@@ -30,7 +30,7 @@ def with_raw_response(self) -> EmployeesResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return EmployeesResourceWithRawResponse(self)
@@ -39,7 +39,7 @@ def with_streaming_response(self) -> EmployeesResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
"""
return EmployeesResourceWithStreamingResponse(self)
@@ -140,7 +140,7 @@ def with_raw_response(self) -> AsyncEmployeesResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AsyncEmployeesResourceWithRawResponse(self)
@@ -149,7 +149,7 @@ def with_streaming_response(self) -> AsyncEmployeesResourceWithStreamingResponse
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
"""
return AsyncEmployeesResourceWithStreamingResponse(self)
diff --git a/src/vitable_connect/resources/employers.py b/src/vitable_connect/resources/employers.py
index f5404de..2e364d7 100644
--- a/src/vitable_connect/resources/employers.py
+++ b/src/vitable_connect/resources/employers.py
@@ -41,7 +41,7 @@ def with_raw_response(self) -> EmployersResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return EmployersResourceWithRawResponse(self)
@@ -50,7 +50,7 @@ def with_streaming_response(self) -> EmployersResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
"""
return EmployersResourceWithStreamingResponse(self)
@@ -351,7 +351,7 @@ def with_raw_response(self) -> AsyncEmployersResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AsyncEmployersResourceWithRawResponse(self)
@@ -360,7 +360,7 @@ def with_streaming_response(self) -> AsyncEmployersResourceWithStreamingResponse
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
"""
return AsyncEmployersResourceWithStreamingResponse(self)
diff --git a/src/vitable_connect/resources/enrollments.py b/src/vitable_connect/resources/enrollments.py
index 3e05a79..ed4a33d 100644
--- a/src/vitable_connect/resources/enrollments.py
+++ b/src/vitable_connect/resources/enrollments.py
@@ -28,7 +28,7 @@ def with_raw_response(self) -> EnrollmentsResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return EnrollmentsResourceWithRawResponse(self)
@@ -37,7 +37,7 @@ def with_streaming_response(self) -> EnrollmentsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
"""
return EnrollmentsResourceWithStreamingResponse(self)
@@ -86,7 +86,7 @@ def with_raw_response(self) -> AsyncEnrollmentsResourceWithRawResponse:
This property can be used as a prefix for any HTTP method call to return
the raw response object instead of the parsed content.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
"""
return AsyncEnrollmentsResourceWithRawResponse(self)
@@ -95,7 +95,7 @@ def with_streaming_response(self) -> AsyncEnrollmentsResourceWithStreamingRespon
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/vitable-connect-python#with_streaming_response
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
"""
return AsyncEnrollmentsResourceWithStreamingResponse(self)
From 57490368bcb31217dc0c9ca08d7757f1c3f03400 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 19 Mar 2026 23:27:57 +0000
Subject: [PATCH 09/14] chore: update SDK settings
---
.stats.yml | 2 +-
README.md | 11 ++++-------
2 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 964f684..a1ed356 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 11
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-0320b76d8102774d1e66595d7afa37964a6b6d8df15bf01fc90998f83576be1d.yml
openapi_spec_hash: 8d72aaaef87e5e28fcff79bfc13929e2
-config_hash: 0ab0eb782e8ec37e6ad3475838a7ba8f
+config_hash: d2689a704a60ac961277fb4a64ac5cae
diff --git a/README.md b/README.md
index 98c5277..c2acb4b 100644
--- a/README.md
+++ b/README.md
@@ -16,13 +16,10 @@ The REST API documentation can be found on [vitablehealth.com](https://vitablehe
## Installation
```sh
-# install from the production repo
-pip install git+ssh://git@github.com/Vitable-Inc/vitable-connect-python.git
+# install from PyPI
+pip install vitable_connect
```
-> [!NOTE]
-> Once this package is [published to PyPI](https://www.stainless.com/docs/guides/publish), this will become: `pip install vitable_connect`
-
## Usage
The full API of this library can be found in [api.md](api.md).
@@ -83,8 +80,8 @@ By default, the async client uses `httpx` for HTTP requests. However, for improv
You can enable this by installing `aiohttp`:
```sh
-# install from the production repo
-pip install 'vitable_connect[aiohttp] @ git+ssh://git@github.com/Vitable-Inc/vitable-connect-python.git'
+# install from PyPI
+pip install vitable_connect[aiohttp]
```
Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
From b5d7c3a4a61e8b7beb84a7c2c184d1c4237b324a Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 19 Mar 2026 23:58:32 +0000
Subject: [PATCH 10/14] chore: update SDK settings
---
.github/workflows/publish-pypi.yml | 5 +++--
.github/workflows/release-doctor.yml | 2 --
.stats.yml | 2 +-
bin/check-release-environment | 4 ----
bin/publish-pypi | 6 +++++-
5 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml
index 5d77441..1893d35 100644
--- a/.github/workflows/publish-pypi.yml
+++ b/.github/workflows/publish-pypi.yml
@@ -13,6 +13,9 @@ jobs:
name: publish
environment: prod
runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ id-token: write
steps:
- uses: actions/checkout@v6
@@ -25,5 +28,3 @@ jobs:
- name: Publish to PyPI
run: |
bash ./bin/publish-pypi
- env:
- PYPI_TOKEN: ${{ secrets.VITABLE_CONNECT_PYPI_TOKEN || secrets.PYPI_TOKEN }}
diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml
index 756818e..56f0bce 100644
--- a/.github/workflows/release-doctor.yml
+++ b/.github/workflows/release-doctor.yml
@@ -17,5 +17,3 @@ jobs:
- name: Check release environment
run: |
bash ./bin/check-release-environment
- env:
- PYPI_TOKEN: ${{ secrets.VITABLE_CONNECT_PYPI_TOKEN || secrets.PYPI_TOKEN }}
diff --git a/.stats.yml b/.stats.yml
index a1ed356..e2ba2e6 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 11
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-0320b76d8102774d1e66595d7afa37964a6b6d8df15bf01fc90998f83576be1d.yml
openapi_spec_hash: 8d72aaaef87e5e28fcff79bfc13929e2
-config_hash: d2689a704a60ac961277fb4a64ac5cae
+config_hash: 5edbba10655ef000d2b5035ad5aac20f
diff --git a/bin/check-release-environment b/bin/check-release-environment
index b845b0f..1e951e9 100644
--- a/bin/check-release-environment
+++ b/bin/check-release-environment
@@ -2,10 +2,6 @@
errors=()
-if [ -z "${PYPI_TOKEN}" ]; then
- errors+=("The PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets.")
-fi
-
lenErrors=${#errors[@]}
if [[ lenErrors -gt 0 ]]; then
diff --git a/bin/publish-pypi b/bin/publish-pypi
index e72ca2f..5895700 100644
--- a/bin/publish-pypi
+++ b/bin/publish-pypi
@@ -4,4 +4,8 @@ set -eux
rm -rf dist
mkdir -p dist
uv build
-uv publish --token=$PYPI_TOKEN
+if [ -n "${PYPI_TOKEN:-}" ]; then
+ uv publish --token=$PYPI_TOKEN
+else
+ uv publish
+fi
From 5d252df080bd65d8227cff938a47fc2c0be43c64 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 20 Mar 2026 03:51:58 +0000
Subject: [PATCH 11/14] fix: sanitize endpoint path params
---
src/vitable_connect/_utils/__init__.py | 1 +
src/vitable_connect/_utils/_path.py | 127 ++++++++++++++++++
.../resources/benefit_eligibility_policies.py | 5 +-
src/vitable_connect/resources/employees.py | 10 +-
src/vitable_connect/resources/employers.py | 18 +--
src/vitable_connect/resources/enrollments.py | 5 +-
tests/test_utils/test_path.py | 89 ++++++++++++
7 files changed, 237 insertions(+), 18 deletions(-)
create mode 100644 src/vitable_connect/_utils/_path.py
create mode 100644 tests/test_utils/test_path.py
diff --git a/src/vitable_connect/_utils/__init__.py b/src/vitable_connect/_utils/__init__.py
index dc64e29..10cb66d 100644
--- a/src/vitable_connect/_utils/__init__.py
+++ b/src/vitable_connect/_utils/__init__.py
@@ -1,3 +1,4 @@
+from ._path import path_template as path_template
from ._sync import asyncify as asyncify
from ._proxy import LazyProxy as LazyProxy
from ._utils import (
diff --git a/src/vitable_connect/_utils/_path.py b/src/vitable_connect/_utils/_path.py
new file mode 100644
index 0000000..4d6e1e4
--- /dev/null
+++ b/src/vitable_connect/_utils/_path.py
@@ -0,0 +1,127 @@
+from __future__ import annotations
+
+import re
+from typing import (
+ Any,
+ Mapping,
+ Callable,
+)
+from urllib.parse import quote
+
+# Matches '.' or '..' where each dot is either literal or percent-encoded (%2e / %2E).
+_DOT_SEGMENT_RE = re.compile(r"^(?:\.|%2[eE]){1,2}$")
+
+_PLACEHOLDER_RE = re.compile(r"\{(\w+)\}")
+
+
+def _quote_path_segment_part(value: str) -> str:
+ """Percent-encode `value` for use in a URI path segment.
+
+ Considers characters not in `pchar` set from RFC 3986 §3.3 to be unsafe.
+ https://datatracker.ietf.org/doc/html/rfc3986#section-3.3
+ """
+ # quote() already treats unreserved characters (letters, digits, and -._~)
+ # as safe, so we only need to add sub-delims, ':', and '@'.
+ # Notably, unlike the default `safe` for quote(), / is unsafe and must be quoted.
+ return quote(value, safe="!$&'()*+,;=:@")
+
+
+def _quote_query_part(value: str) -> str:
+ """Percent-encode `value` for use in a URI query string.
+
+ Considers &, = and characters not in `query` set from RFC 3986 §3.4 to be unsafe.
+ https://datatracker.ietf.org/doc/html/rfc3986#section-3.4
+ """
+ return quote(value, safe="!$'()*+,;:@/?")
+
+
+def _quote_fragment_part(value: str) -> str:
+ """Percent-encode `value` for use in a URI fragment.
+
+ Considers characters not in `fragment` set from RFC 3986 §3.5 to be unsafe.
+ https://datatracker.ietf.org/doc/html/rfc3986#section-3.5
+ """
+ return quote(value, safe="!$&'()*+,;=:@/?")
+
+
+def _interpolate(
+ template: str,
+ values: Mapping[str, Any],
+ quoter: Callable[[str], str],
+) -> str:
+ """Replace {name} placeholders in `template`, quoting each value with `quoter`.
+
+ Placeholder names are looked up in `values`.
+
+ Raises:
+ KeyError: If a placeholder is not found in `values`.
+ """
+ # re.split with a capturing group returns alternating
+ # [text, name, text, name, ..., text] elements.
+ parts = _PLACEHOLDER_RE.split(template)
+
+ for i in range(1, len(parts), 2):
+ name = parts[i]
+ if name not in values:
+ raise KeyError(f"a value for placeholder {{{name}}} was not provided")
+ val = values[name]
+ if val is None:
+ parts[i] = "null"
+ elif isinstance(val, bool):
+ parts[i] = "true" if val else "false"
+ else:
+ parts[i] = quoter(str(values[name]))
+
+ return "".join(parts)
+
+
+def path_template(template: str, /, **kwargs: Any) -> str:
+ """Interpolate {name} placeholders in `template` from keyword arguments.
+
+ Args:
+ template: The template string containing {name} placeholders.
+ **kwargs: Keyword arguments to interpolate into the template.
+
+ Returns:
+ The template with placeholders interpolated and percent-encoded.
+
+ Safe characters for percent-encoding are dependent on the URI component.
+ Placeholders in path and fragment portions are percent-encoded where the `segment`
+ and `fragment` sets from RFC 3986 respectively are considered safe.
+ Placeholders in the query portion are percent-encoded where the `query` set from
+ RFC 3986 §3.3 is considered safe except for = and & characters.
+
+ Raises:
+ KeyError: If a placeholder is not found in `kwargs`.
+ ValueError: If resulting path contains /./ or /../ segments (including percent-encoded dot-segments).
+ """
+ # Split the template into path, query, and fragment portions.
+ fragment_template: str | None = None
+ query_template: str | None = None
+
+ rest = template
+ if "#" in rest:
+ rest, fragment_template = rest.split("#", 1)
+ if "?" in rest:
+ rest, query_template = rest.split("?", 1)
+ path_template = rest
+
+ # Interpolate each portion with the appropriate quoting rules.
+ path_result = _interpolate(path_template, kwargs, _quote_path_segment_part)
+
+ # Reject dot-segments (. and ..) in the final assembled path. The check
+ # runs after interpolation so that adjacent placeholders or a mix of static
+ # text and placeholders that together form a dot-segment are caught.
+ # Also reject percent-encoded dot-segments to protect against incorrectly
+ # implemented normalization in servers/proxies.
+ for segment in path_result.split("/"):
+ if _DOT_SEGMENT_RE.match(segment):
+ raise ValueError(f"Constructed path {path_result!r} contains dot-segment {segment!r} which is not allowed")
+
+ result = path_result
+ if query_template is not None:
+ result += "?" + _interpolate(query_template, kwargs, _quote_query_part)
+ if fragment_template is not None:
+ result += "#" + _interpolate(fragment_template, kwargs, _quote_fragment_part)
+
+ return result
diff --git a/src/vitable_connect/resources/benefit_eligibility_policies.py b/src/vitable_connect/resources/benefit_eligibility_policies.py
index 3030237..554548e 100644
--- a/src/vitable_connect/resources/benefit_eligibility_policies.py
+++ b/src/vitable_connect/resources/benefit_eligibility_policies.py
@@ -5,6 +5,7 @@
import httpx
from .._types import Body, Query, Headers, NotGiven, not_given
+from .._utils import path_template
from .._compat import cached_property
from .._resource import SyncAPIResource, AsyncAPIResource
from .._response import (
@@ -69,7 +70,7 @@ def retrieve(
if not policy_id:
raise ValueError(f"Expected a non-empty value for `policy_id` but received {policy_id!r}")
return self._get(
- f"/v1/benefit-eligibility-policies/{policy_id}",
+ path_template("/v1/benefit-eligibility-policies/{policy_id}", policy_id=policy_id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -127,7 +128,7 @@ async def retrieve(
if not policy_id:
raise ValueError(f"Expected a non-empty value for `policy_id` but received {policy_id!r}")
return await self._get(
- f"/v1/benefit-eligibility-policies/{policy_id}",
+ path_template("/v1/benefit-eligibility-policies/{policy_id}", policy_id=policy_id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
diff --git a/src/vitable_connect/resources/employees.py b/src/vitable_connect/resources/employees.py
index 3952d15..bca50ec 100644
--- a/src/vitable_connect/resources/employees.py
+++ b/src/vitable_connect/resources/employees.py
@@ -6,7 +6,7 @@
from ..types import employee_list_enrollments_params
from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from .._utils import maybe_transform
+from .._utils import path_template, maybe_transform
from .._compat import cached_property
from .._resource import SyncAPIResource, AsyncAPIResource
from .._response import (
@@ -73,7 +73,7 @@ def retrieve(
if not employee_id:
raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
return self._get(
- f"/v1/employees/{employee_id}",
+ path_template("/v1/employees/{employee_id}", employee_id=employee_id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -114,7 +114,7 @@ def list_enrollments(
if not employee_id:
raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
return self._get_api_list(
- f"/v1/employees/{employee_id}/enrollments",
+ path_template("/v1/employees/{employee_id}/enrollments", employee_id=employee_id),
page=SyncPageNumberPage[Enrollment],
options=make_request_options(
extra_headers=extra_headers,
@@ -183,7 +183,7 @@ async def retrieve(
if not employee_id:
raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
return await self._get(
- f"/v1/employees/{employee_id}",
+ path_template("/v1/employees/{employee_id}", employee_id=employee_id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -224,7 +224,7 @@ def list_enrollments(
if not employee_id:
raise ValueError(f"Expected a non-empty value for `employee_id` but received {employee_id!r}")
return self._get_api_list(
- f"/v1/employees/{employee_id}/enrollments",
+ path_template("/v1/employees/{employee_id}/enrollments", employee_id=employee_id),
page=AsyncPageNumberPage[Enrollment],
options=make_request_options(
extra_headers=extra_headers,
diff --git a/src/vitable_connect/resources/employers.py b/src/vitable_connect/resources/employers.py
index 2e364d7..45f0b93 100644
--- a/src/vitable_connect/resources/employers.py
+++ b/src/vitable_connect/resources/employers.py
@@ -14,7 +14,7 @@
employer_create_benefit_eligibility_policy_params,
)
from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
+from .._utils import path_template, maybe_transform, async_maybe_transform
from .._compat import cached_property
from .._resource import SyncAPIResource, AsyncAPIResource
from .._response import (
@@ -142,7 +142,7 @@ def retrieve(
if not employer_id:
raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
return self._get(
- f"/v1/employers/{employer_id}",
+ path_template("/v1/employers/{employer_id}", employer_id=employer_id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -233,7 +233,7 @@ def create_benefit_eligibility_policy(
if not employer_id:
raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
return self._post(
- f"/v1/employers/{employer_id}/benefit-eligibility-policies",
+ path_template("/v1/employers/{employer_id}/benefit-eligibility-policies", employer_id=employer_id),
body=maybe_transform(
{
"classification": classification,
@@ -283,7 +283,7 @@ def list_employees(
if not employer_id:
raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
return self._get_api_list(
- f"/v1/employers/{employer_id}/employees",
+ path_template("/v1/employers/{employer_id}/employees", employer_id=employer_id),
page=SyncPageNumberPage[Employee],
options=make_request_options(
extra_headers=extra_headers,
@@ -333,7 +333,7 @@ def submit_census_sync(
if not employer_id:
raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
return self._post(
- f"/v1/employers/{employer_id}/census-sync",
+ path_template("/v1/employers/{employer_id}/census-sync", employer_id=employer_id),
body=maybe_transform(
{"employees": employees}, employer_submit_census_sync_params.EmployerSubmitCensusSyncParams
),
@@ -452,7 +452,7 @@ async def retrieve(
if not employer_id:
raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
return await self._get(
- f"/v1/employers/{employer_id}",
+ path_template("/v1/employers/{employer_id}", employer_id=employer_id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -543,7 +543,7 @@ async def create_benefit_eligibility_policy(
if not employer_id:
raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
return await self._post(
- f"/v1/employers/{employer_id}/benefit-eligibility-policies",
+ path_template("/v1/employers/{employer_id}/benefit-eligibility-policies", employer_id=employer_id),
body=await async_maybe_transform(
{
"classification": classification,
@@ -593,7 +593,7 @@ def list_employees(
if not employer_id:
raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
return self._get_api_list(
- f"/v1/employers/{employer_id}/employees",
+ path_template("/v1/employers/{employer_id}/employees", employer_id=employer_id),
page=AsyncPageNumberPage[Employee],
options=make_request_options(
extra_headers=extra_headers,
@@ -643,7 +643,7 @@ async def submit_census_sync(
if not employer_id:
raise ValueError(f"Expected a non-empty value for `employer_id` but received {employer_id!r}")
return await self._post(
- f"/v1/employers/{employer_id}/census-sync",
+ path_template("/v1/employers/{employer_id}/census-sync", employer_id=employer_id),
body=await async_maybe_transform(
{"employees": employees}, employer_submit_census_sync_params.EmployerSubmitCensusSyncParams
),
diff --git a/src/vitable_connect/resources/enrollments.py b/src/vitable_connect/resources/enrollments.py
index ed4a33d..a392ab3 100644
--- a/src/vitable_connect/resources/enrollments.py
+++ b/src/vitable_connect/resources/enrollments.py
@@ -5,6 +5,7 @@
import httpx
from .._types import Body, Query, Headers, NotGiven, not_given
+from .._utils import path_template
from .._compat import cached_property
from .._resource import SyncAPIResource, AsyncAPIResource
from .._response import (
@@ -69,7 +70,7 @@ def retrieve(
if not enrollment_id:
raise ValueError(f"Expected a non-empty value for `enrollment_id` but received {enrollment_id!r}")
return self._get(
- f"/v1/enrollments/{enrollment_id}",
+ path_template("/v1/enrollments/{enrollment_id}", enrollment_id=enrollment_id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -127,7 +128,7 @@ async def retrieve(
if not enrollment_id:
raise ValueError(f"Expected a non-empty value for `enrollment_id` but received {enrollment_id!r}")
return await self._get(
- f"/v1/enrollments/{enrollment_id}",
+ path_template("/v1/enrollments/{enrollment_id}", enrollment_id=enrollment_id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
diff --git a/tests/test_utils/test_path.py b/tests/test_utils/test_path.py
new file mode 100644
index 0000000..49c0cc5
--- /dev/null
+++ b/tests/test_utils/test_path.py
@@ -0,0 +1,89 @@
+from __future__ import annotations
+
+from typing import Any
+
+import pytest
+
+from vitable_connect._utils._path import path_template
+
+
+@pytest.mark.parametrize(
+ "template, kwargs, expected",
+ [
+ ("/v1/{id}", dict(id="abc"), "/v1/abc"),
+ ("/v1/{a}/{b}", dict(a="x", b="y"), "/v1/x/y"),
+ ("/v1/{a}{b}/path/{c}?val={d}#{e}", dict(a="x", b="y", c="z", d="u", e="v"), "/v1/xy/path/z?val=u#v"),
+ ("/{w}/{w}", dict(w="echo"), "/echo/echo"),
+ ("/v1/static", {}, "/v1/static"),
+ ("", {}, ""),
+ ("/v1/?q={n}&count=10", dict(n=42), "/v1/?q=42&count=10"),
+ ("/v1/{v}", dict(v=None), "/v1/null"),
+ ("/v1/{v}", dict(v=True), "/v1/true"),
+ ("/v1/{v}", dict(v=False), "/v1/false"),
+ ("/v1/{v}", dict(v=".hidden"), "/v1/.hidden"), # dot prefix ok
+ ("/v1/{v}", dict(v="file.txt"), "/v1/file.txt"), # dot in middle ok
+ ("/v1/{v}", dict(v="..."), "/v1/..."), # triple dot ok
+ ("/v1/{a}{b}", dict(a=".", b="txt"), "/v1/.txt"), # dot var combining with adjacent to be ok
+ ("/items?q={v}#{f}", dict(v=".", f=".."), "/items?q=.#.."), # dots in query/fragment are fine
+ (
+ "/v1/{a}?query={b}",
+ dict(a="../../other/endpoint", b="a&bad=true"),
+ "/v1/..%2F..%2Fother%2Fendpoint?query=a%26bad%3Dtrue",
+ ),
+ ("/v1/{val}", dict(val="a/b/c"), "/v1/a%2Fb%2Fc"),
+ ("/v1/{val}", dict(val="a/b/c?query=value"), "/v1/a%2Fb%2Fc%3Fquery=value"),
+ ("/v1/{val}", dict(val="a/b/c?query=value&bad=true"), "/v1/a%2Fb%2Fc%3Fquery=value&bad=true"),
+ ("/v1/{val}", dict(val="%20"), "/v1/%2520"), # escapes escape sequences in input
+ # Query: slash and ? are safe, # is not
+ ("/items?q={v}", dict(v="a/b"), "/items?q=a/b"),
+ ("/items?q={v}", dict(v="a?b"), "/items?q=a?b"),
+ ("/items?q={v}", dict(v="a#b"), "/items?q=a%23b"),
+ ("/items?q={v}", dict(v="a b"), "/items?q=a%20b"),
+ # Fragment: slash and ? are safe
+ ("/docs#{v}", dict(v="a/b"), "/docs#a/b"),
+ ("/docs#{v}", dict(v="a?b"), "/docs#a?b"),
+ # Path: slash, ? and # are all encoded
+ ("/v1/{v}", dict(v="a/b"), "/v1/a%2Fb"),
+ ("/v1/{v}", dict(v="a?b"), "/v1/a%3Fb"),
+ ("/v1/{v}", dict(v="a#b"), "/v1/a%23b"),
+ # same var encoded differently by component
+ (
+ "/v1/{v}?q={v}#{v}",
+ dict(v="a/b?c#d"),
+ "/v1/a%2Fb%3Fc%23d?q=a/b?c%23d#a/b?c%23d",
+ ),
+ ("/v1/{val}", dict(val="x?admin=true"), "/v1/x%3Fadmin=true"), # query injection
+ ("/v1/{val}", dict(val="x#admin"), "/v1/x%23admin"), # fragment injection
+ ],
+)
+def test_interpolation(template: str, kwargs: dict[str, Any], expected: str) -> None:
+ assert path_template(template, **kwargs) == expected
+
+
+def test_missing_kwarg_raises_key_error() -> None:
+ with pytest.raises(KeyError, match="org_id"):
+ path_template("/v1/{org_id}")
+
+
+@pytest.mark.parametrize(
+ "template, kwargs",
+ [
+ ("{a}/path", dict(a=".")),
+ ("{a}/path", dict(a="..")),
+ ("/v1/{a}", dict(a=".")),
+ ("/v1/{a}", dict(a="..")),
+ ("/v1/{a}/path", dict(a=".")),
+ ("/v1/{a}/path", dict(a="..")),
+ ("/v1/{a}{b}", dict(a=".", b=".")), # adjacent vars → ".."
+ ("/v1/{a}.", dict(a=".")), # var + static → ".."
+ ("/v1/{a}{b}", dict(a="", b=".")), # empty + dot → "."
+ ("/v1/%2e/{x}", dict(x="ok")), # encoded dot in static text
+ ("/v1/%2e./{x}", dict(x="ok")), # mixed encoded ".." in static
+ ("/v1/.%2E/{x}", dict(x="ok")), # mixed encoded ".." in static
+ ("/v1/{v}?q=1", dict(v="..")),
+ ("/v1/{v}#frag", dict(v="..")),
+ ],
+)
+def test_dot_segment_rejected(template: str, kwargs: dict[str, Any]) -> None:
+ with pytest.raises(ValueError, match="dot-segment"):
+ path_template(template, **kwargs)
From c6f1777f0cfa33315d4e8e1484e672039d11fe93 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 20 Mar 2026 23:04:19 +0000
Subject: [PATCH 12/14] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index e2ba2e6..9670caa 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 11
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-0320b76d8102774d1e66595d7afa37964a6b6d8df15bf01fc90998f83576be1d.yml
-openapi_spec_hash: 8d72aaaef87e5e28fcff79bfc13929e2
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-96aa195ab5ff283707620b70fbed7282883a1e1753459f0a694d01d6f19f50e0.yml
+openapi_spec_hash: b2f25ba22786e88520ed918b8b5120a5
config_hash: 5edbba10655ef000d2b5035ad5aac20f
From 61e9959f83e9d2de1c974e9d04349efba0c03589 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 20 Mar 2026 23:09:27 +0000
Subject: [PATCH 13/14] feat(api): manual updates
---
.stats.yml | 4 +-
api.md | 18 +
src/vitable_connect/_client.py | 39 +-
src/vitable_connect/resources/__init__.py | 14 +
.../resources/webhook_events.py | 454 ++++++++++++++++++
src/vitable_connect/types/__init__.py | 6 +
src/vitable_connect/types/webhook_event.py | 33 ++
.../webhook_event_list_deliveries_response.py | 41 ++
.../types/webhook_event_list_params.py | 62 +++
.../types/webhook_event_retrieve_response.py | 12 +
tests/api_resources/test_webhook_events.py | 282 +++++++++++
11 files changed, 962 insertions(+), 3 deletions(-)
create mode 100644 src/vitable_connect/resources/webhook_events.py
create mode 100644 src/vitable_connect/types/webhook_event.py
create mode 100644 src/vitable_connect/types/webhook_event_list_deliveries_response.py
create mode 100644 src/vitable_connect/types/webhook_event_list_params.py
create mode 100644 src/vitable_connect/types/webhook_event_retrieve_response.py
create mode 100644 tests/api_resources/test_webhook_events.py
diff --git a/.stats.yml b/.stats.yml
index 9670caa..72427cf 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 11
+configured_endpoints: 14
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable%2Fvitable-connect-96aa195ab5ff283707620b70fbed7282883a1e1753459f0a694d01d6f19f50e0.yml
openapi_spec_hash: b2f25ba22786e88520ed918b8b5120a5
-config_hash: 5edbba10655ef000d2b5035ad5aac20f
+config_hash: c07379344c812867e0b75b41995c76c2
diff --git a/api.md b/api.md
index b614d80..caa5b91 100644
--- a/api.md
+++ b/api.md
@@ -63,3 +63,21 @@ from vitable_connect.types import Enrollment, EnrollmentStatus, EnrollmentRetrie
Methods:
- client.enrollments.retrieve(enrollment_id) -> EnrollmentRetrieveResponse
+
+# WebhookEvents
+
+Types:
+
+```python
+from vitable_connect.types import (
+ WebhookEvent,
+ WebhookEventRetrieveResponse,
+ WebhookEventListDeliveriesResponse,
+)
+```
+
+Methods:
+
+- client.webhook_events.retrieve(event_id) -> WebhookEventRetrieveResponse
+- client.webhook_events.list(\*\*params) -> SyncPageNumberPage[WebhookEvent]
+- client.webhook_events.list_deliveries(event_id) -> WebhookEventListDeliveriesResponse
diff --git a/src/vitable_connect/_client.py b/src/vitable_connect/_client.py
index 1f06d83..9db190d 100644
--- a/src/vitable_connect/_client.py
+++ b/src/vitable_connect/_client.py
@@ -32,11 +32,12 @@
)
if TYPE_CHECKING:
- from .resources import auth, employees, employers, enrollments, benefit_eligibility_policies
+ from .resources import auth, employees, employers, enrollments, webhook_events, benefit_eligibility_policies
from .resources.auth import AuthResource, AsyncAuthResource
from .resources.employees import EmployeesResource, AsyncEmployeesResource
from .resources.employers import EmployersResource, AsyncEmployersResource
from .resources.enrollments import EnrollmentsResource, AsyncEnrollmentsResource
+ from .resources.webhook_events import WebhookEventsResource, AsyncWebhookEventsResource
from .resources.benefit_eligibility_policies import (
BenefitEligibilityPoliciesResource,
AsyncBenefitEligibilityPoliciesResource,
@@ -172,6 +173,12 @@ def enrollments(self) -> EnrollmentsResource:
return EnrollmentsResource(self)
+ @cached_property
+ def webhook_events(self) -> WebhookEventsResource:
+ from .resources.webhook_events import WebhookEventsResource
+
+ return WebhookEventsResource(self)
+
@cached_property
def with_raw_response(self) -> VitableConnectWithRawResponse:
return VitableConnectWithRawResponse(self)
@@ -404,6 +411,12 @@ def enrollments(self) -> AsyncEnrollmentsResource:
return AsyncEnrollmentsResource(self)
+ @cached_property
+ def webhook_events(self) -> AsyncWebhookEventsResource:
+ from .resources.webhook_events import AsyncWebhookEventsResource
+
+ return AsyncWebhookEventsResource(self)
+
@cached_property
def with_raw_response(self) -> AsyncVitableConnectWithRawResponse:
return AsyncVitableConnectWithRawResponse(self)
@@ -565,6 +578,12 @@ def enrollments(self) -> enrollments.EnrollmentsResourceWithRawResponse:
return EnrollmentsResourceWithRawResponse(self._client.enrollments)
+ @cached_property
+ def webhook_events(self) -> webhook_events.WebhookEventsResourceWithRawResponse:
+ from .resources.webhook_events import WebhookEventsResourceWithRawResponse
+
+ return WebhookEventsResourceWithRawResponse(self._client.webhook_events)
+
class AsyncVitableConnectWithRawResponse:
_client: AsyncVitableConnect
@@ -607,6 +626,12 @@ def enrollments(self) -> enrollments.AsyncEnrollmentsResourceWithRawResponse:
return AsyncEnrollmentsResourceWithRawResponse(self._client.enrollments)
+ @cached_property
+ def webhook_events(self) -> webhook_events.AsyncWebhookEventsResourceWithRawResponse:
+ from .resources.webhook_events import AsyncWebhookEventsResourceWithRawResponse
+
+ return AsyncWebhookEventsResourceWithRawResponse(self._client.webhook_events)
+
class VitableConnectWithStreamedResponse:
_client: VitableConnect
@@ -649,6 +674,12 @@ def enrollments(self) -> enrollments.EnrollmentsResourceWithStreamingResponse:
return EnrollmentsResourceWithStreamingResponse(self._client.enrollments)
+ @cached_property
+ def webhook_events(self) -> webhook_events.WebhookEventsResourceWithStreamingResponse:
+ from .resources.webhook_events import WebhookEventsResourceWithStreamingResponse
+
+ return WebhookEventsResourceWithStreamingResponse(self._client.webhook_events)
+
class AsyncVitableConnectWithStreamedResponse:
_client: AsyncVitableConnect
@@ -691,6 +722,12 @@ def enrollments(self) -> enrollments.AsyncEnrollmentsResourceWithStreamingRespon
return AsyncEnrollmentsResourceWithStreamingResponse(self._client.enrollments)
+ @cached_property
+ def webhook_events(self) -> webhook_events.AsyncWebhookEventsResourceWithStreamingResponse:
+ from .resources.webhook_events import AsyncWebhookEventsResourceWithStreamingResponse
+
+ return AsyncWebhookEventsResourceWithStreamingResponse(self._client.webhook_events)
+
Client = VitableConnect
diff --git a/src/vitable_connect/resources/__init__.py b/src/vitable_connect/resources/__init__.py
index 2c98f33..733413d 100644
--- a/src/vitable_connect/resources/__init__.py
+++ b/src/vitable_connect/resources/__init__.py
@@ -32,6 +32,14 @@
EnrollmentsResourceWithStreamingResponse,
AsyncEnrollmentsResourceWithStreamingResponse,
)
+from .webhook_events import (
+ WebhookEventsResource,
+ AsyncWebhookEventsResource,
+ WebhookEventsResourceWithRawResponse,
+ AsyncWebhookEventsResourceWithRawResponse,
+ WebhookEventsResourceWithStreamingResponse,
+ AsyncWebhookEventsResourceWithStreamingResponse,
+)
from .benefit_eligibility_policies import (
BenefitEligibilityPoliciesResource,
AsyncBenefitEligibilityPoliciesResource,
@@ -72,4 +80,10 @@
"AsyncEnrollmentsResourceWithRawResponse",
"EnrollmentsResourceWithStreamingResponse",
"AsyncEnrollmentsResourceWithStreamingResponse",
+ "WebhookEventsResource",
+ "AsyncWebhookEventsResource",
+ "WebhookEventsResourceWithRawResponse",
+ "AsyncWebhookEventsResourceWithRawResponse",
+ "WebhookEventsResourceWithStreamingResponse",
+ "AsyncWebhookEventsResourceWithStreamingResponse",
]
diff --git a/src/vitable_connect/resources/webhook_events.py b/src/vitable_connect/resources/webhook_events.py
new file mode 100644
index 0000000..6ad8b87
--- /dev/null
+++ b/src/vitable_connect/resources/webhook_events.py
@@ -0,0 +1,454 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union
+from datetime import datetime
+from typing_extensions import Literal
+
+import httpx
+
+from ..types import webhook_event_list_params
+from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from .._utils import path_template, maybe_transform
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
+ to_raw_response_wrapper,
+ to_streamed_response_wrapper,
+ async_to_raw_response_wrapper,
+ async_to_streamed_response_wrapper,
+)
+from ..pagination import SyncPageNumberPage, AsyncPageNumberPage
+from .._base_client import AsyncPaginator, make_request_options
+from ..types.webhook_event import WebhookEvent
+from ..types.webhook_event_retrieve_response import WebhookEventRetrieveResponse
+from ..types.webhook_event_list_deliveries_response import WebhookEventListDeliveriesResponse
+
+__all__ = ["WebhookEventsResource", "AsyncWebhookEventsResource"]
+
+
+class WebhookEventsResource(SyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> WebhookEventsResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
+ """
+ return WebhookEventsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> WebhookEventsResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
+ """
+ return WebhookEventsResourceWithStreamingResponse(self)
+
+ def retrieve(
+ self,
+ event_id: str,
+ *,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebhookEventRetrieveResponse:
+ """Retrieves a single webhook event by its prefixed ID.
+
+ Returns 404 if the event
+ does not exist or belongs to a different organization.
+
+ Args:
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not event_id:
+ raise ValueError(f"Expected a non-empty value for `event_id` but received {event_id!r}")
+ return self._get(
+ path_template("/v1/webhook-events/{event_id}", event_id=event_id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=WebhookEventRetrieveResponse,
+ )
+
+ def list(
+ self,
+ *,
+ created_after: Union[str, datetime] | Omit = omit,
+ created_before: Union[str, datetime] | Omit = omit,
+ event_name: Literal[
+ "enrollment.accepted",
+ "enrollment.terminated",
+ "enrollment.elected",
+ "enrollment.granted",
+ "enrollment.waived",
+ "enrollment.started",
+ "employee.eligibility_granted",
+ "employee.eligibility_terminated",
+ "employee.deactivated",
+ "payroll_deduction.created",
+ "plan_year.eligibility_policy_created",
+ ]
+ | Omit = omit,
+ limit: int | Omit = omit,
+ page: int | Omit = omit,
+ resource_id: str | Omit = omit,
+ resource_type: Literal["enrollment", "employee", "employer", "dependent", "plan_year", "payroll_deduction"]
+ | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> SyncPageNumberPage[WebhookEvent]:
+ """
+ Retrieves a paginated list of webhook events for the authenticated organization.
+ Supports filtering by event name, resource type, resource ID, and date range.
+
+ Args:
+ event_name: - `enrollment.accepted` - Enrollment Accepted
+ - `enrollment.terminated` - Enrollment Terminated
+ - `enrollment.elected` - Enrollment Elected
+ - `enrollment.granted` - Enrollment Granted
+ - `enrollment.waived` - Enrollment Waived
+ - `enrollment.started` - Enrollment Started
+ - `employee.eligibility_granted` - Employee Eligibility Granted
+ - `employee.eligibility_terminated` - Employee Eligibility Terminated
+ - `employee.deactivated` - Employee Deactivated
+ - `payroll_deduction.created` - Payroll Deduction Created
+ - `plan_year.eligibility_policy_created` - Plan Year Eligibility Policy Created
+
+ limit: Items per page (default: 20, max: 100)
+
+ page: Page number (default: 1)
+
+ resource_type: - `enrollment` - Enrollment
+ - `employee` - Employee
+ - `employer` - Employer
+ - `dependent` - Dependent
+ - `plan_year` - Plan Year
+ - `payroll_deduction` - Payroll Deduction
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._get_api_list(
+ "/v1/webhook-events",
+ page=SyncPageNumberPage[WebhookEvent],
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "created_after": created_after,
+ "created_before": created_before,
+ "event_name": event_name,
+ "limit": limit,
+ "page": page,
+ "resource_id": resource_id,
+ "resource_type": resource_type,
+ },
+ webhook_event_list_params.WebhookEventListParams,
+ ),
+ ),
+ model=WebhookEvent,
+ )
+
+ def list_deliveries(
+ self,
+ event_id: str,
+ *,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebhookEventListDeliveriesResponse:
+ """Retrieves all delivery attempts for a webhook event.
+
+ Returns up to 100
+ deliveries. Each delivery includes a computed status field (Pending, In
+ Progress, Delivered, or Failed).
+
+ Args:
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not event_id:
+ raise ValueError(f"Expected a non-empty value for `event_id` but received {event_id!r}")
+ return self._get(
+ path_template("/v1/webhook-events/{event_id}/deliveries", event_id=event_id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=WebhookEventListDeliveriesResponse,
+ )
+
+
+class AsyncWebhookEventsResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncWebhookEventsResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#accessing-raw-response-data-eg-headers
+ """
+ return AsyncWebhookEventsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncWebhookEventsResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/Vitable-Inc/vitable-connect-python#with_streaming_response
+ """
+ return AsyncWebhookEventsResourceWithStreamingResponse(self)
+
+ async def retrieve(
+ self,
+ event_id: str,
+ *,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebhookEventRetrieveResponse:
+ """Retrieves a single webhook event by its prefixed ID.
+
+ Returns 404 if the event
+ does not exist or belongs to a different organization.
+
+ Args:
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not event_id:
+ raise ValueError(f"Expected a non-empty value for `event_id` but received {event_id!r}")
+ return await self._get(
+ path_template("/v1/webhook-events/{event_id}", event_id=event_id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=WebhookEventRetrieveResponse,
+ )
+
+ def list(
+ self,
+ *,
+ created_after: Union[str, datetime] | Omit = omit,
+ created_before: Union[str, datetime] | Omit = omit,
+ event_name: Literal[
+ "enrollment.accepted",
+ "enrollment.terminated",
+ "enrollment.elected",
+ "enrollment.granted",
+ "enrollment.waived",
+ "enrollment.started",
+ "employee.eligibility_granted",
+ "employee.eligibility_terminated",
+ "employee.deactivated",
+ "payroll_deduction.created",
+ "plan_year.eligibility_policy_created",
+ ]
+ | Omit = omit,
+ limit: int | Omit = omit,
+ page: int | Omit = omit,
+ resource_id: str | Omit = omit,
+ resource_type: Literal["enrollment", "employee", "employer", "dependent", "plan_year", "payroll_deduction"]
+ | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AsyncPaginator[WebhookEvent, AsyncPageNumberPage[WebhookEvent]]:
+ """
+ Retrieves a paginated list of webhook events for the authenticated organization.
+ Supports filtering by event name, resource type, resource ID, and date range.
+
+ Args:
+ event_name: - `enrollment.accepted` - Enrollment Accepted
+ - `enrollment.terminated` - Enrollment Terminated
+ - `enrollment.elected` - Enrollment Elected
+ - `enrollment.granted` - Enrollment Granted
+ - `enrollment.waived` - Enrollment Waived
+ - `enrollment.started` - Enrollment Started
+ - `employee.eligibility_granted` - Employee Eligibility Granted
+ - `employee.eligibility_terminated` - Employee Eligibility Terminated
+ - `employee.deactivated` - Employee Deactivated
+ - `payroll_deduction.created` - Payroll Deduction Created
+ - `plan_year.eligibility_policy_created` - Plan Year Eligibility Policy Created
+
+ limit: Items per page (default: 20, max: 100)
+
+ page: Page number (default: 1)
+
+ resource_type: - `enrollment` - Enrollment
+ - `employee` - Employee
+ - `employer` - Employer
+ - `dependent` - Dependent
+ - `plan_year` - Plan Year
+ - `payroll_deduction` - Payroll Deduction
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._get_api_list(
+ "/v1/webhook-events",
+ page=AsyncPageNumberPage[WebhookEvent],
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "created_after": created_after,
+ "created_before": created_before,
+ "event_name": event_name,
+ "limit": limit,
+ "page": page,
+ "resource_id": resource_id,
+ "resource_type": resource_type,
+ },
+ webhook_event_list_params.WebhookEventListParams,
+ ),
+ ),
+ model=WebhookEvent,
+ )
+
+ async def list_deliveries(
+ self,
+ event_id: str,
+ *,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebhookEventListDeliveriesResponse:
+ """Retrieves all delivery attempts for a webhook event.
+
+ Returns up to 100
+ deliveries. Each delivery includes a computed status field (Pending, In
+ Progress, Delivered, or Failed).
+
+ Args:
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ if not event_id:
+ raise ValueError(f"Expected a non-empty value for `event_id` but received {event_id!r}")
+ return await self._get(
+ path_template("/v1/webhook-events/{event_id}/deliveries", event_id=event_id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=WebhookEventListDeliveriesResponse,
+ )
+
+
+class WebhookEventsResourceWithRawResponse:
+ def __init__(self, webhook_events: WebhookEventsResource) -> None:
+ self._webhook_events = webhook_events
+
+ self.retrieve = to_raw_response_wrapper(
+ webhook_events.retrieve,
+ )
+ self.list = to_raw_response_wrapper(
+ webhook_events.list,
+ )
+ self.list_deliveries = to_raw_response_wrapper(
+ webhook_events.list_deliveries,
+ )
+
+
+class AsyncWebhookEventsResourceWithRawResponse:
+ def __init__(self, webhook_events: AsyncWebhookEventsResource) -> None:
+ self._webhook_events = webhook_events
+
+ self.retrieve = async_to_raw_response_wrapper(
+ webhook_events.retrieve,
+ )
+ self.list = async_to_raw_response_wrapper(
+ webhook_events.list,
+ )
+ self.list_deliveries = async_to_raw_response_wrapper(
+ webhook_events.list_deliveries,
+ )
+
+
+class WebhookEventsResourceWithStreamingResponse:
+ def __init__(self, webhook_events: WebhookEventsResource) -> None:
+ self._webhook_events = webhook_events
+
+ self.retrieve = to_streamed_response_wrapper(
+ webhook_events.retrieve,
+ )
+ self.list = to_streamed_response_wrapper(
+ webhook_events.list,
+ )
+ self.list_deliveries = to_streamed_response_wrapper(
+ webhook_events.list_deliveries,
+ )
+
+
+class AsyncWebhookEventsResourceWithStreamingResponse:
+ def __init__(self, webhook_events: AsyncWebhookEventsResource) -> None:
+ self._webhook_events = webhook_events
+
+ self.retrieve = async_to_streamed_response_wrapper(
+ webhook_events.retrieve,
+ )
+ self.list = async_to_streamed_response_wrapper(
+ webhook_events.list,
+ )
+ self.list_deliveries = async_to_streamed_response_wrapper(
+ webhook_events.list_deliveries,
+ )
diff --git a/src/vitable_connect/types/__init__.py b/src/vitable_connect/types/__init__.py
index 83e0519..d53e1f0 100644
--- a/src/vitable_connect/types/__init__.py
+++ b/src/vitable_connect/types/__init__.py
@@ -7,21 +7,27 @@
from .employer import Employer as Employer
from .enrollment import Enrollment as Enrollment
from .pagination import Pagination as Pagination
+from .webhook_event import WebhookEvent as WebhookEvent
from .employee_class import EmployeeClass as EmployeeClass
from .employer_response import EmployerResponse as EmployerResponse
from .enrollment_status import EnrollmentStatus as EnrollmentStatus
from .employer_list_params import EmployerListParams as EmployerListParams
from .employer_create_params import EmployerCreateParams as EmployerCreateParams
+from .webhook_event_list_params import WebhookEventListParams as WebhookEventListParams
from .benefit_eligibility_policy import BenefitEligibilityPolicy as BenefitEligibilityPolicy
from .employee_retrieve_response import EmployeeRetrieveResponse as EmployeeRetrieveResponse
from .enrollment_retrieve_response import EnrollmentRetrieveResponse as EnrollmentRetrieveResponse
from .auth_issue_access_token_params import AuthIssueAccessTokenParams as AuthIssueAccessTokenParams
from .employer_list_employees_params import EmployerListEmployeesParams as EmployerListEmployeesParams
+from .webhook_event_retrieve_response import WebhookEventRetrieveResponse as WebhookEventRetrieveResponse
from .auth_issue_access_token_response import AuthIssueAccessTokenResponse as AuthIssueAccessTokenResponse
from .employee_list_enrollments_params import EmployeeListEnrollmentsParams as EmployeeListEnrollmentsParams
from .employer_submit_census_sync_params import EmployerSubmitCensusSyncParams as EmployerSubmitCensusSyncParams
from .benefit_eligibility_policy_response import BenefitEligibilityPolicyResponse as BenefitEligibilityPolicyResponse
from .employer_submit_census_sync_response import EmployerSubmitCensusSyncResponse as EmployerSubmitCensusSyncResponse
+from .webhook_event_list_deliveries_response import (
+ WebhookEventListDeliveriesResponse as WebhookEventListDeliveriesResponse,
+)
from .employer_create_benefit_eligibility_policy_params import (
EmployerCreateBenefitEligibilityPolicyParams as EmployerCreateBenefitEligibilityPolicyParams,
)
diff --git a/src/vitable_connect/types/webhook_event.py b/src/vitable_connect/types/webhook_event.py
new file mode 100644
index 0000000..d03f4a2
--- /dev/null
+++ b/src/vitable_connect/types/webhook_event.py
@@ -0,0 +1,33 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+
+from .._models import BaseModel
+
+__all__ = ["WebhookEvent"]
+
+
+class WebhookEvent(BaseModel):
+ id: str
+ """Prefixed unique identifier for this webhook event (e.g., `wevt_...`)."""
+
+ created_at: datetime
+ """When the event occurred, in UTC."""
+
+ event_name: str
+ """
+ The event type, formatted as `{resource}.{action}` (e.g.,
+ `enrollment.accepted`).
+ """
+
+ organization_id: str
+ """The organization this event belongs to."""
+
+ resource_id: str
+ """Prefixed ID of the affected resource.
+
+ Use this to fetch the current state from the API.
+ """
+
+ resource_type: str
+ """The type of resource affected (e.g., `enrollment`, `employee`)."""
diff --git a/src/vitable_connect/types/webhook_event_list_deliveries_response.py b/src/vitable_connect/types/webhook_event_list_deliveries_response.py
new file mode 100644
index 0000000..db9c7f9
--- /dev/null
+++ b/src/vitable_connect/types/webhook_event_list_deliveries_response.py
@@ -0,0 +1,41 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List, Optional
+from datetime import datetime
+
+from .._models import BaseModel
+
+__all__ = ["WebhookEventListDeliveriesResponse", "Data"]
+
+
+class Data(BaseModel):
+ id: str
+ """Prefixed unique identifier for this delivery (e.g., `wdlv_...`)."""
+
+ created_at: datetime
+ """When this delivery record was created, in UTC."""
+
+ delivered_at: Optional[datetime] = None
+ """When the delivery was successfully received, in UTC."""
+
+ failed_at: Optional[datetime] = None
+ """When the delivery was marked as permanently failed, in UTC."""
+
+ failure_reason: str
+ """Reason for failure, if applicable."""
+
+ started_at: Optional[datetime] = None
+ """When the delivery attempt started, in UTC."""
+
+ status: str
+ """Current delivery status: Pending, In Progress, Delivered, or Failed."""
+
+ subscription_id: str
+ """The webhook subscription this delivery was sent to."""
+
+ webhook_event_id: str
+ """The webhook event this delivery belongs to."""
+
+
+class WebhookEventListDeliveriesResponse(BaseModel):
+ data: List[Data]
diff --git a/src/vitable_connect/types/webhook_event_list_params.py b/src/vitable_connect/types/webhook_event_list_params.py
new file mode 100644
index 0000000..9ddb987
--- /dev/null
+++ b/src/vitable_connect/types/webhook_event_list_params.py
@@ -0,0 +1,62 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union
+from datetime import datetime
+from typing_extensions import Literal, Annotated, TypedDict
+
+from .._utils import PropertyInfo
+
+__all__ = ["WebhookEventListParams"]
+
+
+class WebhookEventListParams(TypedDict, total=False):
+ created_after: Annotated[Union[str, datetime], PropertyInfo(format="iso8601")]
+
+ created_before: Annotated[Union[str, datetime], PropertyInfo(format="iso8601")]
+
+ event_name: Literal[
+ "enrollment.accepted",
+ "enrollment.terminated",
+ "enrollment.elected",
+ "enrollment.granted",
+ "enrollment.waived",
+ "enrollment.started",
+ "employee.eligibility_granted",
+ "employee.eligibility_terminated",
+ "employee.deactivated",
+ "payroll_deduction.created",
+ "plan_year.eligibility_policy_created",
+ ]
+ """
+ - `enrollment.accepted` - Enrollment Accepted
+ - `enrollment.terminated` - Enrollment Terminated
+ - `enrollment.elected` - Enrollment Elected
+ - `enrollment.granted` - Enrollment Granted
+ - `enrollment.waived` - Enrollment Waived
+ - `enrollment.started` - Enrollment Started
+ - `employee.eligibility_granted` - Employee Eligibility Granted
+ - `employee.eligibility_terminated` - Employee Eligibility Terminated
+ - `employee.deactivated` - Employee Deactivated
+ - `payroll_deduction.created` - Payroll Deduction Created
+ - `plan_year.eligibility_policy_created` - Plan Year Eligibility Policy Created
+ """
+
+ limit: int
+ """Items per page (default: 20, max: 100)"""
+
+ page: int
+ """Page number (default: 1)"""
+
+ resource_id: str
+
+ resource_type: Literal["enrollment", "employee", "employer", "dependent", "plan_year", "payroll_deduction"]
+ """
+ - `enrollment` - Enrollment
+ - `employee` - Employee
+ - `employer` - Employer
+ - `dependent` - Dependent
+ - `plan_year` - Plan Year
+ - `payroll_deduction` - Payroll Deduction
+ """
diff --git a/src/vitable_connect/types/webhook_event_retrieve_response.py b/src/vitable_connect/types/webhook_event_retrieve_response.py
new file mode 100644
index 0000000..9a35e89
--- /dev/null
+++ b/src/vitable_connect/types/webhook_event_retrieve_response.py
@@ -0,0 +1,12 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from .._models import BaseModel
+from .webhook_event import WebhookEvent
+
+__all__ = ["WebhookEventRetrieveResponse"]
+
+
+class WebhookEventRetrieveResponse(BaseModel):
+ """Response containing a single webhook event resource."""
+
+ data: WebhookEvent
diff --git a/tests/api_resources/test_webhook_events.py b/tests/api_resources/test_webhook_events.py
new file mode 100644
index 0000000..93f98f8
--- /dev/null
+++ b/tests/api_resources/test_webhook_events.py
@@ -0,0 +1,282 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import os
+from typing import Any, cast
+
+import pytest
+
+from tests.utils import assert_matches_type
+from vitable_connect import VitableConnect, AsyncVitableConnect
+from vitable_connect.types import (
+ WebhookEvent,
+ WebhookEventRetrieveResponse,
+ WebhookEventListDeliveriesResponse,
+)
+from vitable_connect._utils import parse_datetime
+from vitable_connect.pagination import SyncPageNumberPage, AsyncPageNumberPage
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestWebhookEvents:
+ parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_retrieve(self, client: VitableConnect) -> None:
+ webhook_event = client.webhook_events.retrieve(
+ "event_id",
+ )
+ assert_matches_type(WebhookEventRetrieveResponse, webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_retrieve(self, client: VitableConnect) -> None:
+ response = client.webhook_events.with_raw_response.retrieve(
+ "event_id",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ webhook_event = response.parse()
+ assert_matches_type(WebhookEventRetrieveResponse, webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_retrieve(self, client: VitableConnect) -> None:
+ with client.webhook_events.with_streaming_response.retrieve(
+ "event_id",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ webhook_event = response.parse()
+ assert_matches_type(WebhookEventRetrieveResponse, webhook_event, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_retrieve(self, client: VitableConnect) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `event_id` but received ''"):
+ client.webhook_events.with_raw_response.retrieve(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list(self, client: VitableConnect) -> None:
+ webhook_event = client.webhook_events.list()
+ assert_matches_type(SyncPageNumberPage[WebhookEvent], webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_with_all_params(self, client: VitableConnect) -> None:
+ webhook_event = client.webhook_events.list(
+ created_after=parse_datetime("2019-12-27T18:11:19.117Z"),
+ created_before=parse_datetime("2019-12-27T18:11:19.117Z"),
+ event_name="enrollment.accepted",
+ limit=20,
+ page=1,
+ resource_id="x",
+ resource_type="enrollment",
+ )
+ assert_matches_type(SyncPageNumberPage[WebhookEvent], webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_list(self, client: VitableConnect) -> None:
+ response = client.webhook_events.with_raw_response.list()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ webhook_event = response.parse()
+ assert_matches_type(SyncPageNumberPage[WebhookEvent], webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_list(self, client: VitableConnect) -> None:
+ with client.webhook_events.with_streaming_response.list() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ webhook_event = response.parse()
+ assert_matches_type(SyncPageNumberPage[WebhookEvent], webhook_event, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_deliveries(self, client: VitableConnect) -> None:
+ webhook_event = client.webhook_events.list_deliveries(
+ "event_id",
+ )
+ assert_matches_type(WebhookEventListDeliveriesResponse, webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_list_deliveries(self, client: VitableConnect) -> None:
+ response = client.webhook_events.with_raw_response.list_deliveries(
+ "event_id",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ webhook_event = response.parse()
+ assert_matches_type(WebhookEventListDeliveriesResponse, webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_list_deliveries(self, client: VitableConnect) -> None:
+ with client.webhook_events.with_streaming_response.list_deliveries(
+ "event_id",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ webhook_event = response.parse()
+ assert_matches_type(WebhookEventListDeliveriesResponse, webhook_event, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_list_deliveries(self, client: VitableConnect) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `event_id` but received ''"):
+ client.webhook_events.with_raw_response.list_deliveries(
+ "",
+ )
+
+
+class TestAsyncWebhookEvents:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_retrieve(self, async_client: AsyncVitableConnect) -> None:
+ webhook_event = await async_client.webhook_events.retrieve(
+ "event_id",
+ )
+ assert_matches_type(WebhookEventRetrieveResponse, webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_retrieve(self, async_client: AsyncVitableConnect) -> None:
+ response = await async_client.webhook_events.with_raw_response.retrieve(
+ "event_id",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ webhook_event = await response.parse()
+ assert_matches_type(WebhookEventRetrieveResponse, webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_retrieve(self, async_client: AsyncVitableConnect) -> None:
+ async with async_client.webhook_events.with_streaming_response.retrieve(
+ "event_id",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ webhook_event = await response.parse()
+ assert_matches_type(WebhookEventRetrieveResponse, webhook_event, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_path_params_retrieve(self, async_client: AsyncVitableConnect) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `event_id` but received ''"):
+ await async_client.webhook_events.with_raw_response.retrieve(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list(self, async_client: AsyncVitableConnect) -> None:
+ webhook_event = await async_client.webhook_events.list()
+ assert_matches_type(AsyncPageNumberPage[WebhookEvent], webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list_with_all_params(self, async_client: AsyncVitableConnect) -> None:
+ webhook_event = await async_client.webhook_events.list(
+ created_after=parse_datetime("2019-12-27T18:11:19.117Z"),
+ created_before=parse_datetime("2019-12-27T18:11:19.117Z"),
+ event_name="enrollment.accepted",
+ limit=20,
+ page=1,
+ resource_id="x",
+ resource_type="enrollment",
+ )
+ assert_matches_type(AsyncPageNumberPage[WebhookEvent], webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_list(self, async_client: AsyncVitableConnect) -> None:
+ response = await async_client.webhook_events.with_raw_response.list()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ webhook_event = await response.parse()
+ assert_matches_type(AsyncPageNumberPage[WebhookEvent], webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_list(self, async_client: AsyncVitableConnect) -> None:
+ async with async_client.webhook_events.with_streaming_response.list() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ webhook_event = await response.parse()
+ assert_matches_type(AsyncPageNumberPage[WebhookEvent], webhook_event, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list_deliveries(self, async_client: AsyncVitableConnect) -> None:
+ webhook_event = await async_client.webhook_events.list_deliveries(
+ "event_id",
+ )
+ assert_matches_type(WebhookEventListDeliveriesResponse, webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_list_deliveries(self, async_client: AsyncVitableConnect) -> None:
+ response = await async_client.webhook_events.with_raw_response.list_deliveries(
+ "event_id",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ webhook_event = await response.parse()
+ assert_matches_type(WebhookEventListDeliveriesResponse, webhook_event, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_list_deliveries(self, async_client: AsyncVitableConnect) -> None:
+ async with async_client.webhook_events.with_streaming_response.list_deliveries(
+ "event_id",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ webhook_event = await response.parse()
+ assert_matches_type(WebhookEventListDeliveriesResponse, webhook_event, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_path_params_list_deliveries(self, async_client: AsyncVitableConnect) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `event_id` but received ''"):
+ await async_client.webhook_events.with_raw_response.list_deliveries(
+ "",
+ )
From ec65cf07cb49fc411c57d4dda3fe11e9f7805625 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 20 Mar 2026 23:09:42 +0000
Subject: [PATCH 14/14] release: 0.2.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 26 ++++++++++++++++++++++++++
pyproject.toml | 2 +-
src/vitable_connect/_version.py | 2 +-
4 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index cda9cbd..10f3091 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.1.2"
+ ".": "0.2.0"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a964e25..bd0cdd8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,31 @@
# Changelog
+## 0.2.0 (2026-03-20)
+
+Full Changelog: [v0.1.2...v0.2.0](https://github.com/Vitable-Inc/vitable-connect-python/compare/v0.1.2...v0.2.0)
+
+### Features
+
+* **api:** api update ([2d17eba](https://github.com/Vitable-Inc/vitable-connect-python/commit/2d17ebab7f730aa1a9a9cba0044d7bd1f05ef3d7))
+* **api:** manual updates ([61e9959](https://github.com/Vitable-Inc/vitable-connect-python/commit/61e9959f83e9d2de1c974e9d04349efba0c03589))
+* **api:** manual updates ([311d294](https://github.com/Vitable-Inc/vitable-connect-python/commit/311d294e50fb62fde627e0e0619064ff05018cb7))
+* **api:** manual updates ([81fa03e](https://github.com/Vitable-Inc/vitable-connect-python/commit/81fa03e7036aeb56052384dfbd31de5f554d2d74))
+
+
+### Bug Fixes
+
+* **deps:** bump minimum typing-extensions version ([4f315a4](https://github.com/Vitable-Inc/vitable-connect-python/commit/4f315a4488437d128364f288ae1a2e526aceb639))
+* **pydantic:** do not pass `by_alias` unless set ([7d698a1](https://github.com/Vitable-Inc/vitable-connect-python/commit/7d698a13ec079a12c7681ce236abf4aa9ea765fa))
+* sanitize endpoint path params ([5d252df](https://github.com/Vitable-Inc/vitable-connect-python/commit/5d252df080bd65d8227cff938a47fc2c0be43c64))
+
+
+### Chores
+
+* **internal:** tweak CI branches ([96b210d](https://github.com/Vitable-Inc/vitable-connect-python/commit/96b210d9f4ace8c61d48775f1cf840e8fcb18d44))
+* update SDK settings ([b5d7c3a](https://github.com/Vitable-Inc/vitable-connect-python/commit/b5d7c3a4a61e8b7beb84a7c2c184d1c4237b324a))
+* update SDK settings ([5749036](https://github.com/Vitable-Inc/vitable-connect-python/commit/57490368bcb31217dc0c9ca08d7757f1c3f03400))
+* update SDK settings ([f29a924](https://github.com/Vitable-Inc/vitable-connect-python/commit/f29a9244a92c5205cd978c2adc176b9428c0be4f))
+
## 0.1.2 (2026-03-15)
Full Changelog: [v0.1.1...v0.1.2](https://github.com/Vitable-Inc/vitable-connect-python/compare/v0.1.1...v0.1.2)
diff --git a/pyproject.toml b/pyproject.toml
index c021b62..da819ce 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "vitable_connect"
-version = "0.1.2"
+version = "0.2.0"
description = "The official Python library for the vitable-connect API"
dynamic = ["readme"]
license = "Apache-2.0"
diff --git a/src/vitable_connect/_version.py b/src/vitable_connect/_version.py
index 4c6c097..fd5a7c1 100644
--- a/src/vitable_connect/_version.py
+++ b/src/vitable_connect/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "vitable_connect"
-__version__ = "0.1.2" # x-release-please-version
+__version__ = "0.2.0" # x-release-please-version