roksta 0.2.7__cp312-cp312-win_amd64.whl → 0.3.2__cp312-cp312-win_amd64.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.

Potentially problematic release.


This version of roksta might be problematic. Click here for more details.

Files changed (112) hide show
  1. roksta/__init__.cp312-win_amd64.pyd +0 -0
  2. roksta/ai/__init__.cp312-win_amd64.pyd +0 -0
  3. roksta/ai/call_ai.cp312-win_amd64.pyd +0 -0
  4. roksta/ai/gemini.cp312-win_amd64.pyd +0 -0
  5. roksta/ai/generic.cp312-win_amd64.pyd +0 -0
  6. roksta/ai/llm.cp312-win_amd64.pyd +0 -0
  7. roksta/ai/openai.cp312-win_amd64.pyd +0 -0
  8. roksta/ai/tools/__init__.cp312-win_amd64.pyd +0 -0
  9. roksta/ai/tools/delete_file.cp312-win_amd64.pyd +0 -0
  10. roksta/ai/tools/edit_file.cp312-win_amd64.pyd +0 -0
  11. roksta/ai/tools/final_response.cp312-win_amd64.pyd +0 -0
  12. roksta/ai/tools/get_file_summaries.cp312-win_amd64.pyd +0 -0
  13. roksta/ai/tools/read_file.cp312-win_amd64.pyd +0 -0
  14. roksta/ai/tools/regex_replace.cp312-win_amd64.pyd +0 -0
  15. roksta/ai/tools/shell_any.cp312-win_amd64.pyd +0 -0
  16. roksta/ai/tools/shell_limited.cp312-win_amd64.pyd +0 -0
  17. roksta/ai/tools/tool_defs.cp312-win_amd64.pyd +0 -0
  18. roksta/ai/tools/tool_utils.cp312-win_amd64.pyd +0 -0
  19. roksta/ai/tools/write_file.cp312-win_amd64.pyd +0 -0
  20. roksta/analytics.cp312-win_amd64.pyd +0 -0
  21. roksta/balance.cp312-win_amd64.pyd +0 -0
  22. roksta/build_project.cp312-win_amd64.pyd +0 -0
  23. roksta/chat_workflow.cp312-win_amd64.pyd +0 -0
  24. roksta/check_for_updates.cp312-win_amd64.pyd +0 -0
  25. roksta/checkpoints.cp312-win_amd64.pyd +0 -0
  26. roksta/clarify_goal.cp312-win_amd64.pyd +0 -0
  27. roksta/codebase_listing.cp312-win_amd64.pyd +0 -0
  28. roksta/command_handlers/__init__.cp312-win_amd64.pyd +0 -0
  29. roksta/command_handlers/handle_activate_command.cp312-win_amd64.pyd +0 -0
  30. roksta/command_handlers/handle_add_funds_command.cp312-win_amd64.pyd +0 -0
  31. roksta/command_handlers/handle_auto_charge_command.cp312-win_amd64.pyd +0 -0
  32. roksta/command_handlers/handle_auto_commit_command.cp312-win_amd64.pyd +0 -0
  33. roksta/command_handlers/handle_building_command.cp312-win_amd64.pyd +0 -0
  34. roksta/command_handlers/handle_chat_command.cp312-win_amd64.pyd +0 -0
  35. roksta/command_handlers/handle_dev_rate_command.cp312-win_amd64.pyd +0 -0
  36. roksta/command_handlers/handle_feedback_command.cp312-win_amd64.pyd +0 -0
  37. roksta/command_handlers/handle_goal_command.cp312-win_amd64.pyd +0 -0
  38. roksta/command_handlers/handle_help_command.cp312-win_amd64.pyd +0 -0
  39. roksta/command_handlers/handle_init_command.cp312-win_amd64.pyd +0 -0
  40. roksta/command_handlers/handle_linting_command.cp312-win_amd64.pyd +0 -0
  41. roksta/command_handlers/handle_login_command.cp312-win_amd64.pyd +0 -0
  42. roksta/command_handlers/handle_logout_command.cp312-win_amd64.pyd +0 -0
  43. roksta/command_handlers/handle_payment_details_command.cp312-win_amd64.pyd +0 -0
  44. roksta/command_handlers/handle_quit_command.cp312-win_amd64.pyd +0 -0
  45. roksta/command_handlers/handle_redeem_command.cp312-win_amd64.pyd +0 -0
  46. roksta/command_handlers/handle_request_activation_command.cp312-win_amd64.pyd +0 -0
  47. roksta/command_handlers/handle_testing_command.cp312-win_amd64.pyd +0 -0
  48. roksta/command_handlers/handle_usage_command.cp312-win_amd64.pyd +0 -0
  49. roksta/create_default_config.cp312-win_amd64.pyd +0 -0
  50. roksta/default_config.cp312-win_amd64.pyd +0 -0
  51. roksta/enums.cp312-win_amd64.pyd +0 -0
  52. roksta/env.cp312-win_amd64.pyd +0 -0
  53. roksta/extended_text_area.cp312-win_amd64.pyd +0 -0
  54. roksta/firebase.cp312-win_amd64.pyd +0 -0
  55. roksta/firebase_auth_web.cp312-win_amd64.pyd +0 -0
  56. roksta/firebase_config.cp312-win_amd64.pyd +0 -0
  57. roksta/fix_tests.cp312-win_amd64.pyd +0 -0
  58. roksta/gen_codebase_summaries.cp312-win_amd64.pyd +0 -0
  59. roksta/gen_one_line_goal.cp312-win_amd64.pyd +0 -0
  60. roksta/get_codebase_structure.cp312-win_amd64.pyd +0 -0
  61. roksta/get_failing_tests.cp312-win_amd64.pyd +0 -0
  62. roksta/goal_workflow.cp312-win_amd64.pyd +0 -0
  63. roksta/init_codebase.cp312-win_amd64.pyd +0 -0
  64. roksta/lint_code.cp312-win_amd64.pyd +0 -0
  65. roksta/logger.cp312-win_amd64.pyd +0 -0
  66. roksta/main.cp312-win_amd64.pyd +0 -0
  67. roksta/make_issue.cp312-win_amd64.pyd +0 -0
  68. roksta/new_features.cp312-win_amd64.pyd +0 -0
  69. roksta/parse_readme.cp312-win_amd64.pyd +0 -0
  70. roksta/propose_solution.cp312-win_amd64.pyd +0 -0
  71. roksta/response_formats.cp312-win_amd64.pyd +0 -0
  72. roksta/rewrite_goal.cp312-win_amd64.pyd +0 -0
  73. roksta/roksta.cp312-win_amd64.pyd +0 -0
  74. roksta/run_cli_goal.cp312-win_amd64.pyd +0 -0
  75. roksta/select_files.cp312-win_amd64.pyd +0 -0
  76. roksta/tips.cp312-win_amd64.pyd +0 -0
  77. roksta/utils.cp312-win_amd64.pyd +0 -0
  78. roksta/write_code.cp312-win_amd64.pyd +0 -0
  79. {roksta-0.2.7.dist-info → roksta-0.3.2.dist-info}/METADATA +2 -1
  80. roksta-0.3.2.dist-info/RECORD +121 -0
  81. tests/conftest.py +42 -0
  82. tests/functions/{api_v0_01 → api_v1_01}/__init__.py +1 -1
  83. tests/functions/{api_v0_01 → api_v1_01}/test__analytics.py +2 -3
  84. tests/functions/{api_v0_01 → api_v1_01}/test__gemini_proxy.py +51 -6
  85. tests/functions/{api_v0_01 → api_v1_01}/test__generic_proxy.py +31 -2
  86. tests/functions/{api_v0_01 → api_v1_01}/test__get_payment_details.py +2 -2
  87. tests/functions/{api_v0_01 → api_v1_01}/test__openai_proxy.py +50 -14
  88. tests/functions/{api_v0_01 → api_v1_01}/test__redeem_credit_code.py +2 -2
  89. tests/functions/{api_v0_01 → api_v1_01}/test__sync_emails.py +3 -2
  90. tests/functions/{api_v0_01 → api_v1_01}/test__take_payment.py +2 -2
  91. tests/functions/{api_v0_01 → api_v1_01}/test__use_activation_code.py +3 -2
  92. tests/functions/api_v1_02/__init__.py +2 -0
  93. tests/functions/api_v1_02/test__analytics.py +416 -0
  94. tests/functions/api_v1_02/test__gemini_proxy.py +352 -0
  95. tests/functions/api_v1_02/test__generic_proxy.py +428 -0
  96. tests/functions/api_v1_02/test__get_payment_details.py +356 -0
  97. tests/functions/api_v1_02/test__openai_proxy.py +449 -0
  98. tests/functions/api_v1_02/test__redeem_credit_code.py +167 -0
  99. tests/functions/api_v1_02/test__sync_emails.py +325 -0
  100. tests/functions/api_v1_02/test__take_payment.py +491 -0
  101. tests/functions/api_v1_02/test__use_activation_code.py +438 -0
  102. tests/functions/api_v1_02/test_proxy_keyword_replacement.py +557 -0
  103. tests/functions/api_v1_02/test_replace_keywords.py +74 -0
  104. tests/functions/test_utils.py +484 -0
  105. roksta/ai/tools.cp312-win_amd64.pyd +0 -0
  106. roksta/command_handlers.cp312-win_amd64.pyd +0 -0
  107. roksta-0.2.7.dist-info/RECORD +0 -78
  108. tests/functions/test_utils_functions.py +0 -222
  109. {roksta-0.2.7.dist-info → roksta-0.3.2.dist-info}/WHEEL +0 -0
  110. {roksta-0.2.7.dist-info → roksta-0.3.2.dist-info}/entry_points.txt +0 -0
  111. {roksta-0.2.7.dist-info → roksta-0.3.2.dist-info}/top_level.txt +0 -0
  112. /tests/functions/{test_main_functions.py → test_main.py} +0 -0
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roksta
3
- Version: 0.2.7
3
+ Version: 0.3.2
4
4
  Summary: An AI coding assistant
5
5
  Author-email: Prash Naidu <prash@roksta.ai>
6
6
  Project-URL: Homepage, https://roksta.ai
@@ -21,6 +21,7 @@ Requires-Dist: gitpython>=3.1.44
21
21
  Requires-Dist: jsonref>=1.1.0
22
22
  Requires-Dist: pathspec>=0.12.1
23
23
  Requires-Dist: psutil>=7.1.0
24
+ Requires-Dist: PyNaCl>=1.6.0
24
25
  Provides-Extra: tests
25
26
  Requires-Dist: pytest>=8.4.1; extra == "tests"
26
27
  Requires-Dist: pytest-asyncio>=1.0.0; extra == "tests"
@@ -0,0 +1,121 @@
1
+ roksta/__init__.cp312-win_amd64.pyd,sha256=bNjqSGjupLiDetflSDFj1sbLG7lUYmoUsOP0tf6stz8,16896
2
+ roksta/analytics.cp312-win_amd64.pyd,sha256=zWyjz85EhW6GSDBMn-UgzkUEKHETF1To8a7YZyr1SeQ,91648
3
+ roksta/balance.cp312-win_amd64.pyd,sha256=bhnuuQuIxAGXequMKJUNMbf2HEf5cXo_6GQ9GrHIsG4,136192
4
+ roksta/build_project.cp312-win_amd64.pyd,sha256=yHz9hh9z0cVfUzA_SCUT80WRPnW4ETNCnM8I7ScAfro,59904
5
+ roksta/chat_workflow.cp312-win_amd64.pyd,sha256=LaEfvnKoPN5cMn5yayUH818z2lt1rVv6hXUi2rUtoyw,88576
6
+ roksta/check_for_updates.cp312-win_amd64.pyd,sha256=kTOz7F17eB-TK51hPfykI0yjsyscMzBNzdfXp4ij64k,100352
7
+ roksta/checkpoints.cp312-win_amd64.pyd,sha256=XVUuw8s22xd21HFaAMbvKBnfeu7LwT6_tdRXqNz6rKc,78336
8
+ roksta/clarify_goal.cp312-win_amd64.pyd,sha256=3GOL_FpqvzhfF79ecqW_Ve3jeDJC8JvzbA5QVe1DUyg,60928
9
+ roksta/codebase_listing.cp312-win_amd64.pyd,sha256=L7G2HFeG-F6pEHMWTV7sk4ZOIhXhlSJzB744rGwTtVg,47104
10
+ roksta/create_default_config.cp312-win_amd64.pyd,sha256=IFhooElPkufYv2oOzSL3K_nxWDnNt2_vxsrIaLhpuxE,30720
11
+ roksta/default_config.cp312-win_amd64.pyd,sha256=Se8jBhxyzie7CG-HPCfOsWFMtiJFpzbGstNF7CM1JuE,31744
12
+ roksta/enums.cp312-win_amd64.pyd,sha256=1zI5TnU9OOm4gVhWn11_lkgiqcNTsF7vJwwdTAGXrlY,123392
13
+ roksta/env.cp312-win_amd64.pyd,sha256=FPoagZXoPXe9do-r11-Cfd5JWSkTwmD1SPAwczv9OAs,27648
14
+ roksta/extended_text_area.cp312-win_amd64.pyd,sha256=N8zcvcZNyOzR9rrOWZpZHwJv2hekbtFVmEZH6QlKiPc,103936
15
+ roksta/firebase.cp312-win_amd64.pyd,sha256=8T3PePai9Ak-aj5ItWHZvfevjYQG6qqGTOW0oBjPwE4,184320
16
+ roksta/firebase_auth_web.cp312-win_amd64.pyd,sha256=RAO89znPt2gLxpfc2NutHjElP3f4RYk1tXgC7rcxboE,172544
17
+ roksta/firebase_config.cp312-win_amd64.pyd,sha256=8CKjMnxozQ_2DOzErvyhWSoNTV8Q1mU2zQ7kQB3L1ko,20992
18
+ roksta/fix_tests.cp312-win_amd64.pyd,sha256=WnkymAeYJVwVlMmFYWZRHzEQ8CPi63HQEouEnKxljr0,71168
19
+ roksta/gen_codebase_summaries.cp312-win_amd64.pyd,sha256=e3iLrWhE9BP1pa9wDSY7vxtZ9FvdBEEHXxWH4wqRuSo,237568
20
+ roksta/gen_one_line_goal.cp312-win_amd64.pyd,sha256=pGjf3AigNyaq236YWCZUpjMrLv8xMAgKGuEBR0SjvJY,64512
21
+ roksta/get_codebase_structure.cp312-win_amd64.pyd,sha256=-z4TdHuI70cphwwcbruMANahtdXjTwKTapLZWqJIaXg,65024
22
+ roksta/get_failing_tests.cp312-win_amd64.pyd,sha256=iid6KCIEu8Ia0PhJIdAUcqh4BRo9FfVAVpUWibSJovQ,68608
23
+ roksta/goal_workflow.cp312-win_amd64.pyd,sha256=ztVqt6lGkTpoPbOXO7ph6zbvg2hoJBA47hmriidnahs,193024
24
+ roksta/init_codebase.cp312-win_amd64.pyd,sha256=lEICNlb8X7slScMwNxTXT2iRXzxr2FgogNfECWH13jQ,113664
25
+ roksta/lint_code.cp312-win_amd64.pyd,sha256=lloEfvQP9486QnKt4wRzm7kOtyyfmy7qIBg3McnMz_I,73728
26
+ roksta/logger.cp312-win_amd64.pyd,sha256=3E5cptzphC8pFcDqpzTU_zt3uA3qcQav_A8GDJ9jzYI,38912
27
+ roksta/main.cp312-win_amd64.pyd,sha256=ZKDTdIj1ZaKDj8JUAl4QVxynOa8TX2239CZYHj52Uy8,37888
28
+ roksta/make_issue.cp312-win_amd64.pyd,sha256=LixxB3mAQFDLCQH9v5j2GhX0FJlWzQxrV8IPqDvrW0E,66560
29
+ roksta/new_features.cp312-win_amd64.pyd,sha256=cNVwuylZjaj5HSvab1GwUWFRaxKBPGhhZl0RWZ11vf0,16896
30
+ roksta/parse_readme.cp312-win_amd64.pyd,sha256=TaAk9eaHEr9GPUdifCyHtN7Q7fcm5AnK_u0ZyXbULjY,62464
31
+ roksta/propose_solution.cp312-win_amd64.pyd,sha256=Cuu86eCDq0zMZNkMbulGxgNNZHEr1jtMVBVxyhshgKE,58368
32
+ roksta/response_formats.cp312-win_amd64.pyd,sha256=KvhOntrfc73yNy4G7R8dW_zNjQa1m7vMg6XaPYPgGvg,39424
33
+ roksta/rewrite_goal.cp312-win_amd64.pyd,sha256=CxPRRiJiTgKDa3lW9DEHn9qqiCO1WDyvYvBTZ5XISCA,55296
34
+ roksta/roksta.cp312-win_amd64.pyd,sha256=S7jQYFR-IAkNUSPyp01pFgIVwUaV3Dvw2hVbyzMvIv0,228352
35
+ roksta/run_cli_goal.cp312-win_amd64.pyd,sha256=XtiGL5om5wfzcF6lRpBlAibivbRoXLTJVua8D3JjoWk,68096
36
+ roksta/select_files.cp312-win_amd64.pyd,sha256=OjZR4yarsik7PUsgYdSqnKZJpuZ-JbqMjWNESbhidiI,62464
37
+ roksta/tips.cp312-win_amd64.pyd,sha256=-NMtX4vhV-23FF_vBx5aFrNiaBYyZVNTfR5tZjgHHlc,21504
38
+ roksta/utils.cp312-win_amd64.pyd,sha256=LURWnBM0m3HH3eOUQdOKtOuR_HJGwh6yYnb2gam7JTc,232960
39
+ roksta/write_code.cp312-win_amd64.pyd,sha256=uT52INpmvwK9ZKX6dG6xGi7JAFexAcVI3uogiAp1vpU,56320
40
+ roksta/ai/__init__.cp312-win_amd64.pyd,sha256=ly3EjT4SFIVYHkNzpDB9_hYtyr273t4j7lQKir9Koxs,16896
41
+ roksta/ai/call_ai.cp312-win_amd64.pyd,sha256=QHCsdDPQ5BydnMPq4xVG0jZ-41uuPNcIiNzzGMUH7uY,73728
42
+ roksta/ai/gemini.cp312-win_amd64.pyd,sha256=54cizK1A1ahGGAVRrjqRebDIFqJ3DEB_ppr6ay_yYAU,144896
43
+ roksta/ai/generic.cp312-win_amd64.pyd,sha256=TniLJjdSd7SfjJQhNWpHIrAxHOz0wGj26PSbTfH9Rg0,106496
44
+ roksta/ai/llm.cp312-win_amd64.pyd,sha256=mXLo6YA_b6Klb_dhJyVaCp0n61wG5wZ2BWNsRU5bKNE,83968
45
+ roksta/ai/openai.cp312-win_amd64.pyd,sha256=3ziFpZ1c3ZnZxPMREOvtEAU36_2_NzG6pThmBNlAAiE,103936
46
+ roksta/ai/tools/__init__.cp312-win_amd64.pyd,sha256=fx9P_o16Uucn9NhMWoZNXghpHs2Exp4G30JGGkH1yoQ,25088
47
+ roksta/ai/tools/delete_file.cp312-win_amd64.pyd,sha256=QyMamn7fBrPJIsc6g9E3dKWjYu8niOavd67P0Yt8qWo,34304
48
+ roksta/ai/tools/edit_file.cp312-win_amd64.pyd,sha256=OTKH3tE4ej1FOAOyUbCvMBOxbkx7RTRx1FDTV1yq1No,45056
49
+ roksta/ai/tools/final_response.cp312-win_amd64.pyd,sha256=vyKtuItI7Hf07fgATU6NjaIq7zQVdrQNkjp3l0jEL0A,23040
50
+ roksta/ai/tools/get_file_summaries.cp312-win_amd64.pyd,sha256=R7qEjTLbzTt5gREcVERx2dtr_9DmtlfR9-F6SkNOPOg,36864
51
+ roksta/ai/tools/read_file.cp312-win_amd64.pyd,sha256=2OKW8omBsdtiBw--MmyK-dEUPtUrifZF5_cg-KMBOI8,46080
52
+ roksta/ai/tools/regex_replace.cp312-win_amd64.pyd,sha256=pe343kHgAc7eR9HEdWFLqtD4lxchJEPHwrEH-_YF0AY,45568
53
+ roksta/ai/tools/shell_any.cp312-win_amd64.pyd,sha256=hIVSa21NHSTBb_wmid2SF0sRzEPi11sYPdMo7zKYRr4,70144
54
+ roksta/ai/tools/shell_limited.cp312-win_amd64.pyd,sha256=5gIh0MvhrMfsBpyg2aJK9etTW_KUq-htjJtGQEFycmY,56832
55
+ roksta/ai/tools/tool_defs.cp312-win_amd64.pyd,sha256=0oWbuxxLTFUCbkjGmgeGnTc-dQyrvA-zTsOo_GDdFtM,37376
56
+ roksta/ai/tools/tool_utils.cp312-win_amd64.pyd,sha256=Mezuh6URPr9b6Eb60z-z_WWgbjXwzcYd9JqJqr4v_1s,98304
57
+ roksta/ai/tools/write_file.cp312-win_amd64.pyd,sha256=ZaePl5_99wCW-RWoUrB9a-ir6VWACHCM_fYB1NFgFDY,36352
58
+ roksta/command_handlers/__init__.cp312-win_amd64.pyd,sha256=a5y7rtslP3hy3BPz8hOo7S7oKiPYl98lqxqigNG-ONc,23040
59
+ roksta/command_handlers/handle_activate_command.cp312-win_amd64.pyd,sha256=A3tBIC36eHfk4oYU9b6HhhyYT1QjIyVYEeODGORfwIc,78336
60
+ roksta/command_handlers/handle_add_funds_command.cp312-win_amd64.pyd,sha256=ey2184ZjS_FZLd8OXIwlnV3gLLuvAhsvbO4qKoMeGg8,68608
61
+ roksta/command_handlers/handle_auto_charge_command.cp312-win_amd64.pyd,sha256=L2QlREXpseL0E98H3Wba8XiAUzqbdraaIdRPEn3efzw,49664
62
+ roksta/command_handlers/handle_auto_commit_command.cp312-win_amd64.pyd,sha256=BLWQPP9muR7qw4gS0D02KeHx4QOpn8QFuKWc2pDj9iE,36864
63
+ roksta/command_handlers/handle_building_command.cp312-win_amd64.pyd,sha256=hSaRduSsMwJIytgpgHefHnqlucRIwTJcoICWTlkjuc8,41984
64
+ roksta/command_handlers/handle_chat_command.cp312-win_amd64.pyd,sha256=xlgZDhLfgbW2YwaJFyLIMnDDQ473vJVaaADUtYmVNEs,41984
65
+ roksta/command_handlers/handle_dev_rate_command.cp312-win_amd64.pyd,sha256=pEoKZhaxR--fYxg8aHqIGLA9UGm07-v8I8HptnuLr7U,37376
66
+ roksta/command_handlers/handle_feedback_command.cp312-win_amd64.pyd,sha256=QXqIxmFkuM14iHWkApVDWmpb8Gyuz5HlHH57davg14o,61440
67
+ roksta/command_handlers/handle_goal_command.cp312-win_amd64.pyd,sha256=axPG_GoNteF9RqHUHfXPjeKpa5zfHGLLDLV5OSrv0Ew,55808
68
+ roksta/command_handlers/handle_help_command.cp312-win_amd64.pyd,sha256=4_YE029TzQJK3HbCi7SV0brIgPP-iUQPLqdopgCQyTw,73728
69
+ roksta/command_handlers/handle_init_command.cp312-win_amd64.pyd,sha256=j7lj2fJVgirfQlxOwrpZjII-xeFCg6w1q3XdJfBcQ4c,52224
70
+ roksta/command_handlers/handle_linting_command.cp312-win_amd64.pyd,sha256=d5IA20nJ_5USgS61sMUoSd1botafK1pnu14setZ6yVQ,45056
71
+ roksta/command_handlers/handle_login_command.cp312-win_amd64.pyd,sha256=TvUJv19Z3sRpChmIR9Ht9oY2bNYrFiLjm1Qbtw2oAUs,64512
72
+ roksta/command_handlers/handle_logout_command.cp312-win_amd64.pyd,sha256=UFKxL2BHlH589KaJhXilfXysE8s7a72XXt_ElVuIHhk,28672
73
+ roksta/command_handlers/handle_payment_details_command.cp312-win_amd64.pyd,sha256=39F1US1YJ7CVVWO5wolDMgqlvvOV1XpkNHqmpyqLr_E,55296
74
+ roksta/command_handlers/handle_quit_command.cp312-win_amd64.pyd,sha256=a23CT08pKFZox0W34Fyh9MYWb5kw3OR4QQVhMCBBQa4,20992
75
+ roksta/command_handlers/handle_redeem_command.cp312-win_amd64.pyd,sha256=OicwbiwlPYpGuzumlHP8t2lfaCqgYE-W_jwZGM-wXHk,53248
76
+ roksta/command_handlers/handle_request_activation_command.cp312-win_amd64.pyd,sha256=HdLt4dB30eZuL3ouCsHn637OsUuEEJVeKbiVSFXkW1Y,64512
77
+ roksta/command_handlers/handle_testing_command.cp312-win_amd64.pyd,sha256=hIKKjQJ0Kej1-n_JKbgps7PekWcEfoQGhnwMq5GhDNQ,41984
78
+ roksta/command_handlers/handle_usage_command.cp312-win_amd64.pyd,sha256=leG9IajTvqDXtdI-I4OrT_6GIMOSlyDiDNph0nw5Sgk,60928
79
+ tests/__init__.py,sha256=meQjVtD2zimtDw3tIP6nNWHGDQVC42as-c_y038cYnk,126
80
+ tests/conftest.py,sha256=4-DveP_c_DUwOcRu8_qAE8zJAWmc0kP6XeUXlWSCC8Q,8089
81
+ tests/functions/__init__.py,sha256=msAiuVOA8jfqVxichPYYyfBFCVEFB_xRvj4lrSpKK1w,97
82
+ tests/functions/test_auth.py,sha256=SNzmpkoxknrxx6cTE91MM2kN3F08GB1pRuupP5IrQs0,1016
83
+ tests/functions/test_main.py,sha256=LgWLAOtSfDXNfHhAAr-j9Peb5JBLFtQ0eKAWqTxLNDU,2648
84
+ tests/functions/test_utils.py,sha256=x-_30jai12k87c_7LwuYpk3_mGM_uTF6ZHXGvMWYlO8,17205
85
+ tests/functions/api_v1_00/__init__.py,sha256=VdV5Oy6FRVT4S1xK34YodylJ7FY6jqvjujkS2Qvbyt0,126
86
+ tests/functions/api_v1_00/test__analytics.py,sha256=s_pK4ySr86PC4ZBr7Y7bCHOEuFj36amaWrianBZ_QbU,16222
87
+ tests/functions/api_v1_00/test__gemini_proxy.py,sha256=ZNYBQ9agPyNYGAVYlWPY6IF8wP_5IQ4nbHOpY8TnKEw,13696
88
+ tests/functions/api_v1_00/test__generic_proxy.py,sha256=f2KjO8v_mh4nBwdkFXJLYfFUBpJS_RDtQNfn0ltE2oM,18101
89
+ tests/functions/api_v1_00/test__get_payment_details.py,sha256=GRMAn8WR-07EBZ0IkeVE4MARFUbDdDhEHO2dITRxnVA,14091
90
+ tests/functions/api_v1_00/test__openai_proxy.py,sha256=i1f7S8IFgWiG6WGG-YYptjTCOjSudujEMyhP16BVlW0,18175
91
+ tests/functions/api_v1_00/test__redeem_credit_code.py,sha256=A5WwuSXBX5TiZPdYrDRkUmpppBXG00lcP0LmRz0gNr0,6514
92
+ tests/functions/api_v1_00/test__sync_emails.py,sha256=e0rb637Ois25t__1G8Yp7Pj8WgC-R1I9SUgS6bK1dsU,13024
93
+ tests/functions/api_v1_00/test__take_payment.py,sha256=RQBUHcgN3-XOoPtAjca_72q4BaZxr_L3G_Nss5-gb2g,18513
94
+ tests/functions/api_v1_00/test__use_activation_code.py,sha256=ZOCwXHzenH0l1WhmZP8s8vaXIk58lHpKJ0igx0VEDwY,17398
95
+ tests/functions/api_v1_01/__init__.py,sha256=VdV5Oy6FRVT4S1xK34YodylJ7FY6jqvjujkS2Qvbyt0,126
96
+ tests/functions/api_v1_01/test__analytics.py,sha256=s_pK4ySr86PC4ZBr7Y7bCHOEuFj36amaWrianBZ_QbU,16222
97
+ tests/functions/api_v1_01/test__gemini_proxy.py,sha256=ZNYBQ9agPyNYGAVYlWPY6IF8wP_5IQ4nbHOpY8TnKEw,13696
98
+ tests/functions/api_v1_01/test__generic_proxy.py,sha256=f2KjO8v_mh4nBwdkFXJLYfFUBpJS_RDtQNfn0ltE2oM,18101
99
+ tests/functions/api_v1_01/test__get_payment_details.py,sha256=GRMAn8WR-07EBZ0IkeVE4MARFUbDdDhEHO2dITRxnVA,14091
100
+ tests/functions/api_v1_01/test__openai_proxy.py,sha256=i1f7S8IFgWiG6WGG-YYptjTCOjSudujEMyhP16BVlW0,18175
101
+ tests/functions/api_v1_01/test__redeem_credit_code.py,sha256=A5WwuSXBX5TiZPdYrDRkUmpppBXG00lcP0LmRz0gNr0,6514
102
+ tests/functions/api_v1_01/test__sync_emails.py,sha256=e0rb637Ois25t__1G8Yp7Pj8WgC-R1I9SUgS6bK1dsU,13024
103
+ tests/functions/api_v1_01/test__take_payment.py,sha256=RQBUHcgN3-XOoPtAjca_72q4BaZxr_L3G_Nss5-gb2g,18513
104
+ tests/functions/api_v1_01/test__use_activation_code.py,sha256=ZOCwXHzenH0l1WhmZP8s8vaXIk58lHpKJ0igx0VEDwY,17398
105
+ tests/functions/api_v1_02/__init__.py,sha256=VdV5Oy6FRVT4S1xK34YodylJ7FY6jqvjujkS2Qvbyt0,126
106
+ tests/functions/api_v1_02/test__analytics.py,sha256=s_pK4ySr86PC4ZBr7Y7bCHOEuFj36amaWrianBZ_QbU,16222
107
+ tests/functions/api_v1_02/test__gemini_proxy.py,sha256=ZNYBQ9agPyNYGAVYlWPY6IF8wP_5IQ4nbHOpY8TnKEw,13696
108
+ tests/functions/api_v1_02/test__generic_proxy.py,sha256=f2KjO8v_mh4nBwdkFXJLYfFUBpJS_RDtQNfn0ltE2oM,18101
109
+ tests/functions/api_v1_02/test__get_payment_details.py,sha256=GRMAn8WR-07EBZ0IkeVE4MARFUbDdDhEHO2dITRxnVA,14091
110
+ tests/functions/api_v1_02/test__openai_proxy.py,sha256=i1f7S8IFgWiG6WGG-YYptjTCOjSudujEMyhP16BVlW0,18175
111
+ tests/functions/api_v1_02/test__redeem_credit_code.py,sha256=A5WwuSXBX5TiZPdYrDRkUmpppBXG00lcP0LmRz0gNr0,6514
112
+ tests/functions/api_v1_02/test__sync_emails.py,sha256=e0rb637Ois25t__1G8Yp7Pj8WgC-R1I9SUgS6bK1dsU,13024
113
+ tests/functions/api_v1_02/test__take_payment.py,sha256=RQBUHcgN3-XOoPtAjca_72q4BaZxr_L3G_Nss5-gb2g,18513
114
+ tests/functions/api_v1_02/test__use_activation_code.py,sha256=ZOCwXHzenH0l1WhmZP8s8vaXIk58lHpKJ0igx0VEDwY,17398
115
+ tests/functions/api_v1_02/test_proxy_keyword_replacement.py,sha256=NFr_2f5mYinqx1pwdQjSL4MUs6Zge6Kzz4SeX8H8xq4,24189
116
+ tests/functions/api_v1_02/test_replace_keywords.py,sha256=pFl3XWxujSwkXcuSxsznv_8qvx4u2rh441V6U-31yvc,2757
117
+ roksta-0.3.2.dist-info/METADATA,sha256=NBLudPACgAEsf0RubYaDnGy7TqzoS6WcXzNtq5Dra3o,1496
118
+ roksta-0.3.2.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
119
+ roksta-0.3.2.dist-info/entry_points.txt,sha256=mzRdYg_DlzZRwjxYUt9-gyoRCkM1QBTeTbwETgiTdGw,44
120
+ roksta-0.3.2.dist-info/top_level.txt,sha256=lvciNZQ1dPGXpiCLdWVXK03n9fKHjbQdwjqQbnUjeYM,13
121
+ roksta-0.3.2.dist-info/RECORD,,
tests/conftest.py CHANGED
@@ -167,3 +167,45 @@ except Exception:
167
167
  _attach_gtypes_stubs(gtypes)
168
168
  genai.types = gtypes
169
169
  sys.modules['google.genai.types'] = gtypes
170
+
171
+ # Provide a minimal nacl.public stub if PyNaCl is not installed. This prevents
172
+ # import-time failures in tests that import `roksta.firebase` which does
173
+ # `from nacl.public import PublicKey, SealedBox`.
174
+ try:
175
+ import nacl.public # type: ignore
176
+ except Exception:
177
+ # Create lightweight stub modules to satisfy `from nacl.public import PublicKey, SealedBox`
178
+ nacl = _types_mod.ModuleType('nacl')
179
+ nacl_public = _types_mod.ModuleType('nacl.public')
180
+
181
+ class PublicKey:
182
+ def __init__(self, data):
183
+ # Accept bytes-like input; ensure it's bytes when possible.
184
+ try:
185
+ self._data = bytes(data)
186
+ except Exception:
187
+ self._data = data
188
+
189
+ def __repr__(self):
190
+ try:
191
+ length = len(self._data)
192
+ except Exception:
193
+ length = 'unknown'
194
+ return f"<PublicKey len={length}>"
195
+
196
+ class SealedBox:
197
+ def __init__(self, public_key):
198
+ self.public_key = public_key
199
+
200
+ def encrypt(self, plaintext: bytes) -> bytes:
201
+ # Return deterministic bytes so callers can base64-encode the result.
202
+ if not isinstance(plaintext, (bytes, bytearray)):
203
+ plaintext = str(plaintext).encode('utf-8')
204
+ return b"STUB_ENCRYPTED:" + bytes(plaintext)
205
+
206
+ nacl_public.PublicKey = PublicKey
207
+ nacl_public.SealedBox = SealedBox
208
+ # Attach the submodule on the parent module object for attribute access
209
+ nacl.public = nacl_public
210
+ sys.modules['nacl'] = nacl
211
+ sys.modules['nacl.public'] = nacl_public
@@ -1,2 +1,2 @@
1
- # tests.functions.api_v0_01 package marker
1
+ # tests.functions.api_v1_00 package marker
2
2
  # Allows tests under this directory to be imported with package-qualified names.
@@ -176,12 +176,11 @@ sys.modules['httpx'] = httpx_mod
176
176
  # -----------------------------
177
177
  repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
178
178
  functions_root = os.path.join(repo_root, 'functions')
179
- module_path = os.path.join(functions_root, 'api_v0_01', '_analytics.py')
180
- spec = importlib.util.spec_from_file_location('api_v0_01._analytics', module_path)
179
+ module_path = os.path.join(functions_root, 'api_v1_00', '_analytics.py')
180
+ spec = importlib.util.spec_from_file_location('api_v1_00._analytics', module_path)
181
181
  _analytics = importlib.util.module_from_spec(spec)
182
182
  spec.loader.exec_module(_analytics)
183
183
 
184
-
185
184
  # Restore original sys.modules mappings to avoid side-effects for other tests
186
185
  for name, orig in _orig_sys_modules.items():
187
186
  if orig is None:
@@ -19,6 +19,8 @@ if FUNCTIONS_DIR not in sys.path:
19
19
  _orig_sys_modules = {}
20
20
  _names_to_fake = [
21
21
  'firebase_functions',
22
+ 'firebase_admin',
23
+ 'firebase_admin.firestore',
22
24
  'utils',
23
25
  'auth',
24
26
  'google',
@@ -49,6 +51,35 @@ class FakeResponse:
49
51
  firebase_functions.https_fn = types.SimpleNamespace(Request=object, Response=FakeResponse)
50
52
  sys.modules['firebase_functions'] = firebase_functions
51
53
 
54
+ # Fake firebase_admin and its firestore submodule to satisfy optional imports in the proxy
55
+ firebase_admin = types.ModuleType('firebase_admin')
56
+ firestore_mod = types.ModuleType('firebase_admin.firestore')
57
+
58
+ # Minimal Client type for annotations and a no-op client() factory
59
+ class _DummyClient: # pragma: no cover - just a stub for import-time type hints
60
+ pass
61
+
62
+ def _dummy_client():
63
+ # Return a simple object; logic using it is patched in tests
64
+ return types.SimpleNamespace()
65
+
66
+ # Decorator stub used by perform_atomic_debit; never actually invoked in tests
67
+ def _transactional(fn=None):
68
+ def wrapper(*args, **kwargs):
69
+ return fn(*args, **kwargs)
70
+ return wrapper
71
+
72
+ # Populate stubs on the firestore module
73
+ setattr(firestore_mod, 'Client', _DummyClient)
74
+ setattr(firestore_mod, 'client', _dummy_client)
75
+ setattr(firestore_mod, 'transactional', _transactional)
76
+ setattr(firestore_mod, 'SERVER_TIMESTAMP', object())
77
+
78
+ # Attach firestore submodule to firebase_admin package and register in sys.modules
79
+ setattr(firebase_admin, 'firestore', firestore_mod)
80
+ sys.modules['firebase_admin'] = firebase_admin
81
+ sys.modules['firebase_admin.firestore'] = firestore_mod
82
+
52
83
  # Fake utils module (provides functions imported by _gemini_proxy)
53
84
  utils_mod = types.ModuleType('utils')
54
85
 
@@ -118,14 +149,14 @@ sys.modules['google.genai'] = genai_mod
118
149
  sys.modules['google.genai.types'] = types_mod
119
150
 
120
151
  # Import the module under test after preparing the fake imports
152
+ # Resolve the actual repository 'functions' directory (tests files live under tests/, so climb up to repo root)
121
153
  repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
122
154
  functions_root = os.path.join(repo_root, 'functions')
123
- module_path = os.path.join(functions_root, 'api_v0_01', '_gemini_proxy.py')
124
- spec = importlib.util.spec_from_file_location('api_v0_01._gemini_proxy', module_path)
155
+ module_path = os.path.join(functions_root, 'api_v1_00', '_gemini_proxy.py')
156
+ spec = importlib.util.spec_from_file_location('api_v1_00._gemini_proxy', module_path)
125
157
  _gemini = importlib.util.module_from_spec(spec)
126
158
  spec.loader.exec_module(_gemini)
127
159
 
128
-
129
160
  # Restore original sys.modules mappings to avoid side-effects for other tests
130
161
  for name, orig in _orig_sys_modules.items():
131
162
  if orig is None:
@@ -198,7 +229,9 @@ def test_invalid_auth_key_returns_403():
198
229
  def test_non_post_method_returns_405():
199
230
  headers = {_gemini.AUTH_HEADER_NAME: 'ok'}
200
231
  req = DummyRequest(headers=headers, method='GET')
201
- with patch.object(_gemini, 'validate_auth_key', return_value=True), patch.object(_gemini, 'verify_firebase_token', return_value={}):
232
+ with patch.object(_gemini, 'validate_auth_key', return_value=True), \
233
+ patch.object(_gemini, 'verify_firebase_token', return_value={}), \
234
+ patch.object(_gemini, 'ensure_balance_positive', return_value=(True, 100.0)):
202
235
  resp = _gemini._gemini_proxy(req)
203
236
 
204
237
  assert resp.status_code == 405
@@ -210,7 +243,9 @@ def test_non_post_method_returns_405():
210
243
  def test_malformed_json_returns_400():
211
244
  headers = {_gemini.AUTH_HEADER_NAME: 'ok'}
212
245
  req = DummyRequest(headers=headers, method='POST', raise_on_get_json=True)
213
- with patch.object(_gemini, 'validate_auth_key', return_value=True), patch.object(_gemini, 'verify_firebase_token', return_value={}):
246
+ with patch.object(_gemini, 'validate_auth_key', return_value=True), \
247
+ patch.object(_gemini, 'verify_firebase_token', return_value={}), \
248
+ patch.object(_gemini, 'ensure_balance_positive', return_value=(True, 100.0)):
214
249
  resp = _gemini._gemini_proxy(req)
215
250
 
216
251
  assert resp.status_code == 400
@@ -223,7 +258,9 @@ def test_rehydrate_params_error_returns_400():
223
258
  headers = {_gemini.AUTH_HEADER_NAME: 'ok'}
224
259
  # missing 'model' to cause KeyError inside rehydrate_params
225
260
  req = DummyRequest(headers=headers, method='POST', json_data={'contents': 'x', 'config': {}})
226
- with patch.object(_gemini, 'validate_auth_key', return_value=True), patch.object(_gemini, 'verify_firebase_token', return_value={}):
261
+ with patch.object(_gemini, 'validate_auth_key', return_value=True), \
262
+ patch.object(_gemini, 'verify_firebase_token', return_value={}), \
263
+ patch.object(_gemini, 'ensure_balance_positive', return_value=(True, 100.0)):
227
264
  resp = _gemini._gemini_proxy(req)
228
265
 
229
266
  assert resp.status_code == 400
@@ -237,6 +274,7 @@ def test_get_api_key_failure_returns_500():
237
274
  req = DummyRequest(headers=headers, method='POST', json_data={'model': 'g', 'contents': 'hi', 'config': {}})
238
275
  with patch.object(_gemini, 'validate_auth_key', return_value=True), \
239
276
  patch.object(_gemini, 'verify_firebase_token', return_value={}), \
277
+ patch.object(_gemini, 'ensure_balance_positive', return_value=(True, 100.0)), \
240
278
  patch.object(_gemini, 'get_api_key', side_effect=Exception('boom')):
241
279
  resp = _gemini._gemini_proxy(req)
242
280
 
@@ -258,12 +296,18 @@ def test_successful_flow_calls_genai_and_returns_payload():
258
296
 
259
297
  def generate_content(self, **params):
260
298
  class FakeResp:
299
+ def __init__(self):
300
+ # include usage metadata expected by get_usage()
301
+ self.usage_metadata = types.SimpleNamespace(prompt_token_count=1, total_token_count=2)
302
+
261
303
  def to_json_dict(self_inner):
262
304
  return { 'result': 'ok', 'received_model': params.get('model') }
263
305
  return FakeResp()
264
306
 
265
307
  with patch.object(_gemini, 'validate_auth_key', return_value=True), \
266
308
  patch.object(_gemini, 'verify_firebase_token', return_value={}), \
309
+ patch.object(_gemini, 'ensure_balance_positive', return_value=(True, 100.0)), \
310
+ patch.object(_gemini, 'bill_with_retry', return_value=("ok", 99.5)), \
267
311
  patch.object(_gemini, 'get_api_key', return_value='GEMINI-KEY'), \
268
312
  patch.object(_gemini.genai, 'Client', FakeClient):
269
313
  resp = _gemini._gemini_proxy(req)
@@ -297,6 +341,7 @@ def test_genai_exception_with_status_code_is_returned_as_error_status():
297
341
 
298
342
  with patch.object(_gemini, 'validate_auth_key', return_value=True), \
299
343
  patch.object(_gemini, 'verify_firebase_token', return_value={}), \
344
+ patch.object(_gemini, 'ensure_balance_positive', return_value=(True, 100.0)), \
300
345
  patch.object(_gemini, 'get_api_key', return_value='GEMINI-KEY'), \
301
346
  patch.object(_gemini.genai, 'Client', ErrClient):
302
347
  resp = _gemini._gemini_proxy(req)
@@ -108,13 +108,42 @@ openai_mod.APIError = APIError
108
108
  sys.modules['openai'] = openai_mod
109
109
 
110
110
  # Import the module under test after preparing the fake imports
111
+ #_generic = importlib.import_module('_generic_proxy')
112
+
111
113
  repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
112
114
  functions_root = os.path.join(repo_root, 'functions')
113
- module_path = os.path.join(functions_root, 'api_v0_01', '_generic_proxy.py')
114
- spec = importlib.util.spec_from_file_location('api_v0_01._generic_proxy', module_path)
115
+ module_path = os.path.join(functions_root, 'api_v1_00', '_generic_proxy.py')
116
+ spec = importlib.util.spec_from_file_location('api_v1_00._generic_proxy', module_path)
115
117
  _generic = importlib.util.module_from_spec(spec)
116
118
  spec.loader.exec_module(_generic)
117
119
 
120
+ # Patch Firestore client and billing functions to avoid external dependencies during tests
121
+ # Provide a dummy Firestore client and make balance checks/billing no-ops.
122
+ _generic.firestore = types.SimpleNamespace(client=lambda: object())
123
+
124
+ def _fake_ensure_balance_positive(db, user_id):
125
+ return True, 100.0
126
+
127
+ def _fake_extract_usage(llm_family=None, call_type=None, model_id=None, request_payload=None, response_payload=None):
128
+ # Default to zero-usage unless present in the payload
129
+ usage = response_payload.get('usage', {}) if isinstance(response_payload, dict) else {}
130
+ in_tokens = usage.get('prompt_tokens', 0) or usage.get('input_tokens', 0) or 0
131
+ out_tokens = usage.get('completion_tokens', 0) or usage.get('output_tokens', 0) or 0
132
+ return {"input_tokens": in_tokens, "output_tokens": out_tokens}
133
+
134
+ def _fake_calculate_cost(model_id=None, input_tokens=0, output_tokens=0):
135
+ return 0.0
136
+
137
+ def _fake_bill_with_retry(db=None, user_id=None, model_id=None, usage=None, cost=None, reason=None):
138
+ return "ok", 100.0
139
+
140
+ _generic.ensure_balance_positive = _fake_ensure_balance_positive
141
+ _generic.extract_usage = _fake_extract_usage
142
+ # Compatibility shim: some versions of the module call get_usage(response) instead of extract_usage(...)
143
+ _generic.get_usage = lambda response: _fake_extract_usage(response_payload=response)
144
+ _generic.calculate_cost = _fake_calculate_cost
145
+ _generic.bill_with_retry = _fake_bill_with_retry
146
+
118
147
  # Restore original sys.modules mappings to avoid side-effects for other tests
119
148
  for name, orig in _orig_sys_modules.items():
120
149
  if orig is None:
@@ -186,8 +186,8 @@ sys.modules['ulid'] = ulid_mod
186
186
  # Load the module directly from the functions/ tree so the test's fake sys.modules entries are respected
187
187
  repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
188
188
  functions_root = os.path.join(repo_root, 'functions')
189
- module_path = os.path.join(functions_root, 'api_v0_01', '_get_payment_details.py')
190
- spec = importlib.util.spec_from_file_location('api_v0_01._get_payment_details', module_path)
189
+ module_path = os.path.join(functions_root, 'api_v1_00', '_get_payment_details.py')
190
+ spec = importlib.util.spec_from_file_location('api_v1_00._get_payment_details', module_path)
191
191
  _get_payment_details = importlib.util.module_from_spec(spec)
192
192
  spec.loader.exec_module(_get_payment_details)
193
193