jaseci 1.4.1.8__tar.gz → 1.4.2__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.

Potentially problematic release.


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

Files changed (192) hide show
  1. jaseci-1.4.2/PKG-INFO +35 -0
  2. jaseci-1.4.2/jaseci/VERSION +1 -0
  3. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/request.py +6 -6
  4. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/stripe.py +10 -2
  5. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/task.py +2 -2
  6. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/url.py +1 -1
  7. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/global_api.py +11 -2
  8. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/user_api.py +1 -1
  9. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/webhook_api.py +3 -2
  10. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/svc/elastic_svc.py +30 -8
  11. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/interpreter/architype_interp.py +0 -1
  12. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/interpreter/interp.py +5 -22
  13. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/interpreter/sentinel_interp.py +0 -2
  14. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/interpreter/walker_interp.py +0 -1
  15. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/machine/machine_state.py +5 -4
  16. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/jsorc_settings.py +2 -0
  17. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/live_actions.py +29 -7
  18. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/remote_actions.py +57 -6
  19. jaseci-1.4.2/jaseci/jsorc/tests/test_actions.py +542 -0
  20. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/ability.py +0 -6
  21. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/edge.py +5 -0
  22. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/node.py +17 -10
  23. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/sentinel.py +4 -1
  24. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/tests/jac_test_code.py +105 -0
  25. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/tests/test_stripe.py +5 -0
  26. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/id_list.py +9 -5
  27. jaseci-1.4.2/jaseci.egg-info/PKG-INFO +35 -0
  28. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci.egg-info/requires.txt +1 -1
  29. {jaseci-1.4.1.8 → jaseci-1.4.2}/setup.py +1 -1
  30. jaseci-1.4.1.8/PKG-INFO +0 -7
  31. jaseci-1.4.1.8/jaseci/VERSION +0 -1
  32. jaseci-1.4.1.8/jaseci/jsorc/tests/test_actions.py +0 -80
  33. jaseci-1.4.1.8/jaseci.egg-info/PKG-INFO +0 -7
  34. {jaseci-1.4.1.8 → jaseci-1.4.2}/LICENSE +0 -0
  35. {jaseci-1.4.1.8 → jaseci-1.4.2}/README.md +0 -0
  36. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/__init__.py +0 -0
  37. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/cli_tools/__init__.py +0 -0
  38. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/cli_tools/book_tools.py +0 -0
  39. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/cli_tools/jsctl.py +0 -0
  40. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/cli_tools/tests/__init__.py +0 -0
  41. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/cli_tools/tests/test_jsctl.py +0 -0
  42. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/__init__.py +0 -0
  43. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/__init__.py +0 -0
  44. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/date.py +0 -0
  45. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/elastic.py +0 -0
  46. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/file.py +0 -0
  47. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/file_handler.py +0 -0
  48. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/internal.py +0 -0
  49. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/jaseci.py +0 -0
  50. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/mail.py +0 -0
  51. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/maths.py +0 -0
  52. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/net.py +0 -0
  53. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/rand.py +0 -0
  54. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/regex.py +0 -0
  55. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/std.py +0 -0
  56. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/storage.py +0 -0
  57. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/__init__.py +0 -0
  58. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/std_test_code.py +0 -0
  59. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_date.py +0 -0
  60. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_elastic.py +0 -0
  61. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_file.py +0 -0
  62. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_file_lib.py +0 -0
  63. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_mail_lib.py +0 -0
  64. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_maths.py +0 -0
  65. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_net_lib.py +0 -0
  66. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_regex.py +0 -0
  67. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_std.py +0 -0
  68. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_std_lib.py +0 -0
  69. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_url.py +0 -0
  70. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_vector.py +0 -0
  71. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_webtool.py +0 -0
  72. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/tests/test_zlib.py +0 -0
  73. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/vector.py +0 -0
  74. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/webtool.py +0 -0
  75. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/act_lib/zip.py +0 -0
  76. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/__init__.py +0 -0
  77. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/actions_api.py +0 -0
  78. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/alias_api.py +0 -0
  79. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/architype_api.py +0 -0
  80. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/config_api.py +0 -0
  81. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/graph_api.py +0 -0
  82. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/interface.py +0 -0
  83. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/jac_api.py +0 -0
  84. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/jsorc_api.py +0 -0
  85. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/logger_api.py +0 -0
  86. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/master_api.py +0 -0
  87. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/object_api.py +0 -0
  88. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/prometheus_api.py +0 -0
  89. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/queue_api.py +0 -0
  90. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/sentinel_api.py +0 -0
  91. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/super_api.py +0 -0
  92. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/tests/__init__.py +0 -0
  93. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/tests/test_architype_api.py +0 -0
  94. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/tests/test_global_api.py +0 -0
  95. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/tests/test_graph_api.py +0 -0
  96. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/tests/test_logger_api.py +0 -0
  97. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/tests/test_object_api.py +0 -0
  98. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/tests/test_sentinel_api.py +0 -0
  99. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/tests/test_uncommon.py +0 -0
  100. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/tests/test_user_api.py +0 -0
  101. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/tests/test_walker_api.py +0 -0
  102. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/api/walker_api.py +0 -0
  103. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/svc/__init__.py +0 -0
  104. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/svc/kube_svc.py +0 -0
  105. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/svc/mail_svc.py +0 -0
  106. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/svc/prome_svc.py +0 -0
  107. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/svc/redis_svc.py +0 -0
  108. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/svc/storage_svc.py +0 -0
  109. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/svc/stripe_svc.py +0 -0
  110. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/svc/task_svc.py +0 -0
  111. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/extens/svc/tasks.py +0 -0
  112. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/__init__.py +0 -0
  113. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/interpreter/__init__.py +0 -0
  114. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/interpreter/tests/__init__.py +0 -0
  115. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/interpreter/tests/test_interp.py +0 -0
  116. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/__init__.py +0 -0
  117. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/ast.py +0 -0
  118. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/ast_builder.py +0 -0
  119. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/jac_code.py +0 -0
  120. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/passes/__init__.py +0 -0
  121. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/passes/ast_prune_pass.py +0 -0
  122. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/passes/codegen_pass.py +0 -0
  123. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/passes/ir_pass.py +0 -0
  124. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/passes/printer_pass.py +0 -0
  125. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/passes/pt_prune_pass.py +0 -0
  126. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/passes/schedule.py +0 -0
  127. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/ir/passes/stats_pass.py +0 -0
  128. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jac.g4 +0 -0
  129. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jac_parse/__init__.py +0 -0
  130. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jac_parse/jacLexer.py +0 -0
  131. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jac_parse/jacListener.py +0 -0
  132. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jac_parse/jacParser.py +0 -0
  133. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jac_set.py +0 -0
  134. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jsci_vm/__init__.py +0 -0
  135. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jsci_vm/disasm.py +0 -0
  136. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jsci_vm/inst_ptr.py +0 -0
  137. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jsci_vm/machine.py +0 -0
  138. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jsci_vm/op_codes.py +0 -0
  139. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jsci_vm/tests/__init__.py +0 -0
  140. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/jsci_vm/tests/test_codegen.py +0 -0
  141. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/machine/__init__.py +0 -0
  142. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/machine/jac_scope.py +0 -0
  143. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/machine/jac_value.py +0 -0
  144. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/tests/__init__.py +0 -0
  145. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/tests/book_code.py +0 -0
  146. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/tests/test_book.py +0 -0
  147. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jac/tests/test_lang_14.py +0 -0
  148. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/__init__.py +0 -0
  149. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/jsorc.py +0 -0
  150. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/jsorc_utils.py +0 -0
  151. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/manifests/__init__.py +0 -0
  152. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/manifests/database.yaml +0 -0
  153. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/manifests/elastic.yaml +0 -0
  154. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/manifests/prometheus.yaml +0 -0
  155. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/manifests/redis.yaml +0 -0
  156. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/memory.py +0 -0
  157. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/redis.py +0 -0
  158. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/tests/__init__.py +0 -0
  159. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/jsorc/tests/test_jsorc.py +0 -0
  160. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/__init__.py +0 -0
  161. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/architype.py +0 -0
  162. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/element.py +0 -0
  163. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/graph.py +0 -0
  164. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/master.py +0 -0
  165. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/obj_mixins.py +0 -0
  166. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/super_master.py +0 -0
  167. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/prim/walker.py +0 -0
  168. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/svc/__init__.py +0 -0
  169. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/tests/__init__.py +0 -0
  170. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/tests/infer.py +0 -0
  171. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/tests/jac_test_progs.py +0 -0
  172. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/tests/test_core.py +0 -0
  173. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/tests/test_jac.py +0 -0
  174. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/tests/test_node.py +0 -0
  175. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/tests/test_progs.py +0 -0
  176. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/tests/test_stack.py +0 -0
  177. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/__init__.py +0 -0
  178. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/actions/__init__.py +0 -0
  179. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/actions/actions_manager.py +0 -0
  180. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/actions/actions_optimizer.py +0 -0
  181. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/actions/actions_state.py +0 -0
  182. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/file_handler.py +0 -0
  183. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/gprof2dot.py +0 -0
  184. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/json_handler.py +0 -0
  185. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/log_utils.py +0 -0
  186. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/test_core.py +0 -0
  187. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci/utils/utils.py +0 -0
  188. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci.egg-info/SOURCES.txt +0 -0
  189. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci.egg-info/dependency_links.txt +0 -0
  190. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci.egg-info/entry_points.txt +0 -0
  191. {jaseci-1.4.1.8 → jaseci-1.4.2}/jaseci.egg-info/top_level.txt +0 -0
  192. {jaseci-1.4.1.8 → jaseci-1.4.2}/setup.cfg +0 -0
jaseci-1.4.2/PKG-INFO ADDED
@@ -0,0 +1,35 @@
1
+ Metadata-Version: 2.1
2
+ Name: jaseci
3
+ Version: 1.4.2
4
+ Home-page: https://github.com/Jaseci-Labs/jaseci
5
+ Author: Jason Mars
6
+ Author-email: jason@jaseci.org
7
+ License-File: LICENSE
8
+ Requires-Dist: click<8.2.0,>=8.1.0
9
+ Requires-Dist: click-shell<2.2,>=2.1
10
+ Requires-Dist: numpy<1.24.0,>=1.23.0
11
+ Requires-Dist: antlr4-python3-runtime<4.10.0,>=4.9.3
12
+ Requires-Dist: fastapi[all]<1.0.0,>=0.75.0
13
+ Requires-Dist: requests
14
+ Requires-Dist: redis
15
+ Requires-Dist: celery<6,>=5
16
+ Requires-Dist: flake8
17
+ Requires-Dist: pep8-naming
18
+ Requires-Dist: stripe
19
+ Requires-Dist: pydantic<2.0.0
20
+ Requires-Dist: docstring-parser
21
+ Requires-Dist: prometheus_api_client==0.5.1
22
+ Requires-Dist: prometheus-client==0.14.1
23
+ Requires-Dist: kubernetes==23.6.0
24
+ Requires-Dist: pytest
25
+ Requires-Dist: pytest-xdist
26
+ Requires-Dist: pytest-cov
27
+ Requires-Dist: validators==0.21.2
28
+ Requires-Dist: psycopg2-binary==2.9.5
29
+ Requires-Dist: pygls
30
+ Requires-Dist: mock
31
+ Requires-Dist: beautifulsoup4<4.13.0,>=4.12.2
32
+ Requires-Dist: lxml<4.10.0,>=4.9.2
33
+ Requires-Dist: html5lib<1.2,>=1.1
34
+ Requires-Dist: prettytable<3.8.0,>=3.7.0
35
+ Requires-Dist: apache-libcloud==3.7.0
@@ -0,0 +1 @@
1
+ 1.4.2
@@ -4,7 +4,7 @@ from jaseci.jsorc.live_actions import jaseci_action
4
4
 
5
5
 
6
6
  @jaseci_action()
7
- def get(url: str, data: dict, header: dict):
7
+ def get(url: str, data: dict = {}, header: dict = {}):
8
8
  """
9
9
  Issue request
10
10
  Param 1 - url
@@ -23,7 +23,7 @@ def get(url: str, data: dict, header: dict):
23
23
 
24
24
 
25
25
  @jaseci_action()
26
- def post(url: str, data: dict, header: dict):
26
+ def post(url: str, data: dict = {}, header: dict = {}):
27
27
  """
28
28
  Issue request
29
29
  Param 1 - url
@@ -42,7 +42,7 @@ def post(url: str, data: dict, header: dict):
42
42
 
43
43
 
44
44
  @jaseci_action()
45
- def put(url: str, data: dict, header: dict):
45
+ def put(url: str, data: dict = {}, header: dict = {}):
46
46
  """
47
47
  Issue request
48
48
  Param 1 - url
@@ -61,7 +61,7 @@ def put(url: str, data: dict, header: dict):
61
61
 
62
62
 
63
63
  @jaseci_action()
64
- def delete(url: str, data: dict, header: dict):
64
+ def delete(url: str, data: dict = {}, header: dict = {}):
65
65
  """
66
66
  Issue request
67
67
  Param 1 - url
@@ -80,7 +80,7 @@ def delete(url: str, data: dict, header: dict):
80
80
 
81
81
 
82
82
  @jaseci_action()
83
- def head(url: str, data: dict, header: dict):
83
+ def head(url: str, data: dict = {}, header: dict = {}):
84
84
  """
85
85
  Issue request
86
86
  Param 1 - url
@@ -99,7 +99,7 @@ def head(url: str, data: dict, header: dict):
99
99
 
100
100
 
101
101
  @jaseci_action()
102
- def options(url: str, data: dict, header: dict):
102
+ def options(url: str, data: dict = {}, header: dict = {}):
103
103
  """
104
104
  Issue request
105
105
  Param 1 - url
@@ -4,7 +4,6 @@ import stripe as s
4
4
  from jaseci.jsorc.jsorc import JsOrc
5
5
  from jaseci.utils.utils import logger
6
6
  from jaseci.extens.svc.stripe_svc import StripeService
7
- from datetime import datetime
8
7
  from jaseci.jsorc.live_actions import jaseci_action
9
8
 
10
9
 
@@ -168,6 +167,15 @@ def invoice_retrieve(invoice_id: str, **kwargs):
168
167
  return stripe().Invoice.retrieve(invoice_id, **kwargs)
169
168
 
170
169
 
170
+ @jaseci_action()
171
+ def subscription_item_list_usage_record_summaries(subscription_item_id: str, **kwargs):
172
+ """Create usage record"""
173
+
174
+ return stripe().SubscriptionItem.list_usage_record_summaries(
175
+ subscription_item_id, **kwargs
176
+ )
177
+
178
+
171
179
  @jaseci_action()
172
180
  def subscription_item_create_usage_record(
173
181
  subscription_item_id: str, quantity: int, **kwargs
@@ -175,7 +183,7 @@ def subscription_item_create_usage_record(
175
183
  """Create usage record"""
176
184
 
177
185
  return stripe().SubscriptionItem.create_usage_record(
178
- subscription_item_id, quantity=quantity, timestamp=datetime.now(), **kwargs
186
+ subscription_item_id, quantity=quantity, timestamp="now", **kwargs
179
187
  )
180
188
 
181
189
 
@@ -5,9 +5,9 @@ from jaseci.extens.svc.task_svc import TaskService
5
5
 
6
6
 
7
7
  @jaseci_action()
8
- def get_result(task_id, wait, meta):
8
+ def get_result(task_id, wait=False, timeout=30):
9
9
  """
10
10
  Get task result by task_id
11
11
  """
12
12
 
13
- return JsOrc.svc("task").poke(TaskService).get_by_task_id(task_id, wait)
13
+ return JsOrc.svc("task").poke(TaskService).get_by_task_id(task_id, wait, timeout)
@@ -17,7 +17,7 @@ def is_valid(url: str = ""):
17
17
  """
18
18
  try:
19
19
  url_response = validators.url(url)
20
- if isinstance(url_response, validators.ValidationFailure):
20
+ if isinstance(url_response, validators.ValidationError):
21
21
  return False
22
22
  except:
23
23
  return False
@@ -42,17 +42,26 @@ class GlobalApi:
42
42
  @Interface.admin_api()
43
43
  def global_sentinel_set(self, snt: Sentinel = None):
44
44
  """
45
- Set sentinel as globally accessible
45
+ Make a sentinel globally accessible and set it as the global sentinel
46
46
  """
47
47
  snt.make_read_only()
48
48
  snt.propagate_access()
49
49
  self._h.save_glob("GLOB_SENTINEL", snt.jid)
50
50
  return {"response": f"Global sentinel set to '{snt}'!"}
51
51
 
52
+ @Interface.admin_api()
53
+ def global_sentinel_set_access(self, snt: Sentinel = None):
54
+ """
55
+ Make a sentinel globally accessible
56
+ """
57
+ snt.make_read_only()
58
+ snt.propagate_access()
59
+ return {"response": f"Sentinel '{snt}' is now globally accessible."}
60
+
52
61
  @Interface.admin_api()
53
62
  def global_sentinel_unset(self):
54
63
  """
55
- Set sentinel as globally accessible
64
+ Unset a global sentinel
56
65
  """
57
66
  current = self.global_get("GLOB_SENTINEL")["value"]
58
67
  if current:
@@ -26,7 +26,7 @@ class UserApi:
26
26
  global_init: str = "",
27
27
  global_init_ctx: dict = {},
28
28
  other_fields: dict = {},
29
- send_email: bool = False,
29
+ send_email: bool = True,
30
30
  ):
31
31
  """
32
32
  Create a new user (master object)
@@ -25,7 +25,8 @@ class WebhookApi:
25
25
 
26
26
  # to be updated
27
27
  stripe_service.get_event(
28
- self._h.get_file_handler(_req_ctx["raw"]), _req_ctx["headers"]
28
+ self._h.get_file_handler(_req_ctx["raw"]).to_bytes(),
29
+ _req_ctx["headers"],
29
30
  )
30
31
 
31
32
  payload_obj = req_body.get("data").get("object")
@@ -69,5 +70,5 @@ class WebhookApi:
69
70
  )
70
71
  else:
71
72
  raise HTTPException(
72
- status_code=400, detail=str(type + " webhook is not yet supported")
73
+ status_code=400, detail=str(provider + " webhook is not yet supported")
73
74
  )
@@ -62,6 +62,7 @@ class ElasticService(JsOrc.CommonService):
62
62
  if cert:
63
63
  with open("elastic-certificate.crt", "w") as cert_file:
64
64
  cert_file.write(cert)
65
+ self.config["verifier"] = "elastic-certificate.crt"
65
66
 
66
67
  if not self.config.get("auth"):
67
68
  auth = kube.get_secret(
@@ -80,8 +81,12 @@ class ElasticService(JsOrc.CommonService):
80
81
  under_test = self.config.get("under_test", False)
81
82
  if not under_test:
82
83
  self.configure_elastic()
83
- LOG_QUEUES["core"] = self.add_elastic_log_handler(logger, "core", under_test)
84
- LOG_QUEUES["app"] = self.add_elastic_log_handler(app_logger, "app", under_test)
84
+ LOG_QUEUES["core"] = self.add_elastic_log_handler(
85
+ logger, self.config.get("core_log_index") or "core", under_test
86
+ )
87
+ LOG_QUEUES["app"] = self.add_elastic_log_handler(
88
+ app_logger, self.config.get("app_log_index") or "app", under_test
89
+ )
85
90
 
86
91
  def configure_elastic(self):
87
92
  """
@@ -131,6 +136,21 @@ class ElasticService(JsOrc.CommonService):
131
136
  try:
132
137
  record = log_queue.get()
133
138
  if record is None:
139
+ # This is temporary
140
+ # for debugging purposes
141
+ from datetime import datetime
142
+
143
+ self.app.doc(
144
+ {
145
+ "@timestamp": datetime.now().strftime(
146
+ "%Y-%m-%dT%H:%M:%S"
147
+ ),
148
+ "message": f"Stopping process for {elastic_index}",
149
+ "level": "SYSTEM",
150
+ },
151
+ index=elastic_index,
152
+ )
153
+ # end of temporary code
134
154
  break
135
155
  elastic_record = format_elastic_record(record)
136
156
  self.app.doc(log=elastic_record, index=elastic_index)
@@ -168,12 +188,14 @@ class Elastic:
168
188
  if config["auth"]:
169
189
  self.headers["Authorization"] = config["auth"]
170
190
 
191
+ self.verifier = config.get("verifier")
192
+
171
193
  def _get(self, url: str, json: dict = None):
172
194
  return get(
173
195
  f"{self.url}{url}",
174
196
  json=json,
175
197
  headers=self.headers,
176
- verify="elastic-certificate.crt",
198
+ verify=self.verifier,
177
199
  ).json()
178
200
 
179
201
  def _post(self, url: str, json: dict = None):
@@ -181,7 +203,7 @@ class Elastic:
181
203
  f"{self.url}{url}",
182
204
  json=json,
183
205
  headers=self.headers,
184
- verify="elastic-certificate.crt",
206
+ verify=self.verifier,
185
207
  ).json()
186
208
 
187
209
  def post(self, url: str, body: dict, index: str = "", suffix: str = ""):
@@ -233,7 +255,7 @@ class Elastic:
233
255
  res = get(
234
256
  f"{self.url}/_ilm/policy/{policy_name}",
235
257
  headers=self.headers,
236
- verify="elastic-certificate.crt",
258
+ verify=self.verifier,
237
259
  )
238
260
  if res.status_code == 200 and policy_name in res.json():
239
261
  # policy already exists
@@ -242,7 +264,7 @@ class Elastic:
242
264
  f"{self.url}/_ilm/policy/{policy_name}",
243
265
  headers=self.headers,
244
266
  json=policy_config,
245
- verify="elastic-certificate.crt",
267
+ verify=self.verifier,
246
268
  )
247
269
  if res.status_code == 200:
248
270
  return res.json()
@@ -256,7 +278,7 @@ class Elastic:
256
278
  res = get(
257
279
  f"{self.url}/_index_template/{template_name}",
258
280
  headers=self.headers,
259
- verify="elastic-certificate.crt",
281
+ verify=self.verifier,
260
282
  )
261
283
  if res.status_code == 200 and template_name in res.json():
262
284
  # policy already exists
@@ -265,7 +287,7 @@ class Elastic:
265
287
  f"{self.url}/_index_template/{template_name}",
266
288
  headers=self.headers,
267
289
  json=template_config,
268
- verify="elastic-certificate.crt",
290
+ verify=self.verifier,
269
291
  )
270
292
  if res.status_code == 200:
271
293
  return res.json()
@@ -188,7 +188,6 @@ class ArchitypeInterp(Interp):
188
188
  return obj
189
189
  else:
190
190
  self.rt_error("Graph didn't produce root node!", kid[3])
191
- return None
192
191
 
193
192
  def run_has_root(self, jac_ast):
194
193
  """
@@ -221,8 +221,7 @@ class Interp(VirtualMachine):
221
221
  self._loop_ctrl = None
222
222
  break
223
223
  if loops > self._loop_limit:
224
- self.rt_error("Hit loop limit, breaking...", kid[0])
225
- self._loop_ctrl = "break"
224
+ self.rt_error(f"Hit loop limit [{self._loop_limit}]!", kid[0])
226
225
  self.run_expression(kid[3])
227
226
  elif kid[3].name == "expression":
228
227
  var = self._jac_scope.get_live_var(kid[1].token_text(), create_mode=True)
@@ -240,8 +239,7 @@ class Interp(VirtualMachine):
240
239
  self._loop_ctrl = None
241
240
  break
242
241
  if loops > self._loop_limit:
243
- self.rt_error("Hit loop limit, breaking...", kid[0])
244
- self._loop_ctrl = "break"
242
+ self.rt_error(f"Hit loop limit [{self._loop_limit}]!", kid[0])
245
243
  else:
246
244
  self.rt_error("Not a list/dict for iteration!", kid[3])
247
245
  else:
@@ -269,8 +267,7 @@ class Interp(VirtualMachine):
269
267
  self._loop_ctrl = None
270
268
  break
271
269
  if loops > self._loop_limit:
272
- self.rt_error("Hit loop limit, breaking...", kid[0])
273
- self._loop_ctrl = "break"
270
+ self.rt_error(f"Hit loop limit [{self._loop_limit}]!", kid[0])
274
271
  else:
275
272
  self.rt_error("Not a list/dict for iteration!", kid[5])
276
273
  if self._loop_ctrl and self._loop_ctrl == "continue":
@@ -291,8 +288,7 @@ class Interp(VirtualMachine):
291
288
  self._loop_ctrl = None
292
289
  break
293
290
  if loops > self._loop_limit:
294
- self.rt_error("Hit loop limit, breaking...", kid[0])
295
- self._loop_ctrl = "break"
291
+ self.rt_error(f"Hit loop limit [{self._loop_limit}]!", kid[0])
296
292
  self.run_expression(kid[1])
297
293
  if self._loop_ctrl and self._loop_ctrl == "continue":
298
294
  self._loop_ctrl = None
@@ -625,17 +621,11 @@ class Interp(VirtualMachine):
625
621
  # Add additional accessible fields
626
622
  return JacValue(self, value=self.get_info())
627
623
  else:
628
- self.rt_error(f"Global {kid[0].name} not yet", jac_ast)
629
- return JacValue(
630
- self,
631
- )
624
+ self.rt_error(f"Global {kid[0].name} is not supported!", jac_ast)
632
625
  else:
633
626
  token = kid[2].token_text()
634
627
  if token not in self.parent().global_vars:
635
628
  self.rt_error(f"Global not defined - {token}", kid[2])
636
- return JacValue(
637
- self,
638
- )
639
629
 
640
630
  return JacValue(self, ctx=self.parent().global_vars, name=token)
641
631
 
@@ -803,7 +793,6 @@ class Interp(VirtualMachine):
803
793
  return self.parent().arch_ids.get_obj_by_name(name=name, kind=kind)
804
794
  else:
805
795
  self.rt_error(f"{name} is not a super arch of {base_arch.name}", kid[1])
806
- return None
807
796
  else:
808
797
  return base_arch
809
798
 
@@ -838,7 +827,6 @@ class Interp(VirtualMachine):
838
827
  return JacValue(self, value=nd)
839
828
 
840
829
  self.rt_error(f"{result.value} not valid reference", kid[1])
841
- return result
842
830
 
843
831
  def run_built_in(self, jac_ast, atom_res):
844
832
  """
@@ -960,7 +948,6 @@ class Interp(VirtualMachine):
960
948
  self.rt_error(
961
949
  f"Cannot get keys of {atom_res}. " f"Not Dictionary!", kid[0]
962
950
  )
963
- return JacValue(self, value=[])
964
951
  elif len(kid) > 1 and kid[1].name == "name_list":
965
952
  filter_on = self.run_name_list(kid[1])
966
953
  d = atom_res.value
@@ -1032,7 +1019,6 @@ class Interp(VirtualMachine):
1032
1019
  self.rt_error(
1033
1020
  f"Cannot get length of {atom_res.value}. Not List!", kid[0]
1034
1021
  )
1035
- return JacValue(self, value=0)
1036
1022
  else:
1037
1023
  if not self.rt_check_type(atom_res.value, [list], kid[0]):
1038
1024
  return atom_res
@@ -1408,7 +1394,6 @@ class Interp(VirtualMachine):
1408
1394
  f"Indicies must be an integer or string!",
1409
1395
  kid[1],
1410
1396
  )
1411
- return atom_res
1412
1397
  try:
1413
1398
  return JacValue(self, ctx=atom_res.value, name=idx)
1414
1399
  except Exception as e:
@@ -1423,7 +1408,6 @@ class Interp(VirtualMachine):
1423
1408
  "List slice range not valid. Indicies must be an integers!",
1424
1409
  kid[1],
1425
1410
  )
1426
- return atom_res
1427
1411
  try:
1428
1412
  return JacValue(self, ctx=atom_res.value, name=idx, end=end)
1429
1413
  except Exception as e:
@@ -1663,7 +1647,6 @@ class Interp(VirtualMachine):
1663
1647
  return self.pop().value
1664
1648
  else:
1665
1649
  self.rt_error(f"{name} not present in object", kid[0])
1666
- return False
1667
1650
 
1668
1651
  def run_any_type(self, jac_ast):
1669
1652
  """
@@ -234,7 +234,6 @@ class SentinelInterp(Interp):
234
234
  graph_name = kid[0].kid[-1].token_text()
235
235
  if not self.arch_ids.has_obj_by_name(graph_name, kind="graph"):
236
236
  self.rt_error(f"Graph {graph_name} not found!", kid[0])
237
- return
238
237
  testcase["graph_ref"] = graph_name
239
238
  else:
240
239
  kid = kid[1:]
@@ -244,7 +243,6 @@ class SentinelInterp(Interp):
244
243
  walker_name = kid[0].kid[-1].token_text()
245
244
  if not self.arch_ids.has_obj_by_name(name=walker_name, kind="walker"):
246
245
  self.rt_error(f"Walker {walker_name} not found!", kid[0])
247
- return
248
246
  testcase["walker_ref"] = walker_name
249
247
  kid = kid[1:]
250
248
  if kid[0].name == "spawn_ctx":
@@ -205,7 +205,6 @@ class WalkerInterp(Interp):
205
205
  result = act.run_action(param_list, self._jac_scope, self, jac_ast)
206
206
  except Exception as e:
207
207
  self.rt_error(e, jac_ast)
208
- result = None
209
208
  if kid[-1].name == "expression":
210
209
  self.run_expression(kid[-1])
211
210
  dest = self.pop()
@@ -164,7 +164,6 @@ class MachineState:
164
164
  self.rt_error(
165
165
  f"Variable not defined - {name}", jac_ast or self._cur_jac_ast
166
166
  )
167
- self.push(JacValue(self))
168
167
  else:
169
168
  self.push(val)
170
169
 
@@ -183,12 +182,10 @@ class MachineState:
183
182
  if dest.check_assignable(jac_ast):
184
183
  if not self.rt_check_type(dest.value, [Node, Edge], jac_ast):
185
184
  self.rt_error("Copy fields only applies to nodes and edges", jac_ast)
186
- self.push(dest)
187
185
  if dest.value.name != src.value.name:
188
186
  self.rt_error(
189
187
  f"Node/edge arch {dest.value} don't match {src.value}!", jac_ast
190
188
  )
191
- self.push(dest)
192
189
  for i in src.value.context.keys():
193
190
  if i in dest.value.context.keys():
194
191
  JacValue(
@@ -304,6 +301,11 @@ class MachineState:
304
301
  error = self.rt_log_str(error, jac_ast)
305
302
  logger.warning(str(error))
306
303
 
304
+ def rt_subtle_error(self, error, jac_ast=None):
305
+ error = self.rt_log_str(error, jac_ast)
306
+ logger.error(str(error))
307
+ self.runtime_errors.append(error)
308
+
307
309
  def rt_error(self, error, jac_ast, append=False):
308
310
  """Prints runtime error to screen"""
309
311
 
@@ -355,7 +357,6 @@ class MachineState:
355
357
  f"expecting {typ}",
356
358
  jac_ast,
357
359
  )
358
- return False
359
360
 
360
361
  def get_info(self):
361
362
  return {
@@ -172,6 +172,8 @@ class JsOrcSettings:
172
172
  "auth": os.getenv("ELASTIC_AUTH"),
173
173
  "common_index": f"{KUBE_NAMESPACE}-common",
174
174
  "activity_index": f"{KUBE_NAMESPACE}-activity",
175
+ "core_log_index": "core",
176
+ "app_log_index": "app",
175
177
  "ilm_policy_name": ELASTIC_ILM_POLICY_NAME,
176
178
  "ilm_policy": ELASTIC_ILM_POLICY,
177
179
  "index_template_name": ELASTIC_INDEX_TEMPLATE_NAME,
@@ -11,6 +11,10 @@ import sys
11
11
  import inspect
12
12
  import importlib
13
13
  import gc
14
+ import re
15
+
16
+ var_args = re.compile(r"^\*[^\*]")
17
+ var_kwargs = re.compile(r"^\*\*[^\*]")
14
18
 
15
19
  live_actions = {} # {"act.func": func_obj, ...}
16
20
  live_action_modules = {} # {__module__: ["act.func1", "act.func2", ...], ...}
@@ -305,14 +309,32 @@ def gen_remote_func_hook(url, act_name, param_names):
305
309
 
306
310
  def func(*args, **kwargs):
307
311
  params = {}
308
- for i in range(len(param_names)):
309
- if i < len(args):
310
- params[param_names[i]] = args[i]
312
+ _args = list(args)
313
+ _param_names: list = param_names.copy()
314
+
315
+ args_len = len(args)
316
+ for idx, name in enumerate(param_names):
317
+ if idx >= args_len or not _args:
318
+ break
319
+ _param_names.remove(name)
320
+ if var_args.match(name):
321
+ if _args:
322
+ params[name] = _args
323
+ break
311
324
  else:
312
- params[param_names[i]] = None
313
- for i in kwargs.keys():
314
- if i in param_names:
315
- params[i] = kwargs[i]
325
+ params[name] = _args.pop(0)
326
+
327
+ for name in _param_names:
328
+ if var_args.match(name):
329
+ if _args:
330
+ params[name] = _args
331
+ elif var_kwargs.match(name):
332
+ if kwargs:
333
+ params[name] = kwargs
334
+ break
335
+ elif name in kwargs:
336
+ params[name] = kwargs.pop(name)
337
+
316
338
  # Remove any None-valued parameters to use the default value of the action def
317
339
  params = dict([(k, v) for k, v in params.items() if v is not None])
318
340
  act_url = f"{url.rstrip('/')}/{act_name.split('.')[-1]}"
@@ -9,7 +9,12 @@ from time import time
9
9
  import inspect
10
10
  import uvicorn
11
11
  import os
12
+ import re
12
13
 
14
+ var_args = re.compile(r"^\*[^\*]")
15
+ var_kwargs = re.compile(r"^\*\*[^\*]")
16
+
17
+ args_kwargs = (2, 4)
13
18
  remote_actions = {}
14
19
  registered_apis = []
15
20
  registered_endpoints = []
@@ -51,12 +56,15 @@ def serv_actions():
51
56
  def gen_api_service(app, func, act_group, aliases, caller_globals):
52
57
  """Helper for jaseci_action decorator"""
53
58
  # Construct list of action apis available
54
- varnames = list(inspect.signature(func).parameters.keys())
55
59
  act_group = (
56
60
  [os.path.basename(inspect.getfile(func)).split(".")[0]]
57
61
  if act_group is None
58
62
  else act_group
59
63
  )
64
+ varnames = []
65
+ for param in inspect.signature(func).parameters.values():
66
+ varnames.append(str(param) if param.kind in args_kwargs else param.name)
67
+
60
68
  remote_actions[f"{'.'.join(act_group+[func.__name__])}"] = varnames
61
69
 
62
70
  # Need to get pydatic model for func signature for fastAPI post
@@ -64,19 +72,62 @@ def gen_api_service(app, func, act_group, aliases, caller_globals):
64
72
 
65
73
  # Keep only fields present in param list in base model
66
74
  keep_fields = {}
67
- for i in model.__fields__.keys():
68
- if i in varnames:
69
- keep_fields[i] = model.__fields__[i]
75
+ for name in varnames:
76
+ if var_args.match(name):
77
+ keep_fields[name] = model.__fields__[name[1:]]
78
+ keep_fields[name].name = name
79
+ keep_fields[name].alias = name
80
+ elif var_kwargs.match(name):
81
+ keep_fields[name] = model.__fields__[name[2:]]
82
+ keep_fields[name].name = name
83
+ keep_fields[name].alias = name
84
+ else:
85
+ field = model.__fields__.get(name)
86
+ if field:
87
+ keep_fields[name] = field
70
88
  model.__fields__ = keep_fields
71
89
 
72
90
  # Create duplicate funtion for api endpoint and inject in call site globals
73
91
  @app.post(f"/{func.__name__}/")
74
92
  def new_func(params: model = model.construct()):
75
- pl_peek = str(dict(params.__dict__))[:128]
93
+ params: dict = params.__dict__
94
+ pl_peek = str(params)[:128]
76
95
  logger.info(str(f"Incoming call to {func.__name__} with {pl_peek}"))
77
96
  start_time = time()
78
97
 
79
- ret = validate_arguments(func)(**(params.__dict__))
98
+ args = []
99
+ kwargs = {}
100
+ fp1 = inspect.signature(func).parameters.values()
101
+ fp2 = list(fp1)
102
+
103
+ # try to process args
104
+ for param in fp1:
105
+ _param = str(param) if param.kind in args_kwargs else param.name
106
+ if _param in params:
107
+ fp2.remove(param)
108
+ if var_args.match(_param):
109
+ for arg in params.get(_param) or []:
110
+ args.append(arg)
111
+ break
112
+ elif var_kwargs.match(_param):
113
+ kwargs.update(params.get(_param) or {})
114
+ break
115
+ args.append(params.get(_param))
116
+ else:
117
+ break
118
+
119
+ # try to process kwargs
120
+ for param in fp2:
121
+ param = str(param) if param.kind in args_kwargs else param.name
122
+ if param in params:
123
+ if var_kwargs.match(param):
124
+ kwargs.update(params.get(param) or {})
125
+ break
126
+ kwargs[param] = params.get(param)
127
+ else:
128
+ break
129
+
130
+ ret = validate_arguments(func)(*args, **kwargs)
80
131
  tot_time = time() - start_time
81
132
  logger.info(
82
133
  str(