lkr-dev-cli 0.0.53__tar.gz → 0.0.55__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 (83) hide show
  1. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/PKG-INFO +10 -7
  2. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/codemode/main.py +29 -26
  3. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/codemode/swagger.json +3072 -2056
  4. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/main.py +8 -3
  5. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/pyproject.toml +14 -7
  6. lkr_dev_cli-0.0.55/uv.lock +2138 -0
  7. lkr_dev_cli-0.0.53/uv.lock +0 -1912
  8. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-code-mode/SKILL.md +0 -0
  9. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-code-mode/scripts/examples.py +0 -0
  10. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-code-mode/scripts/order_items_query.py +0 -0
  11. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-code-mode/scripts/personal_folder_dashboards.py +0 -0
  12. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-code-mode/scripts/readme.py +0 -0
  13. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-code-mode/scripts/traverse_folders.py +0 -0
  14. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/SKILL.md +0 -0
  15. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/bq_view_lookml_generator.py +0 -0
  16. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/configure_model.py +0 -0
  17. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/create_custom_view.py +0 -0
  18. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/deploy_and_reset_workspace.py +0 -0
  19. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/ensure_project_and_model.py +0 -0
  20. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/generate_lookml.py +0 -0
  21. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/init_project.py +0 -0
  22. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/inspect_connections.py +0 -0
  23. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/migrate_dashboard_to_udd.py +0 -0
  24. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/upload_assets.py +0 -0
  25. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.agents/skills/lkr-project-helper/scripts/validate_and_commit.py +0 -0
  26. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.github/workflows/ci.yml +0 -0
  27. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.github/workflows/release.yml +0 -0
  28. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.github/workflows/website.yml +0 -0
  29. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.gitignore +0 -0
  30. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.python-version +0 -0
  31. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.vscode/launch.json +0 -0
  32. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/.vscode/settings.json +0 -0
  33. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/Dockerfile +0 -0
  34. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/LICENSE +0 -0
  35. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/Makefile +0 -0
  36. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/README.md +0 -0
  37. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/cloudbuild.yaml +0 -0
  38. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/codemode.md +0 -0
  39. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/__init__.py +0 -0
  40. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/auth/__init__.py +0 -0
  41. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/auth/main.py +0 -0
  42. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/auth/oauth.py +0 -0
  43. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/auth_service.py +0 -0
  44. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/classes.py +0 -0
  45. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/codemode/LOCAL.md +0 -0
  46. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/codemode/__init__.py +0 -0
  47. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/codemode/constant.py +0 -0
  48. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/codemode/download_swagger.py +0 -0
  49. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/codemode/examples.py +0 -0
  50. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/codemode/help.py +0 -0
  51. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/codemode/readme.py +0 -0
  52. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/codemode/type.py +0 -0
  53. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/constants.py +0 -0
  54. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/custom_types.py +0 -0
  55. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/exceptions.py +0 -0
  56. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/extended_sdk_methods/__init__.py +0 -0
  57. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/extended_sdk_methods/classes.py +0 -0
  58. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/extended_sdk_methods/main.py +0 -0
  59. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/logger.py +0 -0
  60. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/mcp/classes.py +0 -0
  61. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/mcp/main.py +0 -0
  62. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/mcp/utils.py +0 -0
  63. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/observability/classes.py +0 -0
  64. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/observability/embed_container.html +0 -0
  65. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/observability/main.py +0 -0
  66. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/observability/utils.py +0 -0
  67. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/tools/classes.py +0 -0
  68. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/tools/lookml.py +0 -0
  69. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/tools/main.py +0 -0
  70. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr/tools/permission_deprecation.py +0 -0
  71. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr.md +0 -0
  72. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/lkr_dev_cli/__init__.py +0 -0
  73. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/tests/TESTING.md +0 -0
  74. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/tests/test_codemode.py +0 -0
  75. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/tests/test_dependency_resolution.py +0 -0
  76. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/tests/test_deps.sh +0 -0
  77. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/tests/test_extended_sdk_methods.py +0 -0
  78. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/tests/test_init_sdk.py +0 -0
  79. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/tests/test_lookml_tools.py +0 -0
  80. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/tests/test_oauth_account.py +0 -0
  81. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/tests/test_permission_deprecation.py +0 -0
  82. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/tests/test_version.py +0 -0
  83. {lkr_dev_cli-0.0.53 → lkr_dev_cli-0.0.55}/ty.toml +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: lkr-dev-cli
3
- Version: 0.0.53
3
+ Version: 0.0.55
4
4
  Summary: lkr: a command line interface for looker
5
5
  Author: bwebs
6
6
  License-Expression: MIT
7
7
  License-File: LICENSE
8
8
  Requires-Python: >=3.12
9
9
  Requires-Dist: cryptography>=48.0.1
10
- Requires-Dist: looker-sdk>=25.10.0
10
+ Requires-Dist: looker-sdk>=26.12.0
11
11
  Requires-Dist: pydantic>=2.11.7
12
12
  Requires-Dist: pydash>=8.0.5
13
13
  Requires-Dist: questionary>=2.1.0
@@ -17,16 +17,19 @@ Requires-Dist: typer>=0.16.0
17
17
  Provides-Extra: all
18
18
  Requires-Dist: duckdb>=1.3.1; extra == 'all'
19
19
  Requires-Dist: fastapi[standard]>=0.136.3; extra == 'all'
20
- Requires-Dist: mcp[cli]>=1.27.2; extra == 'all'
21
- Requires-Dist: pydantic-monty; extra == 'all'
20
+ Requires-Dist: mcp[cli]<2,>=1.27.2; extra == 'all'
21
+ Requires-Dist: pydantic-monty==0.0.23; extra == 'all'
22
22
  Requires-Dist: selenium>=4.34.0; extra == 'all'
23
+ Provides-Extra: code-mode
24
+ Requires-Dist: mcp[cli]<2,>=1.27.2; extra == 'code-mode'
25
+ Requires-Dist: pydantic-monty==0.0.23; extra == 'code-mode'
23
26
  Provides-Extra: codemode
24
- Requires-Dist: mcp[cli]>=1.27.2; extra == 'codemode'
25
- Requires-Dist: pydantic-monty; extra == 'codemode'
27
+ Requires-Dist: mcp[cli]<2,>=1.27.2; extra == 'codemode'
28
+ Requires-Dist: pydantic-monty==0.0.23; extra == 'codemode'
26
29
  Provides-Extra: mcp
27
30
  Requires-Dist: duckdb>=1.3.1; extra == 'mcp'
28
31
  Requires-Dist: fastapi[standard]>=0.136.3; extra == 'mcp'
29
- Requires-Dist: mcp[cli]>=1.27.2; extra == 'mcp'
32
+ Requires-Dist: mcp[cli]<2,>=1.27.2; extra == 'mcp'
30
33
  Provides-Extra: observability
31
34
  Requires-Dist: fastapi[standard]>=0.136.3; extra == 'observability'
32
35
  Requires-Dist: selenium>=4.34.0; extra == 'observability'
@@ -199,34 +199,37 @@ def run_python_code(
199
199
  # Fallback to regex if parsing fails
200
200
  code = re.sub(r"\bsdk\.([a-zA-Z_][a-zA-Z0-9_]*)\b", r"\1", code)
201
201
 
202
- m = pydantic_monty.Monty(code)
203
-
204
- # Use low-level OS stdout capture to ensure any print() statements
205
- # in Rust or sub-interpreters don't corrupt the JSON-RPC stream
206
- with capture_os_stdout() as cap:
207
- result = m.run(external_functions=external_funcs)
208
-
209
- printed_output = cap.output
210
-
211
- # m.run() returns the evaluated result of the last expression (which is already a primitive)
212
- try:
213
- # Use JSON for nice formatting if it's a dict/list
214
- if result is not None:
215
- if isinstance(result, str):
216
- output = result
202
+ collector = pydantic_monty.CollectString()
203
+ with pydantic_monty.Monty() as m, m.checkout() as session:
204
+ # Use low-level OS stdout capture and CollectString to ensure print() statements
205
+ # don't corrupt the JSON-RPC stream
206
+ with capture_os_stdout() as cap:
207
+ result = session.feed_run(
208
+ code,
209
+ external_lookup=external_funcs,
210
+ print_callback=collector,
211
+ )
212
+ printed_output = collector.output or cap.output
213
+
214
+ # session.feed_run() returns the evaluated result of the last expression
215
+ try:
216
+ # Use JSON for nice formatting if it's a dict/list
217
+ if result is not None:
218
+ if isinstance(result, str):
219
+ output = result
220
+ else:
221
+ output = json.dumps(result, indent=2, default=str)
217
222
  else:
218
- output = json.dumps(result, indent=2, default=str)
219
- else:
220
- output = ""
221
- except Exception: # noqa: BLE001
222
- output = repr(result)
223
+ output = ""
224
+ except Exception: # noqa: BLE001
225
+ output = repr(result)
223
226
 
224
- if printed_output:
225
- return json.dumps({
226
- "stdout": printed_output,
227
- "result": result
228
- }, indent=2, default=str)
229
- return output
227
+ if printed_output:
228
+ return json.dumps({
229
+ "stdout": printed_output,
230
+ "result": result
231
+ }, indent=2, default=str)
232
+ return output
230
233
  except Exception as e: # noqa: BLE001
231
234
  logger.error(f"Error executing Monty: {e}")
232
235
  if is_auth_expired(e):