daknode 0.3.9__tar.gz → 0.3.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- daknode-0.3.10/PKG-INFO +125 -0
- daknode-0.3.10/README.md +102 -0
- {daknode-0.3.9 → daknode-0.3.10}/pyproject.toml +8 -2
- daknode-0.3.9/PKG-INFO +0 -143
- daknode-0.3.9/README.md +0 -124
- {daknode-0.3.9 → daknode-0.3.10}/daknode/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/block_rules/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/block_rules/create_block_rule.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/block_rules/create_inbox_block_rule.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/block_rules/delete_block_rule.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/block_rules/list_block_rules.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/block_rules/list_inbox_block_rules.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/book_calendar_event.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/cancel_calendar_event.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/create_calendar_event.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/delete_calendar_event.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/delete_calendar_exception.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/edit_calendar_series.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/get_calendar_agenda.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/get_calendar_availability.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/get_calendar_event.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/get_calendar_free_busy.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/get_calendar_reminders.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/list_calendar_events.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/list_calendar_instances.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/list_calendar_invitations.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/poll_calendar_changes.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/put_calendar_exception.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/respond_calendar_event.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/send_calendar_invitations.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/set_calendar_reminders.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/calendar/update_calendar_event.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/consent/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/consent/create_consent.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/consent/revoke.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/control_plane/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/control_plane/close_workspace.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/control_plane/create_workspace.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/control_plane/list_workspaces.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/control_plane/read_workspace.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/control_plane/update_workspace.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/dead_letters/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/dead_letters/list_dead_letters.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/dead_letters/replay_dead_letter.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/domains/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/domains/disable_domain.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/domains/get_domain.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/domains/list_domains.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/domains/register_domain.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/domains/verify_domain.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/drafts/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/drafts/cancel_draft.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/drafts/create_draft.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/drafts/delete_draft.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/drafts/get_draft.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/drafts/list_drafts.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/drafts/schedule_draft.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/drafts/send_draft.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/drafts/update_draft.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/events/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/events/poll_inbox_events.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/inboxes/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/inboxes/create_inbox.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/inboxes/delete_inbox.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/inboxes/get_inbox.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/inboxes/list_inboxes.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/inboxes/register_webhook.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/inboxes/rotate_webhook_secret.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/inboxes/update_inbox.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/mail_policy/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/mail_policy/create_inbox_mail_policy_rule.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/mail_policy/create_mail_policy_rule.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/mail_policy/delete_mail_policy_rule.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/mail_policy/get_inbox_mail_policy.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/mail_policy/get_mail_policy.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/mail_policy/list_inbox_mail_policy_rules.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/mail_policy/list_mail_policy_rules.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/mail_policy/update_inbox_mail_policy.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/mail_policy/update_mail_policy.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/messages/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/messages/download_raw_message.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/messages/download_received_attachment.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/messages/get_message.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/messages/get_thread.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/messages/list_messages.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/messages/list_received_attachments.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/messages/list_threads.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/messages/update_message_state.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/metrics/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/metrics/inbox_metrics.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/metrics/workspace_metrics.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/privacy/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/privacy/create_erasure_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/privacy/read_erasure_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/public/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/public/agent_signup.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/public/agent_verify.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/search/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/search/search.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/security/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/security/get_risk_feedback.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/security/list_audit_events.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/security/record_risk_feedback.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/send/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/send/forward_message.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/send/send.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/webhook_subscriptions/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/webhook_subscriptions/create_webhook_subscription.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/webhook_subscriptions/delete_webhook_subscription.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/webhook_subscriptions/get_webhook_subscription.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/webhook_subscriptions/list_webhook_subscriptions.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/webhook_subscriptions/rotate_webhook_subscription.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/api/webhook_subscriptions/update_webhook_subscription.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/client.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/errors.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/__init__.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/attachment_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/attendee_input.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/attendee_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/attendee_out_response.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/audit_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/audit_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/availability_input.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/availability_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/block_rule_create.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/block_rule_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/block_rule_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/booking_input.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/calendar_fact.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/calendar_fact_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/check_domain_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/consent_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/consent_response.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/create_erasure_request_response_create_erasure_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/create_in.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/daily_usage.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/dead_letter_response.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/delivery_cohort.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/delivery_cohort_current_status.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/delivery_cohort_provider_outcomes.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/delivery_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/dns_record.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/domain_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/domain_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/draft_create.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/draft_edit.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/draft_file_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/draft_message_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/draft_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/draft_out_state.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/draft_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/draft_schedule.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/erasure_request_body.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/event_create.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/event_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/event_out_source.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/event_out_status.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/event_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/event_patch.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/exception_put.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/feedback_change.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/feedback_change_assessment.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/feedback_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/feedback_out_assessment.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/forward_message_response_forward_message.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/forward_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/free_busy_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/http_validation_error.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/inbox_create_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/inbox_deleted.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/inbox_event.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/inbox_event_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/inbox_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/inbox_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/inbox_response.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/inbox_update_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/instance_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/instance_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/interval_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/invitation_input.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/invitation_input_method.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/list_drafts_state_type_0.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/message_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/message_out_spam_verdict_type_0.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/message_out_virus_verdict_type_0.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/message_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/message_state.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/metrics_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/metrics_window.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/outgoing_attachment.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/policy_change.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/policy_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/poll_inbox_events_start.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/read_erasure_request_response_read_erasure_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/register_domain_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/reminder_input.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/reminder_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/replay_response.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/respond_input.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/respond_input_response.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/revision.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/revoke_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/revoke_response_revoke.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/rule_create.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/rule_create_direction.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/rule_create_effect.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/rule_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/rule_out_direction.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/rule_out_effect.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/rule_out_kind.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/search_match.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/search_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/search_response.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/send_draft_response_send_draft.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/send_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/send_response_send.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/series_edit_input.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/series_edit_input_scope.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/signup_in.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/signup_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/state_change.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/subscription_change.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/subscription_change_event_types_type_0_item.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/subscription_change_headers_type_0.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/subscription_create.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/subscription_create_event_types_item.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/subscription_create_headers.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/subscription_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/subscription_out_event_types_item.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/thread_detail_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/thread_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/thread_page.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/timeline_item_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/update_in.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/usage_counts.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/validation_error.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/validation_error_context.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/verify_in.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/verify_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/webhook_register_request.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/window_input.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/working_hours.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/workspace_list_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/models/workspace_out.py +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/py.typed +0 -0
- {daknode-0.3.9 → daknode-0.3.10}/daknode/types.py +0 -0
daknode-0.3.10/PKG-INFO
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: daknode
|
|
3
|
+
Version: 0.3.10
|
|
4
|
+
Summary: Typed sync and async client for DakNode's email and inbox-calendar API
|
|
5
|
+
Keywords: daknode,email,calendar,sdk
|
|
6
|
+
Requires-Python: >=3.9,<4.0
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
15
|
+
Requires-Dist: attrs (>=22.2.0)
|
|
16
|
+
Requires-Dist: httpx (>=0.23.0,<0.29.0)
|
|
17
|
+
Requires-Dist: python-dateutil (>=2.8.0,<3.0.0)
|
|
18
|
+
Project-URL: Documentation, https://daknode.com/integrations/python/
|
|
19
|
+
Project-URL: Homepage, https://daknode.com
|
|
20
|
+
Project-URL: Security, https://daknode.com/security/reporting/
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
23
|
+
# DakNode Python SDK
|
|
24
|
+
|
|
25
|
+
Typed synchronous and asynchronous client for DakNode's public email and
|
|
26
|
+
inbox-calendar API. Keep credentials on your server, never in browser code.
|
|
27
|
+
|
|
28
|
+
## Install and configure
|
|
29
|
+
|
|
30
|
+
Use Python 3.10+ for this starter, in an isolated virtual environment.
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
python -m pip install 'daknode>=0.3.9,<0.4'
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Configure DAKNODE_API_KEY through your server's private secret settings and
|
|
37
|
+
DAKNODE_INBOX_ID with an inbox UUID you are authorized to read. Obtain both from
|
|
38
|
+
the console. Do not put keys in command arguments, chat, source control or logs.
|
|
39
|
+
The operation needs messages.read. Workspace boundaries apply; inbox-scoped
|
|
40
|
+
keys require an eligible plan. Do not add send permissions for this example.
|
|
41
|
+
|
|
42
|
+
## First operation: count one page
|
|
43
|
+
|
|
44
|
+
Save this tested starter as daknode_tools.py, then run
|
|
45
|
+
`python daknode_tools.py` in the configured environment. It makes one bounded
|
|
46
|
+
read and prints only a count. Importing the module performs no request.
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
"""Customer-side tools: one bounded SDK read, no mail contents or agent loop."""
|
|
50
|
+
import os
|
|
51
|
+
from uuid import UUID
|
|
52
|
+
|
|
53
|
+
from daknode import AuthenticatedClient
|
|
54
|
+
from daknode.api.messages import list_messages
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def count_recent_mail() -> int:
|
|
58
|
+
"""Count up to ten retained messages in the privately configured inbox."""
|
|
59
|
+
key = os.environ.get("DAKNODE_API_KEY", "").strip()
|
|
60
|
+
identifier = os.environ.get("DAKNODE_INBOX_ID", "")
|
|
61
|
+
if not key or not identifier:
|
|
62
|
+
raise RuntimeError("Configure DAKNODE_API_KEY and DAKNODE_INBOX_ID privately")
|
|
63
|
+
try:
|
|
64
|
+
inbox_id = UUID(identifier)
|
|
65
|
+
except ValueError:
|
|
66
|
+
raise RuntimeError("DAKNODE_INBOX_ID must be a valid inbox UUID") from None
|
|
67
|
+
try:
|
|
68
|
+
with AuthenticatedClient(base_url="https://api.daknode.com", token=key, timeout=10) as client:
|
|
69
|
+
response = list_messages.sync_detailed(inbox_id, client=client, limit=10)
|
|
70
|
+
except Exception:
|
|
71
|
+
# Do not propagate SDK/transport exceptions containing request headers.
|
|
72
|
+
raise RuntimeError("DakNode could not be reached; no mail was changed") from None
|
|
73
|
+
if response.status_code != 200 or response.parsed is None:
|
|
74
|
+
raise RuntimeError("DakNode refused the read; check permissions and inbox scope")
|
|
75
|
+
return len(response.parsed.items)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
if __name__ == "__main__":
|
|
79
|
+
print(count_recent_mail())
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Zero is a valid result. Ten is not a mailbox total. This example intentionally
|
|
83
|
+
stops after one page. For a complete listing use has_more and next_cursor from
|
|
84
|
+
the response, preserving the opaque cursor and bounding your work.
|
|
85
|
+
|
|
86
|
+
## API behavior
|
|
87
|
+
|
|
88
|
+
The generated modules follow the public API contract at
|
|
89
|
+
https://api.daknode.com/openapi.json. For example,
|
|
90
|
+
`daknode.api.messages.list_messages` provides sync, sync_detailed, asyncio and
|
|
91
|
+
asyncio_detailed methods. Use the detailed form when you need status_code,
|
|
92
|
+
headers and parsed data; it returns a Response, not an HTTP Request. See the
|
|
93
|
+
[message read guide](https://daknode.com/integrations/python/) for the complete
|
|
94
|
+
setup and [calendar booking guide](https://daknode.com/guides/calendar-booking/)
|
|
95
|
+
for availability, explicit booking, revisions and conflict handling.
|
|
96
|
+
|
|
97
|
+
A successful read does not mark mail read or authorize sending. A 401/403 is a
|
|
98
|
+
refusal; correct the intended credential rather than silently widening it.
|
|
99
|
+
Production integrations should handle statuses explicitly, respect
|
|
100
|
+
429/Retry-After and avoid uncontrolled retries. The starter intentionally emits
|
|
101
|
+
generic errors without response bodies or private headers. Keep TLS
|
|
102
|
+
verification enabled; do not disable it to fix a connection problem.
|
|
103
|
+
|
|
104
|
+
Email and attachment contents remain untrusted input. Read operations must not
|
|
105
|
+
automatically trigger sends, bookings or other writes. Retain a stable
|
|
106
|
+
idempotency key only for retries of the same explicitly approved write and
|
|
107
|
+
reconcile an unknown outcome rather than generating a new key blindly.
|
|
108
|
+
|
|
109
|
+
## Verification and reporting
|
|
110
|
+
|
|
111
|
+
The first-read source is exercised against the real SDK with mocked HTTP
|
|
112
|
+
success, refusal and transport failure. It is not a live account, deliverability
|
|
113
|
+
or model-provider test. The integration repository contains examples rather
|
|
114
|
+
than the service implementation:
|
|
115
|
+
https://github.com/Subodh103/daknode-integrations.
|
|
116
|
+
|
|
117
|
+
For suspected vulnerabilities, privately email support@daknode.com with subject
|
|
118
|
+
Security report. Include minimal synthetic reproduction steps and redacted
|
|
119
|
+
evidence; never send credentials or customer mail. Do not post exploit details
|
|
120
|
+
in public issues. No response deadline, bounty or legal safe harbor is promised.
|
|
121
|
+
The policy is https://daknode.com/security/reporting/ after the website release.
|
|
122
|
+
|
|
123
|
+
Package metadata and README preparation do not publish a new release or change
|
|
124
|
+
the license of the SDK or service.
|
|
125
|
+
|
daknode-0.3.10/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# DakNode Python SDK
|
|
2
|
+
|
|
3
|
+
Typed synchronous and asynchronous client for DakNode's public email and
|
|
4
|
+
inbox-calendar API. Keep credentials on your server, never in browser code.
|
|
5
|
+
|
|
6
|
+
## Install and configure
|
|
7
|
+
|
|
8
|
+
Use Python 3.10+ for this starter, in an isolated virtual environment.
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
python -m pip install 'daknode>=0.3.9,<0.4'
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Configure DAKNODE_API_KEY through your server's private secret settings and
|
|
15
|
+
DAKNODE_INBOX_ID with an inbox UUID you are authorized to read. Obtain both from
|
|
16
|
+
the console. Do not put keys in command arguments, chat, source control or logs.
|
|
17
|
+
The operation needs messages.read. Workspace boundaries apply; inbox-scoped
|
|
18
|
+
keys require an eligible plan. Do not add send permissions for this example.
|
|
19
|
+
|
|
20
|
+
## First operation: count one page
|
|
21
|
+
|
|
22
|
+
Save this tested starter as daknode_tools.py, then run
|
|
23
|
+
`python daknode_tools.py` in the configured environment. It makes one bounded
|
|
24
|
+
read and prints only a count. Importing the module performs no request.
|
|
25
|
+
|
|
26
|
+
```python
|
|
27
|
+
"""Customer-side tools: one bounded SDK read, no mail contents or agent loop."""
|
|
28
|
+
import os
|
|
29
|
+
from uuid import UUID
|
|
30
|
+
|
|
31
|
+
from daknode import AuthenticatedClient
|
|
32
|
+
from daknode.api.messages import list_messages
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def count_recent_mail() -> int:
|
|
36
|
+
"""Count up to ten retained messages in the privately configured inbox."""
|
|
37
|
+
key = os.environ.get("DAKNODE_API_KEY", "").strip()
|
|
38
|
+
identifier = os.environ.get("DAKNODE_INBOX_ID", "")
|
|
39
|
+
if not key or not identifier:
|
|
40
|
+
raise RuntimeError("Configure DAKNODE_API_KEY and DAKNODE_INBOX_ID privately")
|
|
41
|
+
try:
|
|
42
|
+
inbox_id = UUID(identifier)
|
|
43
|
+
except ValueError:
|
|
44
|
+
raise RuntimeError("DAKNODE_INBOX_ID must be a valid inbox UUID") from None
|
|
45
|
+
try:
|
|
46
|
+
with AuthenticatedClient(base_url="https://api.daknode.com", token=key, timeout=10) as client:
|
|
47
|
+
response = list_messages.sync_detailed(inbox_id, client=client, limit=10)
|
|
48
|
+
except Exception:
|
|
49
|
+
# Do not propagate SDK/transport exceptions containing request headers.
|
|
50
|
+
raise RuntimeError("DakNode could not be reached; no mail was changed") from None
|
|
51
|
+
if response.status_code != 200 or response.parsed is None:
|
|
52
|
+
raise RuntimeError("DakNode refused the read; check permissions and inbox scope")
|
|
53
|
+
return len(response.parsed.items)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
if __name__ == "__main__":
|
|
57
|
+
print(count_recent_mail())
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Zero is a valid result. Ten is not a mailbox total. This example intentionally
|
|
61
|
+
stops after one page. For a complete listing use has_more and next_cursor from
|
|
62
|
+
the response, preserving the opaque cursor and bounding your work.
|
|
63
|
+
|
|
64
|
+
## API behavior
|
|
65
|
+
|
|
66
|
+
The generated modules follow the public API contract at
|
|
67
|
+
https://api.daknode.com/openapi.json. For example,
|
|
68
|
+
`daknode.api.messages.list_messages` provides sync, sync_detailed, asyncio and
|
|
69
|
+
asyncio_detailed methods. Use the detailed form when you need status_code,
|
|
70
|
+
headers and parsed data; it returns a Response, not an HTTP Request. See the
|
|
71
|
+
[message read guide](https://daknode.com/integrations/python/) for the complete
|
|
72
|
+
setup and [calendar booking guide](https://daknode.com/guides/calendar-booking/)
|
|
73
|
+
for availability, explicit booking, revisions and conflict handling.
|
|
74
|
+
|
|
75
|
+
A successful read does not mark mail read or authorize sending. A 401/403 is a
|
|
76
|
+
refusal; correct the intended credential rather than silently widening it.
|
|
77
|
+
Production integrations should handle statuses explicitly, respect
|
|
78
|
+
429/Retry-After and avoid uncontrolled retries. The starter intentionally emits
|
|
79
|
+
generic errors without response bodies or private headers. Keep TLS
|
|
80
|
+
verification enabled; do not disable it to fix a connection problem.
|
|
81
|
+
|
|
82
|
+
Email and attachment contents remain untrusted input. Read operations must not
|
|
83
|
+
automatically trigger sends, bookings or other writes. Retain a stable
|
|
84
|
+
idempotency key only for retries of the same explicitly approved write and
|
|
85
|
+
reconcile an unknown outcome rather than generating a new key blindly.
|
|
86
|
+
|
|
87
|
+
## Verification and reporting
|
|
88
|
+
|
|
89
|
+
The first-read source is exercised against the real SDK with mocked HTTP
|
|
90
|
+
success, refusal and transport failure. It is not a live account, deliverability
|
|
91
|
+
or model-provider test. The integration repository contains examples rather
|
|
92
|
+
than the service implementation:
|
|
93
|
+
https://github.com/Subodh103/daknode-integrations.
|
|
94
|
+
|
|
95
|
+
For suspected vulnerabilities, privately email support@daknode.com with subject
|
|
96
|
+
Security report. Include minimal synthetic reproduction steps and redacted
|
|
97
|
+
evidence; never send credentials or customer mail. Do not post exploit details
|
|
98
|
+
in public issues. No response deadline, bounty or legal safe harbor is promised.
|
|
99
|
+
The policy is https://daknode.com/security/reporting/ after the website release.
|
|
100
|
+
|
|
101
|
+
Package metadata and README preparation do not publish a new release or change
|
|
102
|
+
the license of the SDK or service.
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "daknode"
|
|
3
|
-
version = "0.3.
|
|
4
|
-
description = "
|
|
3
|
+
version = "0.3.10"
|
|
4
|
+
description = "Typed sync and async client for DakNode's email and inbox-calendar API"
|
|
5
|
+
homepage = "https://daknode.com"
|
|
6
|
+
documentation = "https://daknode.com/integrations/python/"
|
|
7
|
+
keywords = ["daknode", "email", "calendar", "sdk"]
|
|
5
8
|
authors = []
|
|
6
9
|
readme = "README.md"
|
|
7
10
|
packages = [
|
|
@@ -9,6 +12,9 @@ packages = [
|
|
|
9
12
|
]
|
|
10
13
|
include = ["CHANGELOG.md", "daknode/py.typed"]
|
|
11
14
|
|
|
15
|
+
[tool.poetry.urls]
|
|
16
|
+
Security = "https://daknode.com/security/reporting/"
|
|
17
|
+
|
|
12
18
|
[tool.poetry.dependencies]
|
|
13
19
|
python = "^3.9"
|
|
14
20
|
httpx = ">=0.23.0,<0.29.0"
|
daknode-0.3.9/PKG-INFO
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: daknode
|
|
3
|
-
Version: 0.3.9
|
|
4
|
-
Summary: A client library for accessing DakNode
|
|
5
|
-
Requires-Python: >=3.9,<4.0
|
|
6
|
-
Classifier: Programming Language :: Python :: 3
|
|
7
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
8
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
9
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
10
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
11
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.15
|
|
14
|
-
Requires-Dist: attrs (>=22.2.0)
|
|
15
|
-
Requires-Dist: httpx (>=0.23.0,<0.29.0)
|
|
16
|
-
Requires-Dist: python-dateutil (>=2.8.0,<3.0.0)
|
|
17
|
-
Description-Content-Type: text/markdown
|
|
18
|
-
|
|
19
|
-
# daknode
|
|
20
|
-
A client library for accessing DakNode
|
|
21
|
-
|
|
22
|
-
## Usage
|
|
23
|
-
First, create a client:
|
|
24
|
-
|
|
25
|
-
```python
|
|
26
|
-
from daknode import Client
|
|
27
|
-
|
|
28
|
-
client = Client(base_url="https://api.example.com")
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
If the endpoints you're going to hit require authentication, use `AuthenticatedClient` instead:
|
|
32
|
-
|
|
33
|
-
```python
|
|
34
|
-
from daknode import AuthenticatedClient
|
|
35
|
-
|
|
36
|
-
client = AuthenticatedClient(base_url="https://api.example.com", token="SuperSecretToken")
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Now call your endpoint and use your models:
|
|
40
|
-
|
|
41
|
-
```python
|
|
42
|
-
from daknode.models import MyDataModel
|
|
43
|
-
from daknode.api.my_tag import get_my_data_model
|
|
44
|
-
from daknode.types import Response
|
|
45
|
-
|
|
46
|
-
with client as client:
|
|
47
|
-
my_data: MyDataModel = get_my_data_model.sync(client=client)
|
|
48
|
-
# or if you need more info (e.g. status_code)
|
|
49
|
-
response: Response[MyDataModel] = get_my_data_model.sync_detailed(client=client)
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
Or do the same thing with an async version:
|
|
53
|
-
|
|
54
|
-
```python
|
|
55
|
-
from daknode.models import MyDataModel
|
|
56
|
-
from daknode.api.my_tag import get_my_data_model
|
|
57
|
-
from daknode.types import Response
|
|
58
|
-
|
|
59
|
-
async with client as client:
|
|
60
|
-
my_data: MyDataModel = await get_my_data_model.asyncio(client=client)
|
|
61
|
-
response: Response[MyDataModel] = await get_my_data_model.asyncio_detailed(client=client)
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
By default, when you're calling an HTTPS API it will attempt to verify that SSL is working correctly. Using certificate verification is highly recommended most of the time, but sometimes you may need to authenticate to a server (especially an internal server) using a custom certificate bundle.
|
|
65
|
-
|
|
66
|
-
```python
|
|
67
|
-
client = AuthenticatedClient(
|
|
68
|
-
base_url="https://internal_api.example.com",
|
|
69
|
-
token="SuperSecretToken",
|
|
70
|
-
verify_ssl="/path/to/certificate_bundle.pem",
|
|
71
|
-
)
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
You can also disable certificate validation altogether, but beware that **this is a security risk**.
|
|
75
|
-
|
|
76
|
-
```python
|
|
77
|
-
client = AuthenticatedClient(
|
|
78
|
-
base_url="https://internal_api.example.com",
|
|
79
|
-
token="SuperSecretToken",
|
|
80
|
-
verify_ssl=False
|
|
81
|
-
)
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Things to know:
|
|
85
|
-
1. Every path/method combo becomes a Python module with four functions:
|
|
86
|
-
1. `sync`: Blocking request that returns parsed data (if successful) or `None`
|
|
87
|
-
1. `sync_detailed`: Blocking request that always returns a `Request`, optionally with `parsed` set if the request was successful.
|
|
88
|
-
1. `asyncio`: Like `sync` but async instead of blocking
|
|
89
|
-
1. `asyncio_detailed`: Like `sync_detailed` but async instead of blocking
|
|
90
|
-
|
|
91
|
-
1. All path/query params, and bodies become method arguments.
|
|
92
|
-
1. If your endpoint had any tags on it, the first tag will be used as a module name for the function (my_tag above)
|
|
93
|
-
1. Any endpoint which did not have a tag will be in `daknode.api.default`
|
|
94
|
-
|
|
95
|
-
## Advanced customizations
|
|
96
|
-
|
|
97
|
-
There are more settings on the generated `Client` class which let you control more runtime behavior, check out the docstring on that class for more info. You can also customize the underlying `httpx.Client` or `httpx.AsyncClient` (depending on your use-case):
|
|
98
|
-
|
|
99
|
-
```python
|
|
100
|
-
from daknode import Client
|
|
101
|
-
|
|
102
|
-
def log_request(request):
|
|
103
|
-
print(f"Request event hook: {request.method} {request.url} - Waiting for response")
|
|
104
|
-
|
|
105
|
-
def log_response(response):
|
|
106
|
-
request = response.request
|
|
107
|
-
print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}")
|
|
108
|
-
|
|
109
|
-
client = Client(
|
|
110
|
-
base_url="https://api.example.com",
|
|
111
|
-
httpx_args={"event_hooks": {"request": [log_request], "response": [log_response]}},
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
# Or get the underlying httpx client to modify directly with client.get_httpx_client() or client.get_async_httpx_client()
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
You can even set the httpx client directly, but beware that this will override any existing settings (e.g., base_url):
|
|
118
|
-
|
|
119
|
-
```python
|
|
120
|
-
import httpx
|
|
121
|
-
from daknode import Client
|
|
122
|
-
|
|
123
|
-
client = Client(
|
|
124
|
-
base_url="https://api.example.com",
|
|
125
|
-
)
|
|
126
|
-
# Note that base_url needs to be re-set, as would any shared cookies, headers, etc.
|
|
127
|
-
client.set_httpx_client(httpx.Client(base_url="https://api.example.com", proxies="http://localhost:8030"))
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
## Building / publishing this package
|
|
131
|
-
This project uses [Poetry](https://python-poetry.org/) to manage dependencies and packaging. Here are the basics:
|
|
132
|
-
1. Update the metadata in pyproject.toml (e.g. authors, version)
|
|
133
|
-
1. If you're using a private repository, configure it with Poetry
|
|
134
|
-
1. `poetry config repositories.<your-repository-name> <url-to-your-repository>`
|
|
135
|
-
1. `poetry config http-basic.<your-repository-name> <username> <password>`
|
|
136
|
-
1. Publish the client with `poetry publish --build -r <your-repository-name>` or, if for public PyPI, just `poetry publish --build`
|
|
137
|
-
|
|
138
|
-
If you want to install this client into another project without publishing it (e.g. for development) then:
|
|
139
|
-
1. If that project **is using Poetry**, you can simply do `poetry add <path-to-this-client>` from that project
|
|
140
|
-
1. If that project is not using Poetry:
|
|
141
|
-
1. Build a wheel with `poetry build -f wheel`
|
|
142
|
-
1. Install that wheel from the other project `pip install <path-to-wheel>`
|
|
143
|
-
|
daknode-0.3.9/README.md
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
# daknode
|
|
2
|
-
A client library for accessing DakNode
|
|
3
|
-
|
|
4
|
-
## Usage
|
|
5
|
-
First, create a client:
|
|
6
|
-
|
|
7
|
-
```python
|
|
8
|
-
from daknode import Client
|
|
9
|
-
|
|
10
|
-
client = Client(base_url="https://api.example.com")
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
If the endpoints you're going to hit require authentication, use `AuthenticatedClient` instead:
|
|
14
|
-
|
|
15
|
-
```python
|
|
16
|
-
from daknode import AuthenticatedClient
|
|
17
|
-
|
|
18
|
-
client = AuthenticatedClient(base_url="https://api.example.com", token="SuperSecretToken")
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Now call your endpoint and use your models:
|
|
22
|
-
|
|
23
|
-
```python
|
|
24
|
-
from daknode.models import MyDataModel
|
|
25
|
-
from daknode.api.my_tag import get_my_data_model
|
|
26
|
-
from daknode.types import Response
|
|
27
|
-
|
|
28
|
-
with client as client:
|
|
29
|
-
my_data: MyDataModel = get_my_data_model.sync(client=client)
|
|
30
|
-
# or if you need more info (e.g. status_code)
|
|
31
|
-
response: Response[MyDataModel] = get_my_data_model.sync_detailed(client=client)
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Or do the same thing with an async version:
|
|
35
|
-
|
|
36
|
-
```python
|
|
37
|
-
from daknode.models import MyDataModel
|
|
38
|
-
from daknode.api.my_tag import get_my_data_model
|
|
39
|
-
from daknode.types import Response
|
|
40
|
-
|
|
41
|
-
async with client as client:
|
|
42
|
-
my_data: MyDataModel = await get_my_data_model.asyncio(client=client)
|
|
43
|
-
response: Response[MyDataModel] = await get_my_data_model.asyncio_detailed(client=client)
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
By default, when you're calling an HTTPS API it will attempt to verify that SSL is working correctly. Using certificate verification is highly recommended most of the time, but sometimes you may need to authenticate to a server (especially an internal server) using a custom certificate bundle.
|
|
47
|
-
|
|
48
|
-
```python
|
|
49
|
-
client = AuthenticatedClient(
|
|
50
|
-
base_url="https://internal_api.example.com",
|
|
51
|
-
token="SuperSecretToken",
|
|
52
|
-
verify_ssl="/path/to/certificate_bundle.pem",
|
|
53
|
-
)
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
You can also disable certificate validation altogether, but beware that **this is a security risk**.
|
|
57
|
-
|
|
58
|
-
```python
|
|
59
|
-
client = AuthenticatedClient(
|
|
60
|
-
base_url="https://internal_api.example.com",
|
|
61
|
-
token="SuperSecretToken",
|
|
62
|
-
verify_ssl=False
|
|
63
|
-
)
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Things to know:
|
|
67
|
-
1. Every path/method combo becomes a Python module with four functions:
|
|
68
|
-
1. `sync`: Blocking request that returns parsed data (if successful) or `None`
|
|
69
|
-
1. `sync_detailed`: Blocking request that always returns a `Request`, optionally with `parsed` set if the request was successful.
|
|
70
|
-
1. `asyncio`: Like `sync` but async instead of blocking
|
|
71
|
-
1. `asyncio_detailed`: Like `sync_detailed` but async instead of blocking
|
|
72
|
-
|
|
73
|
-
1. All path/query params, and bodies become method arguments.
|
|
74
|
-
1. If your endpoint had any tags on it, the first tag will be used as a module name for the function (my_tag above)
|
|
75
|
-
1. Any endpoint which did not have a tag will be in `daknode.api.default`
|
|
76
|
-
|
|
77
|
-
## Advanced customizations
|
|
78
|
-
|
|
79
|
-
There are more settings on the generated `Client` class which let you control more runtime behavior, check out the docstring on that class for more info. You can also customize the underlying `httpx.Client` or `httpx.AsyncClient` (depending on your use-case):
|
|
80
|
-
|
|
81
|
-
```python
|
|
82
|
-
from daknode import Client
|
|
83
|
-
|
|
84
|
-
def log_request(request):
|
|
85
|
-
print(f"Request event hook: {request.method} {request.url} - Waiting for response")
|
|
86
|
-
|
|
87
|
-
def log_response(response):
|
|
88
|
-
request = response.request
|
|
89
|
-
print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}")
|
|
90
|
-
|
|
91
|
-
client = Client(
|
|
92
|
-
base_url="https://api.example.com",
|
|
93
|
-
httpx_args={"event_hooks": {"request": [log_request], "response": [log_response]}},
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
# Or get the underlying httpx client to modify directly with client.get_httpx_client() or client.get_async_httpx_client()
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
You can even set the httpx client directly, but beware that this will override any existing settings (e.g., base_url):
|
|
100
|
-
|
|
101
|
-
```python
|
|
102
|
-
import httpx
|
|
103
|
-
from daknode import Client
|
|
104
|
-
|
|
105
|
-
client = Client(
|
|
106
|
-
base_url="https://api.example.com",
|
|
107
|
-
)
|
|
108
|
-
# Note that base_url needs to be re-set, as would any shared cookies, headers, etc.
|
|
109
|
-
client.set_httpx_client(httpx.Client(base_url="https://api.example.com", proxies="http://localhost:8030"))
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
## Building / publishing this package
|
|
113
|
-
This project uses [Poetry](https://python-poetry.org/) to manage dependencies and packaging. Here are the basics:
|
|
114
|
-
1. Update the metadata in pyproject.toml (e.g. authors, version)
|
|
115
|
-
1. If you're using a private repository, configure it with Poetry
|
|
116
|
-
1. `poetry config repositories.<your-repository-name> <url-to-your-repository>`
|
|
117
|
-
1. `poetry config http-basic.<your-repository-name> <username> <password>`
|
|
118
|
-
1. Publish the client with `poetry publish --build -r <your-repository-name>` or, if for public PyPI, just `poetry publish --build`
|
|
119
|
-
|
|
120
|
-
If you want to install this client into another project without publishing it (e.g. for development) then:
|
|
121
|
-
1. If that project **is using Poetry**, you can simply do `poetry add <path-to-this-client>` from that project
|
|
122
|
-
1. If that project is not using Poetry:
|
|
123
|
-
1. Build a wheel with `poetry build -f wheel`
|
|
124
|
-
1. Install that wheel from the other project `pip install <path-to-wheel>`
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|