brivio 0.1.0__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.
- brivio-0.1.0/.gitignore +263 -0
- brivio-0.1.0/PKG-INFO +146 -0
- brivio-0.1.0/README.md +114 -0
- brivio-0.1.0/brivio/__init__.py +162 -0
- brivio-0.1.0/brivio/_transport.py +200 -0
- brivio-0.1.0/generated/.gitignore +66 -0
- brivio-0.1.0/generated/.gitlab-ci.yml +31 -0
- brivio-0.1.0/generated/.openapi-generator/FILES +177 -0
- brivio-0.1.0/generated/.openapi-generator/VERSION +1 -0
- brivio-0.1.0/generated/.openapi-generator-ignore +23 -0
- brivio-0.1.0/generated/.travis.yml +17 -0
- brivio-0.1.0/generated/README.md +423 -0
- brivio-0.1.0/generated/brivio/__init__.py +0 -0
- brivio-0.1.0/generated/brivio/_generated/__init__.py +351 -0
- brivio-0.1.0/generated/brivio/_generated/api/__init__.py +51 -0
- brivio-0.1.0/generated/brivio/_generated/api/affiliate_events_api.py +281 -0
- brivio-0.1.0/generated/brivio/_generated/api/affiliates_api.py +1572 -0
- brivio-0.1.0/generated/brivio/_generated/api/api_keys_api.py +1050 -0
- brivio-0.1.0/generated/brivio/_generated/api/articles_api.py +2500 -0
- brivio-0.1.0/generated/brivio/_generated/api/banking_api.py +4824 -0
- brivio-0.1.0/generated/brivio/_generated/api/bookings_api.py +841 -0
- brivio-0.1.0/generated/brivio/_generated/api/cabinet_api.py +281 -0
- brivio-0.1.0/generated/brivio/_generated/api/catalog_api.py +281 -0
- brivio-0.1.0/generated/brivio/_generated/api/comms_api.py +1151 -0
- brivio-0.1.0/generated/brivio/_generated/api/companies_api.py +1313 -0
- brivio-0.1.0/generated/brivio/_generated/api/compat_api.py +1139 -0
- brivio-0.1.0/generated/brivio/_generated/api/connect_api.py +595 -0
- brivio-0.1.0/generated/brivio/_generated/api/construction_api.py +595 -0
- brivio-0.1.0/generated/brivio/_generated/api/contacts_api.py +1415 -0
- brivio-0.1.0/generated/brivio/_generated/api/contracts_api.py +1415 -0
- brivio-0.1.0/generated/brivio/_generated/api/customers_api.py +297 -0
- brivio-0.1.0/generated/brivio/_generated/api/default_api.py +830 -0
- brivio-0.1.0/generated/brivio/_generated/api/dns_api.py +4340 -0
- brivio-0.1.0/generated/brivio/_generated/api/documents_api.py +1415 -0
- brivio-0.1.0/generated/brivio/_generated/api/domains_api.py +1640 -0
- brivio-0.1.0/generated/brivio/_generated/api/email_domains_api.py +1367 -0
- brivio-0.1.0/generated/brivio/_generated/api/emails_api.py +936 -0
- brivio-0.1.0/generated/brivio/_generated/api/expenses_api.py +1415 -0
- brivio-0.1.0/generated/brivio/_generated/api/fixed_assets_api.py +580 -0
- brivio-0.1.0/generated/brivio/_generated/api/hr_api.py +335 -0
- brivio-0.1.0/generated/brivio/_generated/api/inventory_api.py +1453 -0
- brivio-0.1.0/generated/brivio/_generated/api/invoices_api.py +3818 -0
- brivio-0.1.0/generated/brivio/_generated/api/locations_api.py +823 -0
- brivio-0.1.0/generated/brivio/_generated/api/marketing_api.py +1055 -0
- brivio-0.1.0/generated/brivio/_generated/api/me_api.py +281 -0
- brivio-0.1.0/generated/brivio/_generated/api/modules_api.py +282 -0
- brivio-0.1.0/generated/brivio/_generated/api/network_api.py +2497 -0
- brivio-0.1.0/generated/brivio/_generated/api/orders_api.py +1131 -0
- brivio-0.1.0/generated/brivio/_generated/api/payment_links_api.py +1154 -0
- brivio-0.1.0/generated/brivio/_generated/api/payment_methods_api.py +791 -0
- brivio-0.1.0/generated/brivio/_generated/api/payments_api.py +1221 -0
- brivio-0.1.0/generated/brivio/_generated/api/payouts_api.py +426 -0
- brivio-0.1.0/generated/brivio/_generated/api/projects_api.py +1415 -0
- brivio-0.1.0/generated/brivio/_generated/api/quotes_api.py +600 -0
- brivio-0.1.0/generated/brivio/_generated/api/realtime_api.py +271 -0
- brivio-0.1.0/generated/brivio/_generated/api/reservations_api.py +595 -0
- brivio-0.1.0/generated/brivio/_generated/api/series_api.py +352 -0
- brivio-0.1.0/generated/brivio/_generated/api/sites_api.py +335 -0
- brivio-0.1.0/generated/brivio/_generated/api/subscriptions_api.py +1619 -0
- brivio-0.1.0/generated/brivio/_generated/api/taxes_api.py +309 -0
- brivio-0.1.0/generated/brivio/_generated/api/time_entries_api.py +600 -0
- brivio-0.1.0/generated/brivio/_generated/api/trust_api.py +2049 -0
- brivio-0.1.0/generated/brivio/_generated/api/webhooks_api.py +2112 -0
- brivio-0.1.0/generated/brivio/_generated/api_client.py +801 -0
- brivio-0.1.0/generated/brivio/_generated/api_response.py +21 -0
- brivio-0.1.0/generated/brivio/_generated/configuration.py +581 -0
- brivio-0.1.0/generated/brivio/_generated/exceptions.py +216 -0
- brivio-0.1.0/generated/brivio/_generated/models/__init__.py +122 -0
- brivio-0.1.0/generated/brivio/_generated/models/article.py +109 -0
- brivio-0.1.0/generated/brivio/_generated/models/article_create.py +103 -0
- brivio-0.1.0/generated/brivio/_generated/models/bank_rule_input.py +152 -0
- brivio-0.1.0/generated/brivio/_generated/models/cancel_payment_link200_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/contact.py +121 -0
- brivio-0.1.0/generated/brivio/_generated/models/contact_create.py +115 -0
- brivio-0.1.0/generated/brivio/_generated/models/contract.py +99 -0
- brivio-0.1.0/generated/brivio/_generated/models/contract_create.py +101 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_article201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_banking_statement_import_request.py +99 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_company_search_request.py +95 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_contact201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_contract201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_dns_zone201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_document201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_email_domain201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_email_send202_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_expense201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_invoice201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_location201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_order_import_request.py +126 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_order_import_request_customer.py +96 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_order_import_request_customer_address.py +93 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_order_import_request_lines_inner.py +94 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_payment_link201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/create_project201_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/dns_record_create.py +95 -0
- brivio-0.1.0/generated/brivio/_generated/models/dns_zone.py +93 -0
- brivio-0.1.0/generated/brivio/_generated/models/dns_zone_create.py +89 -0
- brivio-0.1.0/generated/brivio/_generated/models/document.py +101 -0
- brivio-0.1.0/generated/brivio/_generated/models/document_create.py +113 -0
- brivio-0.1.0/generated/brivio/_generated/models/domain.py +96 -0
- brivio-0.1.0/generated/brivio/_generated/models/email.py +152 -0
- brivio-0.1.0/generated/brivio/_generated/models/email_address.py +90 -0
- brivio-0.1.0/generated/brivio/_generated/models/email_attachment.py +91 -0
- brivio-0.1.0/generated/brivio/_generated/models/email_dns_record.py +107 -0
- brivio-0.1.0/generated/brivio/_generated/models/email_domain.py +129 -0
- brivio-0.1.0/generated/brivio/_generated/models/email_domain_checks.py +95 -0
- brivio-0.1.0/generated/brivio/_generated/models/email_domain_create.py +89 -0
- brivio-0.1.0/generated/brivio/_generated/models/email_domain_verify_result.py +116 -0
- brivio-0.1.0/generated/brivio/_generated/models/email_event.py +97 -0
- brivio-0.1.0/generated/brivio/_generated/models/email_recipient.py +107 -0
- brivio-0.1.0/generated/brivio/_generated/models/email_send_request.py +153 -0
- brivio-0.1.0/generated/brivio/_generated/models/error.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/expense.py +100 -0
- brivio-0.1.0/generated/brivio/_generated/models/expense_create.py +104 -0
- brivio-0.1.0/generated/brivio/_generated/models/get_payment200_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/get_payment_link200_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/get_quote200_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/get_time_entry200_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice.py +125 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice_create.py +155 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice_create_items_inner.py +97 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice_paid_post_request.py +113 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice_partially_paid_post_request.py +113 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_create.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_reversed_post_request.py +113 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_reversed_webhook_data.py +107 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_reversed_webhook_data_reversal.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_webhook_data.py +117 -0
- brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_webhook_data_payment.py +105 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_articles200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_contacts200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_contracts200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_dns_zones200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_documents200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_domains200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_email_domains200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_emails200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_expenses200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_invoices200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_locations200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_me401_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_me401_response_error.py +91 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_modules200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_payment_links200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_payments200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_payouts200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_projects200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_quotes200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_sites200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/list_time_entries200_response.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/location.py +105 -0
- brivio-0.1.0/generated/brivio/_generated/models/location_create.py +93 -0
- brivio-0.1.0/generated/brivio/_generated/models/match_banking_transaction_request.py +89 -0
- brivio-0.1.0/generated/brivio/_generated/models/meta.py +95 -0
- brivio-0.1.0/generated/brivio/_generated/models/module.py +93 -0
- brivio-0.1.0/generated/brivio/_generated/models/payment.py +171 -0
- brivio-0.1.0/generated/brivio/_generated/models/payment_link.py +111 -0
- brivio-0.1.0/generated/brivio/_generated/models/payment_link_cancel_result.py +93 -0
- brivio-0.1.0/generated/brivio/_generated/models/payment_link_create.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/payment_link_created.py +96 -0
- brivio-0.1.0/generated/brivio/_generated/models/payment_refund_input.py +90 -0
- brivio-0.1.0/generated/brivio/_generated/models/payment_refund_result.py +95 -0
- brivio-0.1.0/generated/brivio/_generated/models/payout.py +124 -0
- brivio-0.1.0/generated/brivio/_generated/models/payout_item.py +108 -0
- brivio-0.1.0/generated/brivio/_generated/models/project.py +99 -0
- brivio-0.1.0/generated/brivio/_generated/models/project_create.py +112 -0
- brivio-0.1.0/generated/brivio/_generated/models/quote.py +122 -0
- brivio-0.1.0/generated/brivio/_generated/models/refund_payment200_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/site.py +93 -0
- brivio-0.1.0/generated/brivio/_generated/models/time_entry.py +116 -0
- brivio-0.1.0/generated/brivio/_generated/models/unmatch_banking_transaction_request.py +87 -0
- brivio-0.1.0/generated/brivio/_generated/models/usage_subscription_request.py +93 -0
- brivio-0.1.0/generated/brivio/_generated/models/verify_email_domain200_response.py +98 -0
- brivio-0.1.0/generated/brivio/_generated/models/webhook_delivery.py +102 -0
- brivio-0.1.0/generated/brivio/_generated/py.typed +0 -0
- brivio-0.1.0/generated/brivio/_generated/rest.py +258 -0
- brivio-0.1.0/generated/git_push.sh +57 -0
- brivio-0.1.0/generated/pyproject.toml +95 -0
- brivio-0.1.0/generated/requirements.txt +4 -0
- brivio-0.1.0/generated/setup.cfg +2 -0
- brivio-0.1.0/generated/setup.py +49 -0
- brivio-0.1.0/generated/test-requirements.txt +6 -0
- brivio-0.1.0/generated/tox.ini +9 -0
- brivio-0.1.0/pyproject.toml +66 -0
- brivio-0.1.0/tests/test_transport.py +189 -0
brivio-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
# Dependencies
|
|
2
|
+
node_modules
|
|
3
|
+
.pnpm-store
|
|
4
|
+
|
|
5
|
+
# Build outputs
|
|
6
|
+
# .next* covers every ad-hoc build dir (.next-perf, .next-verify,
|
|
7
|
+
# .next-audit, ...). Enumerating them had grown to 20+ entries below
|
|
8
|
+
# and still kept missing new ones.
|
|
9
|
+
.next*
|
|
10
|
+
out
|
|
11
|
+
dist
|
|
12
|
+
build
|
|
13
|
+
*.tsbuildinfo
|
|
14
|
+
# ESLint's per-file result cache. Declared as a turbo `lint` output so it
|
|
15
|
+
# survives cache hits; it is machine-local state, never source.
|
|
16
|
+
.eslintcache
|
|
17
|
+
.eslintcache-*
|
|
18
|
+
|
|
19
|
+
# Scratch build/typecheck logs (agent artifacts)
|
|
20
|
+
/tsc-*.txt
|
|
21
|
+
/ws-*.txt
|
|
22
|
+
/i18n-*.txt
|
|
23
|
+
/acct-test*.txt
|
|
24
|
+
/taxro-test*.txt
|
|
25
|
+
/_*.txt
|
|
26
|
+
/build-log.txt
|
|
27
|
+
/build-prepush.txt
|
|
28
|
+
/push-out*.txt
|
|
29
|
+
/site-mid.txt
|
|
30
|
+
/pe-head.txt
|
|
31
|
+
/pe-tail.txt
|
|
32
|
+
/audit-report.txt
|
|
33
|
+
/outdated-report.txt
|
|
34
|
+
/lh-*.json
|
|
35
|
+
/*-test*.txt
|
|
36
|
+
/mig-out.txt
|
|
37
|
+
/*.wip-backup
|
|
38
|
+
/dk-gen*.txt
|
|
39
|
+
/.tmp_*
|
|
40
|
+
/tc*.log
|
|
41
|
+
/vitest-billing.txt
|
|
42
|
+
/build-out.txt
|
|
43
|
+
/outdated.txt
|
|
44
|
+
/tmp-*.txt
|
|
45
|
+
/*-out.txt
|
|
46
|
+
/_*
|
|
47
|
+
!/_*/
|
|
48
|
+
|
|
49
|
+
# Environment
|
|
50
|
+
.env
|
|
51
|
+
.env.local
|
|
52
|
+
.env.*.local
|
|
53
|
+
!.env.example
|
|
54
|
+
|
|
55
|
+
# Terraform — state contains the CRON_SECRET in plaintext; never commit
|
|
56
|
+
**/.terraform/
|
|
57
|
+
*.tfstate
|
|
58
|
+
*.tfstate.backup
|
|
59
|
+
# State migrated to gs://brivio-iac-state, kept locally only until a
|
|
60
|
+
# GCS-backed apply has succeeded once. `*.tfstate` does not match a
|
|
61
|
+
# `.migrated` suffix, so without this the retired state file - which names
|
|
62
|
+
# every managed resource - would be committed.
|
|
63
|
+
*.tfstate.migrated
|
|
64
|
+
*.tfplan
|
|
65
|
+
tfplan
|
|
66
|
+
|
|
67
|
+
# transient secret material
|
|
68
|
+
tmp-cron-secret.txt
|
|
69
|
+
|
|
70
|
+
# Local company-data gather store (scripts/company-data)
|
|
71
|
+
/data/companies/
|
|
72
|
+
# SEAP/SICAP procurement CSVs cached by scripts/company-data/ingest-seap.mjs.
|
|
73
|
+
# A single quarter is up to 140 MB and a full 2016-2024 pass is several GB.
|
|
74
|
+
/data/seap/
|
|
75
|
+
/data/sanctions/
|
|
76
|
+
# Bulk ANAF/company datasets generated locally — hundreds of MB, never commit
|
|
77
|
+
scripts/company-data/*.csv
|
|
78
|
+
scripts/company-data/*.jsonl
|
|
79
|
+
scripts/company-data/*.ndjson
|
|
80
|
+
|
|
81
|
+
# IDE
|
|
82
|
+
.idea
|
|
83
|
+
.vscode/*
|
|
84
|
+
!.vscode/tasks.json
|
|
85
|
+
!.vscode/settings.json
|
|
86
|
+
!.vscode/extensions.json
|
|
87
|
+
!.vscode/mcp.json
|
|
88
|
+
*.swp
|
|
89
|
+
*.swo
|
|
90
|
+
.DS_Store
|
|
91
|
+
|
|
92
|
+
# Logs (anchored: a bare `logs` also hid the shipped route apps/web/src/app/(app)/developers/logs/ from git)
|
|
93
|
+
/logs
|
|
94
|
+
*.log
|
|
95
|
+
npm-debug.log*
|
|
96
|
+
yarn-debug.log*
|
|
97
|
+
yarn-error.log*
|
|
98
|
+
pnpm-debug.log*
|
|
99
|
+
|
|
100
|
+
# Testing
|
|
101
|
+
coverage
|
|
102
|
+
.nyc_output
|
|
103
|
+
|
|
104
|
+
# Turbo
|
|
105
|
+
.turbo
|
|
106
|
+
|
|
107
|
+
# Vercel
|
|
108
|
+
.vercel
|
|
109
|
+
|
|
110
|
+
# Database
|
|
111
|
+
*.db
|
|
112
|
+
*.sqlite
|
|
113
|
+
|
|
114
|
+
# Drizzle
|
|
115
|
+
drizzle/meta
|
|
116
|
+
|
|
117
|
+
# Serwist / generated service worker (built into public/ at build time)
|
|
118
|
+
/apps/web/public/sw.js
|
|
119
|
+
/apps/web/public/sw.js.map
|
|
120
|
+
/apps/web/public/swe-worker-*.js
|
|
121
|
+
|
|
122
|
+
# Misc
|
|
123
|
+
*.pem
|
|
124
|
+
.cache
|
|
125
|
+
Thumbs.db
|
|
126
|
+
|
|
127
|
+
# Local development
|
|
128
|
+
*.local
|
|
129
|
+
|
|
130
|
+
# Local object-storage driver root (dev/test uploads live here now that the
|
|
131
|
+
# signed-URL flow works without GCS — these are real user files, never commit)
|
|
132
|
+
**/.brivio-storage/
|
|
133
|
+
|
|
134
|
+
# Playwright auth state (`.auth-<target>` = E2E_AUTH_DIR per deployed target)
|
|
135
|
+
**/e2e/.auth/
|
|
136
|
+
**/e2e/.auth-*/
|
|
137
|
+
.pnpm-cache/
|
|
138
|
+
**/playwright-report/
|
|
139
|
+
**/test-results/
|
|
140
|
+
|
|
141
|
+
# Temporary output files
|
|
142
|
+
test-output*.txt
|
|
143
|
+
test-output*.json
|
|
144
|
+
tsc-output.txt
|
|
145
|
+
errors*.txt
|
|
146
|
+
.env*
|
|
147
|
+
# `.env*` above re-ignores what line ~53 negated (git takes the LAST match),
|
|
148
|
+
# so the committed templates must be re-allowed here, after it. `.env.qa`
|
|
149
|
+
# itself (QA-0014, real values) stays ignored via `.env*`.
|
|
150
|
+
!.env.example
|
|
151
|
+
!.env.qa.example
|
|
152
|
+
.next-prepush/
|
|
153
|
+
.next-lh/
|
|
154
|
+
/apps/web/.next-lh/
|
|
155
|
+
/apps/web/.next-pwa-build/
|
|
156
|
+
/apps/web/.next-pwa-build2/
|
|
157
|
+
/apps/web/.next-verify-build/
|
|
158
|
+
|
|
159
|
+
ts-out.txt
|
|
160
|
+
typecheck-out.txt
|
|
161
|
+
.private/
|
|
162
|
+
/apps/web/.next-prodcheck/
|
|
163
|
+
|
|
164
|
+
pw-list.txt
|
|
165
|
+
|
|
166
|
+
# Company-data gather/seed logs
|
|
167
|
+
scripts/company-data/*.log
|
|
168
|
+
/apps/web/.next-vtest/
|
|
169
|
+
/apps/web/.next-vercelsim/
|
|
170
|
+
/apps/web/.next-nosw/
|
|
171
|
+
/apps/web/.next-tbcmp/
|
|
172
|
+
/apps/web/.next-swtest/
|
|
173
|
+
/apps/web/.next-warncheck/
|
|
174
|
+
/apps/web/.next-cpucheck/
|
|
175
|
+
/apps/web/.next-debug/
|
|
176
|
+
|
|
177
|
+
# Ad-hoc analysis scratch scripts
|
|
178
|
+
_*.ps1
|
|
179
|
+
|
|
180
|
+
# Sealed contract PDFs (kept local only)
|
|
181
|
+
infra/certs/*.pdf
|
|
182
|
+
|
|
183
|
+
# Typecheck scratch output (R4-CI-01)
|
|
184
|
+
tsc-*.txt
|
|
185
|
+
|
|
186
|
+
# Terraform stale lock files
|
|
187
|
+
**/.terraform.tfstate.lock.info
|
|
188
|
+
/apps/web/.next-verify/
|
|
189
|
+
|
|
190
|
+
# tsc debug output dumps
|
|
191
|
+
tsc-*.txt
|
|
192
|
+
|
|
193
|
+
.playwright-mcp/
|
|
194
|
+
|
|
195
|
+
/data/legislation/
|
|
196
|
+
scripts/legislation-data/*.ndjson
|
|
197
|
+
scripts/legislation-data/*.log
|
|
198
|
+
/apps/web/.next-prepush2/
|
|
199
|
+
|
|
200
|
+
# tsc scratch output (R7-ARC-06)
|
|
201
|
+
tmp-tsc-*.txt
|
|
202
|
+
tsc-*.txt
|
|
203
|
+
tmp-libtest.txt
|
|
204
|
+
|
|
205
|
+
# local https dev proxy binaries + certs
|
|
206
|
+
.dev-proxy/bin/
|
|
207
|
+
.dev-proxy/certs/
|
|
208
|
+
|
|
209
|
+
# Cloudflare Workers local state
|
|
210
|
+
.wrangler/
|
|
211
|
+
**/.wrangler/
|
|
212
|
+
|
|
213
|
+
# Python SDK build + tooling output. The generated/ tree IS committed on
|
|
214
|
+
# purpose (it is the SDK's API surface and must be reviewable in diffs), but
|
|
215
|
+
# nothing derived from it is.
|
|
216
|
+
__pycache__/
|
|
217
|
+
*.py[cod]
|
|
218
|
+
*.egg-info/
|
|
219
|
+
.pytest_cache/
|
|
220
|
+
.mypy_cache/
|
|
221
|
+
.ruff_cache/
|
|
222
|
+
.venv/
|
|
223
|
+
**/.copilot-venv/
|
|
224
|
+
**/.copilot-build/
|
|
225
|
+
|
|
226
|
+
# .NET SDK build output. Scoped to the .NET package rather than global `bin/`,
|
|
227
|
+
# which would swallow unrelated directories elsewhere in the monorepo.
|
|
228
|
+
packages/sdk-dotnet/**/bin/
|
|
229
|
+
packages/sdk-dotnet/**/obj/
|
|
230
|
+
**/.copilot-nupkg/
|
|
231
|
+
*.nupkg
|
|
232
|
+
*.snupkg
|
|
233
|
+
|
|
234
|
+
# Java SDK build output. Scoped to the package rather than a global `target/`,
|
|
235
|
+
# which is a common source directory name elsewhere.
|
|
236
|
+
packages/sdk-java/target/
|
|
237
|
+
*.class
|
|
238
|
+
|
|
239
|
+
# PHP SDK build output. composer.lock is intentionally ignored: this is a
|
|
240
|
+
# library, so consumers resolve their own dependency versions and committing a
|
|
241
|
+
# lock would only pin our dev tooling.
|
|
242
|
+
packages/sdk-php/vendor/
|
|
243
|
+
packages/sdk-php/composer.lock
|
|
244
|
+
packages/sdk-php/.phpunit.cache/
|
|
245
|
+
packages/sdk-php/.phpunit.result.cache
|
|
246
|
+
|
|
247
|
+
# Storybook static build. Regenerated by `pnpm --filter @brivio/ui
|
|
248
|
+
# storybook:build`; Chromatic uploads it from CI rather than from git.
|
|
249
|
+
storybook-static/
|
|
250
|
+
|
|
251
|
+
# The commit mutex belongs in .git/, but a hook invoked from another cwd
|
|
252
|
+
# writes it here. It is runtime state, never source.
|
|
253
|
+
brivio-commit.lock
|
|
254
|
+
/data/asscon/
|
|
255
|
+
|
|
256
|
+
# fumadocs-mdx macro cache (apps/docs, DS2-0076) - regenerated on every build
|
|
257
|
+
**/.source/
|
|
258
|
+
|
|
259
|
+
# AXIOM runtime state (profiles/gate-profile are tracked; everything else is per-machine)
|
|
260
|
+
.axiom/*
|
|
261
|
+
!.axiom/profiles/
|
|
262
|
+
!.axiom/gate-profile.json
|
|
263
|
+
|
brivio-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: brivio
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Official Brivio SDK — invoicing, e-Factura, contacts and more for the Romanian market
|
|
5
|
+
Project-URL: Homepage, https://brivio.ro
|
|
6
|
+
Project-URL: Documentation, https://brivio.ro/developers/docs
|
|
7
|
+
Project-URL: Source, https://github.com/brivio-ro/brivio-sdk-python
|
|
8
|
+
Project-URL: Issues, https://github.com/brivio-ro/brivio-sdk-python/issues
|
|
9
|
+
Author-email: Brivio <dev@brivio.ro>
|
|
10
|
+
License: MIT
|
|
11
|
+
Keywords: anaf,brivio,e-factura,efactura,invoicing,romania
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Office/Business :: Financial :: Accounting
|
|
22
|
+
Requires-Python: >=3.9
|
|
23
|
+
Requires-Dist: pydantic<3,>=2
|
|
24
|
+
Requires-Dist: python-dateutil>=2.8
|
|
25
|
+
Requires-Dist: typing-extensions>=4.7
|
|
26
|
+
Requires-Dist: urllib3<3,>=2.0
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: mypy>=1.8; extra == 'dev'
|
|
29
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
30
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
31
|
+
Description-Content-Type: text/markdown
|
|
32
|
+
|
|
33
|
+
# Brivio SDK for Python
|
|
34
|
+
|
|
35
|
+
Official Python client for the [Brivio](https://brivio.ro) API — invoicing,
|
|
36
|
+
e-Factura, contacts, articles and more, for the Romanian market.
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pip install brivio
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Quick start
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
from brivio import Brivio
|
|
46
|
+
|
|
47
|
+
client = Brivio(api_key="brivio_sk_live_…")
|
|
48
|
+
|
|
49
|
+
# Verify the key and see which organization it belongs to.
|
|
50
|
+
print(client.me())
|
|
51
|
+
|
|
52
|
+
# One page, with pagination metadata.
|
|
53
|
+
page = client.contacts.list(search="srl")
|
|
54
|
+
print(f"{len(page)} of {page.total} contacts")
|
|
55
|
+
|
|
56
|
+
# Or walk every page lazily — no manual page arithmetic.
|
|
57
|
+
for contact in client.contacts.iterate(search="srl"):
|
|
58
|
+
print(contact["name"])
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Invoicing
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
invoice = client.invoices.create(
|
|
65
|
+
{
|
|
66
|
+
"contactId": "ct_123",
|
|
67
|
+
"currency": "RON",
|
|
68
|
+
"lines": [{"description": "Consultanță", "quantity": 1, "unitPrice": 1000, "vatRate": 21}],
|
|
69
|
+
},
|
|
70
|
+
# Safe to retry: the same key never creates a second invoice.
|
|
71
|
+
idempotency_key="order-42",
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
client.invoices.send(invoice["id"])
|
|
75
|
+
client.invoices.submit_efactura(invoice["id"])
|
|
76
|
+
print(client.invoices.efactura_status(invoice["id"]))
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Errors
|
|
80
|
+
|
|
81
|
+
Every failure raises `BrivioError`:
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
from brivio import Brivio, BrivioError
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
client.contacts.create({})
|
|
88
|
+
except BrivioError as err:
|
|
89
|
+
print(err.code) # "VALIDATION_ERROR"
|
|
90
|
+
print(err.status) # 422
|
|
91
|
+
print(err.details) # {"name": ["required"]}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
`status == 0` means the request never reached the API (DNS, connection reset,
|
|
95
|
+
timeout) rather than the API rejecting it.
|
|
96
|
+
|
|
97
|
+
## Retries and timeouts
|
|
98
|
+
|
|
99
|
+
Transient failures (`429`, `502`, `503`, `504`, network errors) are retried
|
|
100
|
+
automatically — twice by default — with exponential backoff plus jitter, and
|
|
101
|
+
`Retry-After` is honoured on `429`. Other 4xx responses are **not** retried:
|
|
102
|
+
they fail identically every time.
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
client = Brivio(
|
|
106
|
+
api_key="…",
|
|
107
|
+
max_retries=5, # 0 disables
|
|
108
|
+
timeout=10.0, # seconds; 0 disables
|
|
109
|
+
base_url="https://api.brivio.ro/v1",
|
|
110
|
+
)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Endpoints without a helper
|
|
114
|
+
|
|
115
|
+
The typed resources cover the common surface. Anything else is one call away
|
|
116
|
+
and still gets retries, error mapping and envelope unwrapping:
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
zones = client.request("GET", "/dns/zones")
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Typed models
|
|
123
|
+
|
|
124
|
+
Generated Pydantic models for every schema in the API live under
|
|
125
|
+
`brivio._generated.models`:
|
|
126
|
+
|
|
127
|
+
```python
|
|
128
|
+
from brivio._generated.models.contact import Contact
|
|
129
|
+
|
|
130
|
+
contact = Contact.from_dict(client.contacts.get("ct_123"))
|
|
131
|
+
print(contact.name)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## How this SDK is built
|
|
135
|
+
|
|
136
|
+
Models and operation signatures are generated from the published OpenAPI
|
|
137
|
+
spec; the transport (retries, errors, pagination, idempotency) is
|
|
138
|
+
hand-written so every official Brivio SDK behaves identically. See
|
|
139
|
+
[`SDK_CONTRACT.md`](https://github.com/dragoscv/brivio/blob/main/docs/SDK_CONTRACT.md).
|
|
140
|
+
|
|
141
|
+
## Links
|
|
142
|
+
|
|
143
|
+
- API reference — <https://brivio.ro/developers/docs>
|
|
144
|
+
- Other SDKs — [TypeScript](https://www.npmjs.com/package/@brivio/sdk), [PHP](https://packagist.org/packages/brivio/sdk)
|
|
145
|
+
|
|
146
|
+
MIT © Brivio
|
brivio-0.1.0/README.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Brivio SDK for Python
|
|
2
|
+
|
|
3
|
+
Official Python client for the [Brivio](https://brivio.ro) API — invoicing,
|
|
4
|
+
e-Factura, contacts, articles and more, for the Romanian market.
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
pip install brivio
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Quick start
|
|
11
|
+
|
|
12
|
+
```python
|
|
13
|
+
from brivio import Brivio
|
|
14
|
+
|
|
15
|
+
client = Brivio(api_key="brivio_sk_live_…")
|
|
16
|
+
|
|
17
|
+
# Verify the key and see which organization it belongs to.
|
|
18
|
+
print(client.me())
|
|
19
|
+
|
|
20
|
+
# One page, with pagination metadata.
|
|
21
|
+
page = client.contacts.list(search="srl")
|
|
22
|
+
print(f"{len(page)} of {page.total} contacts")
|
|
23
|
+
|
|
24
|
+
# Or walk every page lazily — no manual page arithmetic.
|
|
25
|
+
for contact in client.contacts.iterate(search="srl"):
|
|
26
|
+
print(contact["name"])
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Invoicing
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
invoice = client.invoices.create(
|
|
33
|
+
{
|
|
34
|
+
"contactId": "ct_123",
|
|
35
|
+
"currency": "RON",
|
|
36
|
+
"lines": [{"description": "Consultanță", "quantity": 1, "unitPrice": 1000, "vatRate": 21}],
|
|
37
|
+
},
|
|
38
|
+
# Safe to retry: the same key never creates a second invoice.
|
|
39
|
+
idempotency_key="order-42",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
client.invoices.send(invoice["id"])
|
|
43
|
+
client.invoices.submit_efactura(invoice["id"])
|
|
44
|
+
print(client.invoices.efactura_status(invoice["id"]))
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Errors
|
|
48
|
+
|
|
49
|
+
Every failure raises `BrivioError`:
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
from brivio import Brivio, BrivioError
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
client.contacts.create({})
|
|
56
|
+
except BrivioError as err:
|
|
57
|
+
print(err.code) # "VALIDATION_ERROR"
|
|
58
|
+
print(err.status) # 422
|
|
59
|
+
print(err.details) # {"name": ["required"]}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`status == 0` means the request never reached the API (DNS, connection reset,
|
|
63
|
+
timeout) rather than the API rejecting it.
|
|
64
|
+
|
|
65
|
+
## Retries and timeouts
|
|
66
|
+
|
|
67
|
+
Transient failures (`429`, `502`, `503`, `504`, network errors) are retried
|
|
68
|
+
automatically — twice by default — with exponential backoff plus jitter, and
|
|
69
|
+
`Retry-After` is honoured on `429`. Other 4xx responses are **not** retried:
|
|
70
|
+
they fail identically every time.
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
client = Brivio(
|
|
74
|
+
api_key="…",
|
|
75
|
+
max_retries=5, # 0 disables
|
|
76
|
+
timeout=10.0, # seconds; 0 disables
|
|
77
|
+
base_url="https://api.brivio.ro/v1",
|
|
78
|
+
)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Endpoints without a helper
|
|
82
|
+
|
|
83
|
+
The typed resources cover the common surface. Anything else is one call away
|
|
84
|
+
and still gets retries, error mapping and envelope unwrapping:
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
zones = client.request("GET", "/dns/zones")
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Typed models
|
|
91
|
+
|
|
92
|
+
Generated Pydantic models for every schema in the API live under
|
|
93
|
+
`brivio._generated.models`:
|
|
94
|
+
|
|
95
|
+
```python
|
|
96
|
+
from brivio._generated.models.contact import Contact
|
|
97
|
+
|
|
98
|
+
contact = Contact.from_dict(client.contacts.get("ct_123"))
|
|
99
|
+
print(contact.name)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## How this SDK is built
|
|
103
|
+
|
|
104
|
+
Models and operation signatures are generated from the published OpenAPI
|
|
105
|
+
spec; the transport (retries, errors, pagination, idempotency) is
|
|
106
|
+
hand-written so every official Brivio SDK behaves identically. See
|
|
107
|
+
[`SDK_CONTRACT.md`](https://github.com/dragoscv/brivio/blob/main/docs/SDK_CONTRACT.md).
|
|
108
|
+
|
|
109
|
+
## Links
|
|
110
|
+
|
|
111
|
+
- API reference — <https://brivio.ro/developers/docs>
|
|
112
|
+
- Other SDKs — [TypeScript](https://www.npmjs.com/package/@brivio/sdk), [PHP](https://packagist.org/packages/brivio/sdk)
|
|
113
|
+
|
|
114
|
+
MIT © Brivio
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""Official Brivio SDK for Python.
|
|
2
|
+
|
|
3
|
+
from brivio import Brivio
|
|
4
|
+
|
|
5
|
+
client = Brivio(api_key="brivio_sk_live_…")
|
|
6
|
+
|
|
7
|
+
for contact in client.contacts.iterate(search="srl"):
|
|
8
|
+
print(contact["name"])
|
|
9
|
+
|
|
10
|
+
invoice = client.invoices.create({...}, idempotency_key="order-42")
|
|
11
|
+
|
|
12
|
+
Behaviour (retries, errors, pagination) follows ``docs/SDK_CONTRACT.md`` and is
|
|
13
|
+
identical across every official Brivio SDK.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from typing import Any, Iterator, Mapping
|
|
19
|
+
|
|
20
|
+
from ._transport import (
|
|
21
|
+
DEFAULT_BASE_URL,
|
|
22
|
+
DEFAULT_MAX_RETRIES,
|
|
23
|
+
DEFAULT_TIMEOUT_SECONDS,
|
|
24
|
+
BrivioError,
|
|
25
|
+
Page,
|
|
26
|
+
Transport,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
__all__ = ["Brivio", "BrivioError", "Page", "__version__"]
|
|
30
|
+
__version__ = "0.1.0"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class _Resource:
|
|
34
|
+
"""CRUD over one collection.
|
|
35
|
+
|
|
36
|
+
A thin, uniform wrapper rather than 139 generated methods: the generated
|
|
37
|
+
layer exists for models and exact operation signatures, but callers reach
|
|
38
|
+
for ``client.contacts.list()`` far more often than for a specific
|
|
39
|
+
operation id.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self, transport: Transport, path: str) -> None:
|
|
43
|
+
self._transport = transport
|
|
44
|
+
self._path = path
|
|
45
|
+
|
|
46
|
+
def list(self, **query: Any) -> Page:
|
|
47
|
+
"""One page. Use :meth:`iterate` to walk them all."""
|
|
48
|
+
return self._transport.get_page(self._path, query)
|
|
49
|
+
|
|
50
|
+
def iterate(self, **query: Any) -> Iterator[Any]:
|
|
51
|
+
"""Lazily yield every item across all pages."""
|
|
52
|
+
return self._transport.paginate(self._path, query)
|
|
53
|
+
|
|
54
|
+
def get(self, resource_id: str) -> Any:
|
|
55
|
+
data, _ = self._transport.request("GET", f"{self._path}/{resource_id}")
|
|
56
|
+
return data
|
|
57
|
+
|
|
58
|
+
def create(self, payload: Mapping[str, Any], *, idempotency_key: str | None = None) -> Any:
|
|
59
|
+
data, _ = self._transport.request(
|
|
60
|
+
"POST", self._path, body=payload, idempotency_key=idempotency_key
|
|
61
|
+
)
|
|
62
|
+
return data
|
|
63
|
+
|
|
64
|
+
def update(self, resource_id: str, payload: Mapping[str, Any]) -> Any:
|
|
65
|
+
data, _ = self._transport.request("PATCH", f"{self._path}/{resource_id}", body=payload)
|
|
66
|
+
return data
|
|
67
|
+
|
|
68
|
+
def delete(self, resource_id: str) -> None:
|
|
69
|
+
self._transport.request("DELETE", f"{self._path}/{resource_id}")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class _Invoices(_Resource):
|
|
73
|
+
"""Invoices, plus the lifecycle actions the API exposes."""
|
|
74
|
+
|
|
75
|
+
def send(self, invoice_id: str) -> Any:
|
|
76
|
+
"""Mark as sent (DRAFT → SENT). Idempotent server-side."""
|
|
77
|
+
data, _ = self._transport.request("POST", f"{self._path}/{invoice_id}/send")
|
|
78
|
+
return data
|
|
79
|
+
|
|
80
|
+
def submit_efactura(self, invoice_id: str) -> Any:
|
|
81
|
+
"""Submit to ANAF e-Factura."""
|
|
82
|
+
data, _ = self._transport.request("POST", f"{self._path}/{invoice_id}/submit-efactura")
|
|
83
|
+
return data
|
|
84
|
+
|
|
85
|
+
def efactura_status(self, invoice_id: str) -> Any:
|
|
86
|
+
data, _ = self._transport.request("GET", f"{self._path}/{invoice_id}/efactura")
|
|
87
|
+
return data
|
|
88
|
+
|
|
89
|
+
def payments(self, invoice_id: str) -> Page:
|
|
90
|
+
return self._transport.get_page(f"{self._path}/{invoice_id}/payments")
|
|
91
|
+
|
|
92
|
+
def add_payment(
|
|
93
|
+
self,
|
|
94
|
+
invoice_id: str,
|
|
95
|
+
payload: Mapping[str, Any],
|
|
96
|
+
*,
|
|
97
|
+
idempotency_key: str | None = None,
|
|
98
|
+
) -> Any:
|
|
99
|
+
data, _ = self._transport.request(
|
|
100
|
+
"POST",
|
|
101
|
+
f"{self._path}/{invoice_id}/payments",
|
|
102
|
+
body=payload,
|
|
103
|
+
idempotency_key=idempotency_key,
|
|
104
|
+
)
|
|
105
|
+
return data
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class Brivio:
|
|
109
|
+
"""Entry point.
|
|
110
|
+
|
|
111
|
+
:param api_key: ``brivio_sk_live_…`` or ``brivio_sk_test_…``.
|
|
112
|
+
:param base_url: override for self-hosted or staging.
|
|
113
|
+
:param max_retries: transient-failure retries; ``0`` disables.
|
|
114
|
+
:param timeout: per-request seconds; ``0`` disables.
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
def __init__(
|
|
118
|
+
self,
|
|
119
|
+
api_key: str,
|
|
120
|
+
*,
|
|
121
|
+
base_url: str = DEFAULT_BASE_URL,
|
|
122
|
+
max_retries: int = DEFAULT_MAX_RETRIES,
|
|
123
|
+
timeout: float = DEFAULT_TIMEOUT_SECONDS,
|
|
124
|
+
) -> None:
|
|
125
|
+
self._transport = Transport(
|
|
126
|
+
api_key=api_key, base_url=base_url, max_retries=max_retries, timeout=timeout
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
self.contacts = _Resource(self._transport, "/contacts")
|
|
130
|
+
self.articles = _Resource(self._transport, "/articles")
|
|
131
|
+
self.invoices = _Invoices(self._transport, "/invoices")
|
|
132
|
+
self.locations = _Resource(self._transport, "/locations")
|
|
133
|
+
self.projects = _Resource(self._transport, "/projects")
|
|
134
|
+
self.quotes = _Resource(self._transport, "/quotes")
|
|
135
|
+
self.expenses = _Resource(self._transport, "/expenses")
|
|
136
|
+
self.contracts = _Resource(self._transport, "/contracts")
|
|
137
|
+
self.documents = _Resource(self._transport, "/documents")
|
|
138
|
+
self.time_entries = _Resource(self._transport, "/time-entries")
|
|
139
|
+
|
|
140
|
+
def me(self) -> Any:
|
|
141
|
+
"""Identify the authenticated organization. Cheapest way to verify a key."""
|
|
142
|
+
data, _ = self._transport.request("GET", "/me")
|
|
143
|
+
return data
|
|
144
|
+
|
|
145
|
+
def request(
|
|
146
|
+
self,
|
|
147
|
+
method: str,
|
|
148
|
+
path: str,
|
|
149
|
+
*,
|
|
150
|
+
query: Mapping[str, Any] | None = None,
|
|
151
|
+
body: Any | None = None,
|
|
152
|
+
idempotency_key: str | None = None,
|
|
153
|
+
) -> Any:
|
|
154
|
+
"""Escape hatch for endpoints without a typed helper yet.
|
|
155
|
+
|
|
156
|
+
Still gets retries, error mapping and envelope unwrapping — reaching
|
|
157
|
+
for ``requests`` directly would lose all three.
|
|
158
|
+
"""
|
|
159
|
+
data, _ = self._transport.request(
|
|
160
|
+
method, path, query=query, body=body, idempotency_key=idempotency_key
|
|
161
|
+
)
|
|
162
|
+
return data
|