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