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.
Files changed (185) hide show
  1. brivio-0.1.0/.gitignore +263 -0
  2. brivio-0.1.0/PKG-INFO +146 -0
  3. brivio-0.1.0/README.md +114 -0
  4. brivio-0.1.0/brivio/__init__.py +162 -0
  5. brivio-0.1.0/brivio/_transport.py +200 -0
  6. brivio-0.1.0/generated/.gitignore +66 -0
  7. brivio-0.1.0/generated/.gitlab-ci.yml +31 -0
  8. brivio-0.1.0/generated/.openapi-generator/FILES +177 -0
  9. brivio-0.1.0/generated/.openapi-generator/VERSION +1 -0
  10. brivio-0.1.0/generated/.openapi-generator-ignore +23 -0
  11. brivio-0.1.0/generated/.travis.yml +17 -0
  12. brivio-0.1.0/generated/README.md +423 -0
  13. brivio-0.1.0/generated/brivio/__init__.py +0 -0
  14. brivio-0.1.0/generated/brivio/_generated/__init__.py +351 -0
  15. brivio-0.1.0/generated/brivio/_generated/api/__init__.py +51 -0
  16. brivio-0.1.0/generated/brivio/_generated/api/affiliate_events_api.py +281 -0
  17. brivio-0.1.0/generated/brivio/_generated/api/affiliates_api.py +1572 -0
  18. brivio-0.1.0/generated/brivio/_generated/api/api_keys_api.py +1050 -0
  19. brivio-0.1.0/generated/brivio/_generated/api/articles_api.py +2500 -0
  20. brivio-0.1.0/generated/brivio/_generated/api/banking_api.py +4824 -0
  21. brivio-0.1.0/generated/brivio/_generated/api/bookings_api.py +841 -0
  22. brivio-0.1.0/generated/brivio/_generated/api/cabinet_api.py +281 -0
  23. brivio-0.1.0/generated/brivio/_generated/api/catalog_api.py +281 -0
  24. brivio-0.1.0/generated/brivio/_generated/api/comms_api.py +1151 -0
  25. brivio-0.1.0/generated/brivio/_generated/api/companies_api.py +1313 -0
  26. brivio-0.1.0/generated/brivio/_generated/api/compat_api.py +1139 -0
  27. brivio-0.1.0/generated/brivio/_generated/api/connect_api.py +595 -0
  28. brivio-0.1.0/generated/brivio/_generated/api/construction_api.py +595 -0
  29. brivio-0.1.0/generated/brivio/_generated/api/contacts_api.py +1415 -0
  30. brivio-0.1.0/generated/brivio/_generated/api/contracts_api.py +1415 -0
  31. brivio-0.1.0/generated/brivio/_generated/api/customers_api.py +297 -0
  32. brivio-0.1.0/generated/brivio/_generated/api/default_api.py +830 -0
  33. brivio-0.1.0/generated/brivio/_generated/api/dns_api.py +4340 -0
  34. brivio-0.1.0/generated/brivio/_generated/api/documents_api.py +1415 -0
  35. brivio-0.1.0/generated/brivio/_generated/api/domains_api.py +1640 -0
  36. brivio-0.1.0/generated/brivio/_generated/api/email_domains_api.py +1367 -0
  37. brivio-0.1.0/generated/brivio/_generated/api/emails_api.py +936 -0
  38. brivio-0.1.0/generated/brivio/_generated/api/expenses_api.py +1415 -0
  39. brivio-0.1.0/generated/brivio/_generated/api/fixed_assets_api.py +580 -0
  40. brivio-0.1.0/generated/brivio/_generated/api/hr_api.py +335 -0
  41. brivio-0.1.0/generated/brivio/_generated/api/inventory_api.py +1453 -0
  42. brivio-0.1.0/generated/brivio/_generated/api/invoices_api.py +3818 -0
  43. brivio-0.1.0/generated/brivio/_generated/api/locations_api.py +823 -0
  44. brivio-0.1.0/generated/brivio/_generated/api/marketing_api.py +1055 -0
  45. brivio-0.1.0/generated/brivio/_generated/api/me_api.py +281 -0
  46. brivio-0.1.0/generated/brivio/_generated/api/modules_api.py +282 -0
  47. brivio-0.1.0/generated/brivio/_generated/api/network_api.py +2497 -0
  48. brivio-0.1.0/generated/brivio/_generated/api/orders_api.py +1131 -0
  49. brivio-0.1.0/generated/brivio/_generated/api/payment_links_api.py +1154 -0
  50. brivio-0.1.0/generated/brivio/_generated/api/payment_methods_api.py +791 -0
  51. brivio-0.1.0/generated/brivio/_generated/api/payments_api.py +1221 -0
  52. brivio-0.1.0/generated/brivio/_generated/api/payouts_api.py +426 -0
  53. brivio-0.1.0/generated/brivio/_generated/api/projects_api.py +1415 -0
  54. brivio-0.1.0/generated/brivio/_generated/api/quotes_api.py +600 -0
  55. brivio-0.1.0/generated/brivio/_generated/api/realtime_api.py +271 -0
  56. brivio-0.1.0/generated/brivio/_generated/api/reservations_api.py +595 -0
  57. brivio-0.1.0/generated/brivio/_generated/api/series_api.py +352 -0
  58. brivio-0.1.0/generated/brivio/_generated/api/sites_api.py +335 -0
  59. brivio-0.1.0/generated/brivio/_generated/api/subscriptions_api.py +1619 -0
  60. brivio-0.1.0/generated/brivio/_generated/api/taxes_api.py +309 -0
  61. brivio-0.1.0/generated/brivio/_generated/api/time_entries_api.py +600 -0
  62. brivio-0.1.0/generated/brivio/_generated/api/trust_api.py +2049 -0
  63. brivio-0.1.0/generated/brivio/_generated/api/webhooks_api.py +2112 -0
  64. brivio-0.1.0/generated/brivio/_generated/api_client.py +801 -0
  65. brivio-0.1.0/generated/brivio/_generated/api_response.py +21 -0
  66. brivio-0.1.0/generated/brivio/_generated/configuration.py +581 -0
  67. brivio-0.1.0/generated/brivio/_generated/exceptions.py +216 -0
  68. brivio-0.1.0/generated/brivio/_generated/models/__init__.py +122 -0
  69. brivio-0.1.0/generated/brivio/_generated/models/article.py +109 -0
  70. brivio-0.1.0/generated/brivio/_generated/models/article_create.py +103 -0
  71. brivio-0.1.0/generated/brivio/_generated/models/bank_rule_input.py +152 -0
  72. brivio-0.1.0/generated/brivio/_generated/models/cancel_payment_link200_response.py +98 -0
  73. brivio-0.1.0/generated/brivio/_generated/models/contact.py +121 -0
  74. brivio-0.1.0/generated/brivio/_generated/models/contact_create.py +115 -0
  75. brivio-0.1.0/generated/brivio/_generated/models/contract.py +99 -0
  76. brivio-0.1.0/generated/brivio/_generated/models/contract_create.py +101 -0
  77. brivio-0.1.0/generated/brivio/_generated/models/create_article201_response.py +98 -0
  78. brivio-0.1.0/generated/brivio/_generated/models/create_banking_statement_import_request.py +99 -0
  79. brivio-0.1.0/generated/brivio/_generated/models/create_company_search_request.py +95 -0
  80. brivio-0.1.0/generated/brivio/_generated/models/create_contact201_response.py +98 -0
  81. brivio-0.1.0/generated/brivio/_generated/models/create_contract201_response.py +98 -0
  82. brivio-0.1.0/generated/brivio/_generated/models/create_dns_zone201_response.py +98 -0
  83. brivio-0.1.0/generated/brivio/_generated/models/create_document201_response.py +98 -0
  84. brivio-0.1.0/generated/brivio/_generated/models/create_email_domain201_response.py +98 -0
  85. brivio-0.1.0/generated/brivio/_generated/models/create_email_send202_response.py +98 -0
  86. brivio-0.1.0/generated/brivio/_generated/models/create_expense201_response.py +98 -0
  87. brivio-0.1.0/generated/brivio/_generated/models/create_invoice201_response.py +98 -0
  88. brivio-0.1.0/generated/brivio/_generated/models/create_location201_response.py +98 -0
  89. brivio-0.1.0/generated/brivio/_generated/models/create_order_import_request.py +126 -0
  90. brivio-0.1.0/generated/brivio/_generated/models/create_order_import_request_customer.py +96 -0
  91. brivio-0.1.0/generated/brivio/_generated/models/create_order_import_request_customer_address.py +93 -0
  92. brivio-0.1.0/generated/brivio/_generated/models/create_order_import_request_lines_inner.py +94 -0
  93. brivio-0.1.0/generated/brivio/_generated/models/create_payment_link201_response.py +98 -0
  94. brivio-0.1.0/generated/brivio/_generated/models/create_project201_response.py +98 -0
  95. brivio-0.1.0/generated/brivio/_generated/models/dns_record_create.py +95 -0
  96. brivio-0.1.0/generated/brivio/_generated/models/dns_zone.py +93 -0
  97. brivio-0.1.0/generated/brivio/_generated/models/dns_zone_create.py +89 -0
  98. brivio-0.1.0/generated/brivio/_generated/models/document.py +101 -0
  99. brivio-0.1.0/generated/brivio/_generated/models/document_create.py +113 -0
  100. brivio-0.1.0/generated/brivio/_generated/models/domain.py +96 -0
  101. brivio-0.1.0/generated/brivio/_generated/models/email.py +152 -0
  102. brivio-0.1.0/generated/brivio/_generated/models/email_address.py +90 -0
  103. brivio-0.1.0/generated/brivio/_generated/models/email_attachment.py +91 -0
  104. brivio-0.1.0/generated/brivio/_generated/models/email_dns_record.py +107 -0
  105. brivio-0.1.0/generated/brivio/_generated/models/email_domain.py +129 -0
  106. brivio-0.1.0/generated/brivio/_generated/models/email_domain_checks.py +95 -0
  107. brivio-0.1.0/generated/brivio/_generated/models/email_domain_create.py +89 -0
  108. brivio-0.1.0/generated/brivio/_generated/models/email_domain_verify_result.py +116 -0
  109. brivio-0.1.0/generated/brivio/_generated/models/email_event.py +97 -0
  110. brivio-0.1.0/generated/brivio/_generated/models/email_recipient.py +107 -0
  111. brivio-0.1.0/generated/brivio/_generated/models/email_send_request.py +153 -0
  112. brivio-0.1.0/generated/brivio/_generated/models/error.py +98 -0
  113. brivio-0.1.0/generated/brivio/_generated/models/expense.py +100 -0
  114. brivio-0.1.0/generated/brivio/_generated/models/expense_create.py +104 -0
  115. brivio-0.1.0/generated/brivio/_generated/models/get_payment200_response.py +98 -0
  116. brivio-0.1.0/generated/brivio/_generated/models/get_payment_link200_response.py +98 -0
  117. brivio-0.1.0/generated/brivio/_generated/models/get_quote200_response.py +98 -0
  118. brivio-0.1.0/generated/brivio/_generated/models/get_time_entry200_response.py +98 -0
  119. brivio-0.1.0/generated/brivio/_generated/models/invoice.py +125 -0
  120. brivio-0.1.0/generated/brivio/_generated/models/invoice_create.py +155 -0
  121. brivio-0.1.0/generated/brivio/_generated/models/invoice_create_items_inner.py +97 -0
  122. brivio-0.1.0/generated/brivio/_generated/models/invoice_paid_post_request.py +113 -0
  123. brivio-0.1.0/generated/brivio/_generated/models/invoice_partially_paid_post_request.py +113 -0
  124. brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_create.py +108 -0
  125. brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_reversed_post_request.py +113 -0
  126. brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_reversed_webhook_data.py +107 -0
  127. brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_reversed_webhook_data_reversal.py +98 -0
  128. brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_webhook_data.py +117 -0
  129. brivio-0.1.0/generated/brivio/_generated/models/invoice_payment_webhook_data_payment.py +105 -0
  130. brivio-0.1.0/generated/brivio/_generated/models/list_articles200_response.py +108 -0
  131. brivio-0.1.0/generated/brivio/_generated/models/list_contacts200_response.py +108 -0
  132. brivio-0.1.0/generated/brivio/_generated/models/list_contracts200_response.py +108 -0
  133. brivio-0.1.0/generated/brivio/_generated/models/list_dns_zones200_response.py +108 -0
  134. brivio-0.1.0/generated/brivio/_generated/models/list_documents200_response.py +108 -0
  135. brivio-0.1.0/generated/brivio/_generated/models/list_domains200_response.py +108 -0
  136. brivio-0.1.0/generated/brivio/_generated/models/list_email_domains200_response.py +108 -0
  137. brivio-0.1.0/generated/brivio/_generated/models/list_emails200_response.py +108 -0
  138. brivio-0.1.0/generated/brivio/_generated/models/list_expenses200_response.py +108 -0
  139. brivio-0.1.0/generated/brivio/_generated/models/list_invoices200_response.py +108 -0
  140. brivio-0.1.0/generated/brivio/_generated/models/list_locations200_response.py +108 -0
  141. brivio-0.1.0/generated/brivio/_generated/models/list_me401_response.py +98 -0
  142. brivio-0.1.0/generated/brivio/_generated/models/list_me401_response_error.py +91 -0
  143. brivio-0.1.0/generated/brivio/_generated/models/list_modules200_response.py +108 -0
  144. brivio-0.1.0/generated/brivio/_generated/models/list_payment_links200_response.py +108 -0
  145. brivio-0.1.0/generated/brivio/_generated/models/list_payments200_response.py +108 -0
  146. brivio-0.1.0/generated/brivio/_generated/models/list_payouts200_response.py +108 -0
  147. brivio-0.1.0/generated/brivio/_generated/models/list_projects200_response.py +108 -0
  148. brivio-0.1.0/generated/brivio/_generated/models/list_quotes200_response.py +108 -0
  149. brivio-0.1.0/generated/brivio/_generated/models/list_sites200_response.py +108 -0
  150. brivio-0.1.0/generated/brivio/_generated/models/list_time_entries200_response.py +108 -0
  151. brivio-0.1.0/generated/brivio/_generated/models/location.py +105 -0
  152. brivio-0.1.0/generated/brivio/_generated/models/location_create.py +93 -0
  153. brivio-0.1.0/generated/brivio/_generated/models/match_banking_transaction_request.py +89 -0
  154. brivio-0.1.0/generated/brivio/_generated/models/meta.py +95 -0
  155. brivio-0.1.0/generated/brivio/_generated/models/module.py +93 -0
  156. brivio-0.1.0/generated/brivio/_generated/models/payment.py +171 -0
  157. brivio-0.1.0/generated/brivio/_generated/models/payment_link.py +111 -0
  158. brivio-0.1.0/generated/brivio/_generated/models/payment_link_cancel_result.py +93 -0
  159. brivio-0.1.0/generated/brivio/_generated/models/payment_link_create.py +98 -0
  160. brivio-0.1.0/generated/brivio/_generated/models/payment_link_created.py +96 -0
  161. brivio-0.1.0/generated/brivio/_generated/models/payment_refund_input.py +90 -0
  162. brivio-0.1.0/generated/brivio/_generated/models/payment_refund_result.py +95 -0
  163. brivio-0.1.0/generated/brivio/_generated/models/payout.py +124 -0
  164. brivio-0.1.0/generated/brivio/_generated/models/payout_item.py +108 -0
  165. brivio-0.1.0/generated/brivio/_generated/models/project.py +99 -0
  166. brivio-0.1.0/generated/brivio/_generated/models/project_create.py +112 -0
  167. brivio-0.1.0/generated/brivio/_generated/models/quote.py +122 -0
  168. brivio-0.1.0/generated/brivio/_generated/models/refund_payment200_response.py +98 -0
  169. brivio-0.1.0/generated/brivio/_generated/models/site.py +93 -0
  170. brivio-0.1.0/generated/brivio/_generated/models/time_entry.py +116 -0
  171. brivio-0.1.0/generated/brivio/_generated/models/unmatch_banking_transaction_request.py +87 -0
  172. brivio-0.1.0/generated/brivio/_generated/models/usage_subscription_request.py +93 -0
  173. brivio-0.1.0/generated/brivio/_generated/models/verify_email_domain200_response.py +98 -0
  174. brivio-0.1.0/generated/brivio/_generated/models/webhook_delivery.py +102 -0
  175. brivio-0.1.0/generated/brivio/_generated/py.typed +0 -0
  176. brivio-0.1.0/generated/brivio/_generated/rest.py +258 -0
  177. brivio-0.1.0/generated/git_push.sh +57 -0
  178. brivio-0.1.0/generated/pyproject.toml +95 -0
  179. brivio-0.1.0/generated/requirements.txt +4 -0
  180. brivio-0.1.0/generated/setup.cfg +2 -0
  181. brivio-0.1.0/generated/setup.py +49 -0
  182. brivio-0.1.0/generated/test-requirements.txt +6 -0
  183. brivio-0.1.0/generated/tox.ini +9 -0
  184. brivio-0.1.0/pyproject.toml +66 -0
  185. brivio-0.1.0/tests/test_transport.py +189 -0
@@ -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