querri 1.0.2__py3-none-any.whl

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 (64) hide show
  1. querri/__init__.py +51 -0
  2. querri/_auth.py +818 -0
  3. querri/_base_client.py +379 -0
  4. querri/_client.py +395 -0
  5. querri/_config.py +140 -0
  6. querri/_convenience.py +538 -0
  7. querri/_exceptions.py +180 -0
  8. querri/_pagination.py +278 -0
  9. querri/_streaming.py +663 -0
  10. querri/_user_client.py +193 -0
  11. querri/_version.py +1 -0
  12. querri/cli/__init__.py +21 -0
  13. querri/cli/_app.py +246 -0
  14. querri/cli/_context.py +216 -0
  15. querri/cli/_image.py +234 -0
  16. querri/cli/_output.py +293 -0
  17. querri/cli/audit.py +68 -0
  18. querri/cli/auth.py +556 -0
  19. querri/cli/chat.py +1255 -0
  20. querri/cli/chats.py +358 -0
  21. querri/cli/dashboards.py +294 -0
  22. querri/cli/embed.py +220 -0
  23. querri/cli/files.py +214 -0
  24. querri/cli/keys.py +304 -0
  25. querri/cli/policies.py +424 -0
  26. querri/cli/projects.py +916 -0
  27. querri/cli/sharing.py +403 -0
  28. querri/cli/sources.py +532 -0
  29. querri/cli/steps.py +123 -0
  30. querri/cli/usage.py +99 -0
  31. querri/cli/users.py +223 -0
  32. querri/cli/views.py +449 -0
  33. querri/cli/whoami.py +78 -0
  34. querri/py.typed +0 -0
  35. querri/resources/__init__.py +1 -0
  36. querri/resources/audit.py +119 -0
  37. querri/resources/dashboards.py +295 -0
  38. querri/resources/embed.py +268 -0
  39. querri/resources/files.py +145 -0
  40. querri/resources/keys.py +191 -0
  41. querri/resources/policies.py +492 -0
  42. querri/resources/projects.py +808 -0
  43. querri/resources/sharing.py +330 -0
  44. querri/resources/sources.py +511 -0
  45. querri/resources/usage.py +106 -0
  46. querri/resources/users.py +303 -0
  47. querri/resources/views.py +347 -0
  48. querri/types/__init__.py +104 -0
  49. querri/types/audit.py +21 -0
  50. querri/types/chat.py +51 -0
  51. querri/types/dashboard.py +51 -0
  52. querri/types/data.py +61 -0
  53. querri/types/embed.py +38 -0
  54. querri/types/file.py +18 -0
  55. querri/types/key.py +36 -0
  56. querri/types/policy.py +105 -0
  57. querri/types/project.py +158 -0
  58. querri/types/sharing.py +19 -0
  59. querri/types/usage.py +39 -0
  60. querri/types/user.py +33 -0
  61. querri-1.0.2.dist-info/METADATA +310 -0
  62. querri-1.0.2.dist-info/RECORD +64 -0
  63. querri-1.0.2.dist-info/WHEEL +4 -0
  64. querri-1.0.2.dist-info/entry_points.txt +2 -0
querri/types/usage.py ADDED
@@ -0,0 +1,39 @@
1
+ """Usage type models for the Querri SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pydantic import BaseModel
6
+
7
+
8
+ class DailyUsage(BaseModel):
9
+ """Single day's usage count."""
10
+
11
+ date: str #: Date string (YYYY-MM-DD).
12
+ count: int = 0 #: Number of AI messages on this date.
13
+
14
+
15
+ class OrgUsageReport(BaseModel):
16
+ """Organization-level usage report."""
17
+
18
+ org_id: str | None = None #: Organization ID.
19
+ period: str | None = None #: Period name (current_month, last_month, last_30_days).
20
+ period_start: str | None = None #: ISO-8601 start of the reporting period.
21
+ period_end: str | None = None #: ISO-8601 end of the reporting period.
22
+ total_ai_messages: int | None = None #: Total AI messages in the period.
23
+ active_user_count: int | None = None #: Number of active users in the period.
24
+ project_count: int | None = None #: Number of projects in the organization.
25
+
26
+
27
+ class UserUsageReport(BaseModel):
28
+ """Per-user usage report."""
29
+
30
+ user_id: str | None = None #: User ID.
31
+ period: str | None = None #: Period name.
32
+ period_start: str | None = None #: ISO-8601 start of the reporting period.
33
+ period_end: str | None = None #: ISO-8601 end of the reporting period.
34
+ ai_messages: int | None = None #: Total AI messages by this user.
35
+ daily_breakdown: list[DailyUsage] | None = None #: Daily message counts.
36
+
37
+
38
+ # Keep backward compat alias
39
+ UsageReport = OrgUsageReport
querri/types/user.py ADDED
@@ -0,0 +1,33 @@
1
+ """User type models for the Querri SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pydantic import BaseModel
6
+
7
+
8
+ class User(BaseModel):
9
+ """A user in the Querri organization."""
10
+
11
+ id: str #: Unique user identifier.
12
+ email: str #: User's email address.
13
+ first_name: str | None = None #: User's first name.
14
+ last_name: str | None = None #: User's last name.
15
+ role: str = "member" #: Role, e.g. ``"admin"`` or ``"member"``.
16
+ external_id: str | None = None #: Caller-supplied external identifier.
17
+ created_at: str | None = None #: ISO-8601 timestamp of creation.
18
+ created: bool | None = None #: Only on get_or_create; ``True`` if newly created.
19
+
20
+
21
+ class UserDeleteResponse(BaseModel):
22
+ """Response from deleting a user."""
23
+
24
+ id: str #: ID of the deleted user.
25
+ deleted: bool = True #: Whether the user was successfully deleted.
26
+
27
+
28
+ class ExternalIdDeleteResponse(BaseModel):
29
+ """Response from removing an external ID mapping."""
30
+
31
+ external_id: str #: The external ID that was removed.
32
+ user_id: str #: The user ID that was unlinked.
33
+ deleted: bool #: Whether the mapping was deleted.
@@ -0,0 +1,310 @@
1
+ Metadata-Version: 2.4
2
+ Name: querri
3
+ Version: 1.0.2
4
+ Summary: Python SDK and CLI for the Querri data analysis platform
5
+ Project-URL: Homepage, https://querri.com
6
+ Project-URL: Documentation, https://docs.querri.com/sdk/python
7
+ Project-URL: Repository, https://github.com/querri-ai/querri-python
8
+ Author-email: Querri <support@querri.com>
9
+ License-Expression: MIT
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Typing :: Typed
19
+ Requires-Python: >=3.10
20
+ Requires-Dist: httpx<1.0,>=0.27
21
+ Requires-Dist: pydantic<3.0,>=2.0
22
+ Requires-Dist: typing-extensions>=4.0
23
+ Provides-Extra: cli
24
+ Requires-Dist: pillow<12.0,>=10.0; extra == 'cli'
25
+ Requires-Dist: rich<14.0,>=13.0; extra == 'cli'
26
+ Requires-Dist: typer[all]<1.0,>=0.12; extra == 'cli'
27
+ Provides-Extra: dev
28
+ Requires-Dist: mypy>=1.0; extra == 'dev'
29
+ Requires-Dist: pillow<12.0,>=10.0; extra == 'dev'
30
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
31
+ Requires-Dist: pytest>=8.0; extra == 'dev'
32
+ Requires-Dist: respx>=0.21; extra == 'dev'
33
+ Requires-Dist: rich<14.0,>=13.0; extra == 'dev'
34
+ Requires-Dist: ruff>=0.4; extra == 'dev'
35
+ Requires-Dist: typer[all]<1.0,>=0.12; extra == 'dev'
36
+ Provides-Extra: test
37
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'test'
38
+ Requires-Dist: pytest>=8.0; extra == 'test'
39
+ Requires-Dist: respx>=0.21; extra == 'test'
40
+ Provides-Extra: tui
41
+ Requires-Dist: pillow<12.0,>=10.0; extra == 'tui'
42
+ Requires-Dist: rich<14.0,>=13.0; extra == 'tui'
43
+ Requires-Dist: typer[all]<1.0,>=0.12; extra == 'tui'
44
+ Description-Content-Type: text/markdown
45
+
46
+ # Querri — Python SDK and CLI
47
+
48
+ > **CLI:** Interact with the Querri data analysis platform from the terminal or in scripts.
49
+ > **Python SDK:** Embed Querri analytics in your Python web application with one method call.
50
+
51
+ ## Install
52
+
53
+ ```bash
54
+ pip install querri
55
+ ```
56
+
57
+ ---
58
+
59
+ ## CLI Quick Start
60
+
61
+ The `querri` CLI lets you upload data, create analysis projects, and ask questions — interactively or from scripts.
62
+
63
+ ### Auth
64
+
65
+ ```bash
66
+ querri auth login # browser-based login
67
+ querri whoami # confirm who you're logged in as
68
+ ```
69
+
70
+ For scripted/non-interactive use, set `QUERRI_API_KEY` instead of relying on stored tokens:
71
+
72
+ ```bash
73
+ export QUERRI_API_KEY=qk_your_api_key
74
+ export QUERRI_ORG_ID=org_your_org_id
75
+ ```
76
+
77
+ ### Example workflow: upload a file and analyze it
78
+
79
+ ```bash
80
+ # Upload a file (CSV, Excel, JSON, etc.)
81
+ querri --json file upload path/to/data.csv
82
+
83
+ # Create a project
84
+ querri --json project new "My Analysis"
85
+
86
+ # Add the file to the project (triggers ingestion + agent summary)
87
+ querri --json project add-source <file_id>
88
+
89
+ # Ask a question
90
+ querri --json project chat -m "What are the top 5 products by revenue?"
91
+ ```
92
+
93
+ For scripting, add `--no-interactive` to prevent prompts and `--json` for parseable output. Note that `--json` and other global flags must come **before** the subcommand:
94
+
95
+ ```bash
96
+ querri --json --no-interactive project chat -m "Summarize the data" # correct
97
+ querri project chat -m "Summarize the data" --json # WRONG
98
+ ```
99
+
100
+ ### Self-documenting
101
+
102
+ The CLI covers all Querri resources — projects, files, sources, views, dashboards, sharing, API keys, users, policies, embed sessions, and more.
103
+
104
+ ```bash
105
+ querri --help
106
+ querri <command> --help
107
+ ```
108
+
109
+ See [`skills/querri-cli/SKILL.md`](skills/querri-cli/SKILL.md) for the full command reference.
110
+
111
+ ---
112
+
113
+ ## Python SDK
114
+
115
+ For embedding Querri analytics in a Python web application. Use alongside the [`@querri-inc/embed`](https://www.npmjs.com/package/@querri-inc/embed) frontend component.
116
+
117
+ ### Quick Start
118
+
119
+ ```python
120
+ from querri import Querri
121
+
122
+ client = Querri(api_key="qk_your_api_key", org_id="org_...")
123
+
124
+ session = client.embed.get_session(
125
+ user="customer-42", # external ID from your system
126
+ ttl=3600,
127
+ )
128
+
129
+ print(session["session_token"]) # JWT to pass to the frontend
130
+ ```
131
+
132
+ ### Wire a session endpoint
133
+
134
+ **Flask:**
135
+
136
+ ```python
137
+ from flask import Flask, jsonify, request
138
+ from querri import Querri
139
+
140
+ app = Flask(__name__)
141
+ client = Querri() # reads QUERRI_API_KEY and QUERRI_ORG_ID from env
142
+
143
+ @app.route("/api/querri-session", methods=["POST"])
144
+ def querri_session():
145
+ # Derive user identity from YOUR auth system — never from the request body.
146
+ auth_user = get_authenticated_user()
147
+
148
+ session = client.embed.get_session(
149
+ user={"external_id": auth_user.id, "email": auth_user.email},
150
+ access={
151
+ "sources": ["src_sales_data"],
152
+ "filters": {"tenant_id": auth_user.tenant_id},
153
+ },
154
+ origin=request.headers.get("Origin"),
155
+ ttl=3600,
156
+ )
157
+ return jsonify(session)
158
+ ```
159
+
160
+ Django and FastAPI follow the identical pattern — see **[docs/server-sdk.md](docs/server-sdk.md)** for those examples.
161
+
162
+ ### Add the embed (React)
163
+
164
+ ```tsx
165
+ import { QuerriEmbed } from '@querri-inc/embed/react';
166
+
167
+ <QuerriEmbed
168
+ style={{ width: '100%', height: '600px' }}
169
+ serverUrl="https://app.querri.com"
170
+ auth={{ sessionEndpoint: '/api/querri-session' }}
171
+ />
172
+ ```
173
+
174
+ > **Security:** Always derive user identity and access from server-side auth. Never read `user` or `access` from the request body — a malicious client can impersonate any user or escalate access.
175
+
176
+ ### Configuration
177
+
178
+ The SDK reads configuration from constructor arguments or environment variables:
179
+
180
+ | Parameter | Env Variable | Default | Description |
181
+ |-----------|-------------|---------|-------------|
182
+ | `api_key` | `QUERRI_API_KEY` | *(required)* | Your `qk_` API key |
183
+ | `org_id` | `QUERRI_ORG_ID` | *(required)* | Organization ID |
184
+ | `host` | `QUERRI_HOST` | `https://app.querri.com` | Server host |
185
+ | `timeout` | `QUERRI_TIMEOUT` | `30.0` | Request timeout (seconds) |
186
+ | `max_retries` | `QUERRI_MAX_RETRIES` | `3` | Retry attempts for transient errors |
187
+
188
+ > **Note:** The parameter is `host`, not `base_url`. The SDK appends `/api/v1` automatically.
189
+
190
+ ### `get_session()` — Embed Sessions
191
+
192
+ The flagship convenience method: resolves or creates a user, applies access policies, and generates a session JWT in one call.
193
+
194
+ ```python
195
+ session = client.embed.get_session(
196
+ user={
197
+ "external_id": "customer-42",
198
+ "email": "alice@acme.com",
199
+ "first_name": "Alice",
200
+ },
201
+ access={
202
+ "sources": ["src_sales_data"],
203
+ "filters": {
204
+ "tenant_id": "acme",
205
+ "region": ["us-east", "us-west"], # list values are OR'd
206
+ },
207
+ },
208
+ origin="https://app.acme.com",
209
+ ttl=7200,
210
+ )
211
+
212
+ session["session_token"] # str — JWT for the embed
213
+ session["expires_in"] # int — seconds until expiry
214
+ session["user_id"] # str — Querri user ID
215
+ ```
216
+
217
+ You can also pass pre-created policy IDs directly:
218
+
219
+ ```python
220
+ session = client.embed.get_session(
221
+ user={"external_id": "customer-42"},
222
+ access={"policy_ids": ["pol_abc123"]},
223
+ )
224
+ ```
225
+
226
+ ### User-Scoped Client (`as_user`)
227
+
228
+ ```python
229
+ session = client.embed.get_session(user="customer-42", ttl=900)
230
+
231
+ with client.as_user(session) as user_client:
232
+ for project in user_client.projects.list():
233
+ print(project.name)
234
+ ```
235
+
236
+ See **[docs/server-sdk.md](docs/server-sdk.md#user-scoped-client-as_user)** for details on granting access and available resources.
237
+
238
+ ### All Resources
239
+
240
+ | Resource | Access | Key Methods |
241
+ |----------|--------|-------------|
242
+ | `client.dashboards` | Dashboard management | `list`, `create`, `get`, `update`, `delete`, `refresh` |
243
+ | `client.projects` | Analysis projects | `list`, `create`, `get`, `run`, `run_status`, `list_steps` |
244
+ | `client.projects.chats` | Chats within projects | `create`, `list`, `stream`, `cancel`, `delete` |
245
+ | `client.sources` | Sources, connectors & data | `list`, `create`, `create_data_source`, `query`, `source_data`, `append_rows`, `replace_data`, `ask`, `sync`, `list_connectors` |
246
+ | `client.views` | SQL-defined views | `list`, `create`, `get`, `update`, `delete`, `run`, `preview`, `chat` |
247
+ | `client.files` | File management | `upload`, `list`, `get`, `delete` |
248
+ | `client.users` | User management | `list`, `create`, `get`, `update`, `delete` |
249
+ | `client.keys` | API key management | `create`, `list`, `get`, `delete` |
250
+ | `client.audit` | Audit log | `list` |
251
+ | `client.usage` | Usage metrics | `org_usage`, `user_usage` |
252
+ | `client.sharing` | Sharing & permissions | `share_project`, `share_dashboard`, `share_source` |
253
+
254
+ ### Async Client
255
+
256
+ `AsyncQuerri` mirrors the sync API with `async`/`await`:
257
+
258
+ ```python
259
+ from querri import AsyncQuerri
260
+
261
+ async with AsyncQuerri() as client:
262
+ session = await client.embed.get_session(
263
+ user={"external_id": "cust-42", "email": "a@b.com"},
264
+ access={"sources": ["src_sales"]},
265
+ )
266
+ ```
267
+
268
+ ### Error Handling
269
+
270
+ All errors extend `QuerriError`:
271
+
272
+ ```
273
+ QuerriError
274
+ ├── APIError — HTTP error responses
275
+ │ ├── ValidationError — 400
276
+ │ ├── AuthenticationError — 401
277
+ │ ├── PermissionError — 403
278
+ │ ├── NotFoundError — 404
279
+ │ ├── ConflictError — 409
280
+ │ ├── RateLimitError — 429 (auto-retried)
281
+ │ └── ServerError — 5xx (auto-retried)
282
+ ├── StreamError — SSE stream issues
283
+ └── ConfigError — missing/invalid configuration
284
+ ```
285
+
286
+ The SDK automatically retries **429** (always) and **5xx** (idempotent methods only) with exponential backoff + jitter.
287
+
288
+ ### Full Reference
289
+
290
+ See **[docs/server-sdk.md](docs/server-sdk.md)** for complete method signatures, all framework examples, and the `get_session()` deep dive.
291
+
292
+ ---
293
+
294
+ ## Requirements
295
+
296
+ - Python 3.10+
297
+ - [`httpx`](https://www.python-httpx.org/) >= 0.27
298
+ - [`pydantic`](https://docs.pydantic.dev/) >= 2.0
299
+
300
+ ## Development
301
+
302
+ ```bash
303
+ pip install -e ".[dev]"
304
+ pytest tests/ -v
305
+ pytest tests/test_integration.py -m integration -v # requires API credentials
306
+ ```
307
+
308
+ ## License
309
+
310
+ MIT
@@ -0,0 +1,64 @@
1
+ querri/__init__.py,sha256=Fc27eNSwFmuIzGWxD4UDblANJfbGlkTvoVtXeg2uc04,1170
2
+ querri/_auth.py,sha256=BBJD-EE09AGeWiSRq67NaRh-A6Qpuz2PSQ8oaDweiNU,28360
3
+ querri/_base_client.py,sha256=dMGlV2X_KyF_RhGL91jDROnLrRnG0fKqB4agb0nUSps,13336
4
+ querri/_client.py,sha256=H6E5fX4TCGS_1DN8h-YDfYwGQ4116SAngKhMehsALH0,13196
5
+ querri/_config.py,sha256=1eNoGoN3rd1gFYa5HwCvhXno6Uz4NEfmyIAPJHUgALg,5218
6
+ querri/_convenience.py,sha256=TC-ggHPHgq07K_0kFSYUdf-D0VUKqrNCzRpGGmVAL-s,18785
7
+ querri/_exceptions.py,sha256=sHFdAc2lNPby6Bnej5GgwLmcm05ag59GCWdw4gllQgg,4849
8
+ querri/_pagination.py,sha256=d8bxpzGNLvDfJq7qwgWY8as31DWYfpm8RJPjauM4ofA,8723
9
+ querri/_streaming.py,sha256=8KgXjt1VXWz8wXpw1lhl5Sqc9oDiwH88TFwTRNatxAU,23407
10
+ querri/_user_client.py,sha256=ARN99plfuiV9bnL0ig5NiI44MOyNZ1tBFEOiBHa4VaU,6569
11
+ querri/_version.py,sha256=Zn1KFblwuFHiDRdRAiRnDBRkbPttWh44jKa5zG2ov0E,22
12
+ querri/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ querri/cli/__init__.py,sha256=S3IQjFvKO2PdkzIGJUCuTK3a7XTDh7EwDaRJGCVfGzE,663
14
+ querri/cli/_app.py,sha256=Wqj0pmJoPFihY-rZhes0ulCKgTAgmJT6vqXZrBSUI1o,8223
15
+ querri/cli/_context.py,sha256=7y2HBVm1A_oEs6OEfMU-_rxOMA5V0frwsCZEJ8a6i6o,6932
16
+ querri/cli/_image.py,sha256=Mf5xzWJOFB-G44oPGILE4XwIFjfaMW7K7vu3DFK5oUc,7241
17
+ querri/cli/_output.py,sha256=y_YxY7SVKyF3YKzxMDeTVUX-AtEhLjIKPgpiotHFfe8,8625
18
+ querri/cli/audit.py,sha256=Ko1jJw1LiX0yWzVZ74wOSR7djyDeR4SXQvttmYTSNiY,1999
19
+ querri/cli/auth.py,sha256=ZockvJ0DdDzIXBNLS2inp22gWk5q9sh0vW-lMpJX80s,17466
20
+ querri/cli/chat.py,sha256=B6zKt7Y-uzVQeK1b6-R5MU16iOlT49QS1TpZUhgsE78,43395
21
+ querri/cli/chats.py,sha256=KH3JMZXruZBw7EaxeRidYUBswx9s9nbfoEvhty-0Cao,10857
22
+ querri/cli/dashboards.py,sha256=u4D3CEpyCBo0YJxSBPlOMmzhQj4esZcwJZcav1Jf618,9367
23
+ querri/cli/embed.py,sha256=onuBPL8zQBLzq9K3SiMzPH3vvNTNOnQjitzJy0gts2g,6747
24
+ querri/cli/files.py,sha256=bEXAu7lhATLc0WabndJkMMp2C0JVWYY5WC06UIJ5gtg,6222
25
+ querri/cli/keys.py,sha256=zfgMdh3at_c3byL_G3FzMHYqew7VFb4Zt33jdJ3b4f0,9740
26
+ querri/cli/policies.py,sha256=IcmPdQnwZ64xFZGDscn08IVhLek5HvsqQ0mAYqzw5uw,13725
27
+ querri/cli/projects.py,sha256=KxRZpzIThGdhgzXWvIqakAUZSJyIEVJ7XpqLxijO628,29531
28
+ querri/cli/sharing.py,sha256=L1WbJEZYuDltbv99EO3MdkSuyWuNpKijc9jqYp3PWSQ,12874
29
+ querri/cli/sources.py,sha256=7yAr2hMe60w6ZChfEcAEb1pxmdf0SintSa_-4wd3jcA,17455
30
+ querri/cli/steps.py,sha256=ABRaI9FglWU2JNNE7Hol111Uf_VT4wlPLHoZqUQiS7M,3750
31
+ querri/cli/usage.py,sha256=7R2xlsICs6hL_ybBCH4sqhphh1pK0rjryN8uJoX20Yk,2877
32
+ querri/cli/users.py,sha256=VqelrgxE4k0e6Ar7kno6tckrHskeWqVHktJk-vrH-Q8,6858
33
+ querri/cli/views.py,sha256=2WtRHR690Ai0EEiST1fle02IZ6i1tobSynPSeavoyBg,15263
34
+ querri/cli/whoami.py,sha256=1WBm6BjqfMIgUZ06LVd1NYA616VqQYaPjgotgtJjtjA,2354
35
+ querri/resources/__init__.py,sha256=MwTB3luMZE6pE7RX6ZI2pY2pLNzKuIJYeAXt__luRbA,43
36
+ querri/resources/audit.py,sha256=sts0EgdCpxoL-cUn-QLlYelDJBQN_MIOQyxO6WFklCU,3796
37
+ querri/resources/dashboards.py,sha256=z5gIaow_EHXMdt97o9ENK5jKZ1cKdnWHkKMAe72-wl4,9070
38
+ querri/resources/embed.py,sha256=IeWfF-w8W5O3sV-5gzduf1nvNUod3pCiS-D9pohmJoU,8827
39
+ querri/resources/files.py,sha256=AM3RKyURMbOoHvzRmDsPEEsQuLkbTmiD2EIqdUiuKu8,3796
40
+ querri/resources/keys.py,sha256=a8oBa0hamQcKBKECPBfwL2_epHeOwZRYtz-a5aZRNwA,6472
41
+ querri/resources/policies.py,sha256=x9MKaZ5YkHMrN3HJ0a77KE26us9LZua6Qnc2SPlyZHE,15809
42
+ querri/resources/projects.py,sha256=ODB8Oe6tdQKZ_zHLq1B0QDPrK35ce1o4SZ4z9-KAAzE,23922
43
+ querri/resources/sharing.py,sha256=AlGoXdgAIQc5M3wQ4yIOXuPmJFIoZLhkRVAiF2mZeEU,10811
44
+ querri/resources/sources.py,sha256=gb-oQL2g2nttSFapTi0A_QqlK6y6YIyqxUE0LP4KbXc,15655
45
+ querri/resources/usage.py,sha256=3U1Y1_Xq3xz4FOTDEGsgw90xGkZhF5FZeZP2GIOv8fQ,2809
46
+ querri/resources/users.py,sha256=MryXKhk-8gls_Iv5PkDSfyZqHEPIvIQv7kb0Grc-5Kw,10078
47
+ querri/resources/views.py,sha256=leCa2Ddlmx7t54IGwPZPfaPbqnRaMTNzI9LIy-Am6Pw,10574
48
+ querri/types/__init__.py,sha256=NeamK9nIm1-dryYlObbCEonKFO6EamBfmVCme1PbNiE,2283
49
+ querri/types/audit.py,sha256=0MTYRW1LNyotauC03-jfAgfJ4Kb3w90zkbsSbEn8rfs,848
50
+ querri/types/chat.py,sha256=jM9Y2pMIFKrMeOR1fRU9rox2xE6qqpDnO6LCj-lGtjg,1679
51
+ querri/types/dashboard.py,sha256=Os2DAdn92ZPY26Kpf710uS3EdlL_kp9HpSZvdfjbQtM,1778
52
+ querri/types/data.py,sha256=Bc7L4ocINTlzmYeaQ2L7ZuQs085QAdko2WwpR9R_6d4,2140
53
+ querri/types/embed.py,sha256=m35FYj8QVA51zc54NwsVV_-PvpzAKDjem6-JHDRLnsg,1413
54
+ querri/types/file.py,sha256=ry5LRwdZ0qdFK-MQNc5jm7EWXWPwY_0H-WcshaMlYNk,648
55
+ querri/types/key.py,sha256=t4XtoDC1euNYa_rA07BdaF8DeMxRCoWNQ2EHR5nte3Q,1447
56
+ querri/types/policy.py,sha256=mcdMrSdSWbDqbTcU21A6gx0fHz7xiP8E6XiOvtNT4HI,3714
57
+ querri/types/project.py,sha256=QI64T3-7iNbvKemIDtiSxILt0Nc42KWnO1APkPaHieA,6250
58
+ querri/types/sharing.py,sha256=6N0VauTTa28Jju17XviiPUPWlEokfwc8ZFAb5ewHCUE,717
59
+ querri/types/usage.py,sha256=3otZESeR_ZlVH2KdvP3HguS9UaESDDyn6hHPCIqkQ_8,1426
60
+ querri/types/user.py,sha256=4CBdvbjJCerjiqI8GkgtUo9qkJ9sqAWPofbMCf0geoI,1138
61
+ querri-1.0.2.dist-info/METADATA,sha256=Zan9UnB8MrRlmUnxlWmW8nykbIDPfNYXNnrcld0Eq0Y,10018
62
+ querri-1.0.2.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
63
+ querri-1.0.2.dist-info/entry_points.txt,sha256=G88OLZu2u5pXTQkGP5obbK9pwFMoNMGpfWrvXQTVWXA,42
64
+ querri-1.0.2.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ querri = querri.cli:app