omnata-plugin-devkit 0.3.30__tar.gz → 0.3.32__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 (48) hide show
  1. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/PKG-INFO +1 -1
  2. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/pyproject.toml +1 -1
  3. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/development_session.py +5 -1
  4. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/plugin_uploader.py +3 -0
  5. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/test_step_definitions.py +35 -9
  6. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/LICENSE +0 -0
  7. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/README.md +0 -0
  8. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/__init__.py +0 -0
  9. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/airbyte_wrapper.py +0 -0
  10. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/cli/__init__.py +0 -0
  11. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/initialiser.py +0 -0
  12. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/API_LIMITS.sql.jinja +0 -0
  13. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CONFIGURATION_FORM.sql.jinja +0 -0
  14. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CONFIGURE_APIS.sql.jinja +0 -0
  15. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CONNECTION_FORM.sql.jinja +0 -0
  16. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CONNECTION_TEST.sql.jinja +0 -0
  17. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CONSTRUCT_FORM_OPTION.sql.jinja +0 -0
  18. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CREATE_BILLING_EVENTS.sql.jinja +0 -0
  19. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CREATE_GENERIC_SECRET_OBJECT.sql.jinja +0 -0
  20. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CREATE_GENERIC_SECRET_OBJECT_FROM_EXISTING.sql.jinja +0 -0
  21. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CREATE_NETWORK_RULE_OBJECT.sql.jinja +0 -0
  22. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CREATE_NETWORK_RULE_OBJECT_FROM_EXISTING.sql.jinja +0 -0
  23. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/CREATE_OAUTH_SECRET_OBJECT.sql.jinja +0 -0
  24. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/INBOUND_LIST_STREAMS.sql.jinja +0 -0
  25. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/NETWORK_ADDRESSES.sql.jinja +0 -0
  26. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/NGROK_POST_TUNNEL_FIELDS.sql.jinja +0 -0
  27. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/OUTBOUND_RECORD_VALIDATOR.sql.jinja +0 -0
  28. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/PENDING_API_CONFIGURATION.sql.jinja +0 -0
  29. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/POST_INSTALL_ACTIONS.sql.jinja +0 -0
  30. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/RETRIEVE_NETWORK_RULE_OBJECT.sql.jinja +0 -0
  31. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/RETRIEVE_SECRETS.sql.jinja +0 -0
  32. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/RETRIEVE_SECRETS_UDF.sql.jinja +0 -0
  33. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/SYNC.sql.jinja +0 -0
  34. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/TEST_CALLBACK.sql.jinja +0 -0
  35. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/TEST_OAUTH_TOKEN_EXISTS.sql.jinja +0 -0
  36. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/TUNNEL_TEST.sql.jinja +0 -0
  37. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/UPDATE_API_CONFIGURATION.sql.jinja +0 -0
  38. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/UPDATE_GENERIC_SECRET_OBJECT.sql.jinja +0 -0
  39. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/UPDATE_GENERIC_SECRET_OBJECT_OLD.sql.jinja +0 -0
  40. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/UPDATE_NETWORK_RULE_OBJECT.sql.jinja +0 -0
  41. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/jinja_templates/manifest.yml.jinja +0 -0
  42. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/native_app_packaging.py +0 -0
  43. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/plugin_registration.py +0 -0
  44. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/plugin_template/icon.svg +0 -0
  45. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/plugin_template/plugin.py +0 -0
  46. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/plugin_template/plugin_development.ipynb +0 -0
  47. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/plugin_template/requirements.txt +0 -0
  48. {omnata_plugin_devkit-0.3.30 → omnata_plugin_devkit-0.3.32}/src/omnata_plugin_devkit/streamlit/plugin_configuration.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omnata-plugin-devkit
3
- Version: 0.3.30
3
+ Version: 0.3.32
4
4
  Summary:
5
5
  Author: James Weakley
6
6
  Author-email: james.weakley@omnata.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "omnata-plugin-devkit"
3
- version = "0.3.30"
3
+ version = "0.3.32"
4
4
  description = ""
5
5
  authors = ["James Weakley <james.weakley@omnata.com>"]
6
6
  readme = "README.md"
@@ -464,6 +464,9 @@ class DevelopmentSession:
464
464
  self._stop_recording()
465
465
  if apply_results:
466
466
  self.current_scenario.sync_request.apply_results_queue()
467
+ if self.current_scenario.sync_request.__class__.__name__ == "InboundSyncRequest":
468
+ print(f'States at completion: {self.current_scenario.sync_request._latest_states}')
469
+ self.current_scenario.sync_request.apply_progress_updates(ignore_errors=False)
467
470
  session_run_response = self.session.sql(
468
471
  f"""
469
472
  call {self.omnata_app_name}.API.COMPLETE_DEVELOPMENT_SESSION_RUN({self.run_id},{apply_results})
@@ -843,7 +846,8 @@ class DevelopmentSession:
843
846
  if recorded_scenario.results[stream_name] is None:
844
847
  raise ValueError(f"Recorded results for scenario {recorded_scenario.scenario_name} were None")
845
848
  results = pandas.concat(recorded_scenario.results[stream_name])
846
- results["RECORD_DATA"] = results["RECORD_DATA"].apply(json.dumps)
849
+ # no need to do this anymore, as the results are already json
850
+ #results["RECORD_DATA"] = results["RECORD_DATA"].apply(json.dumps)
847
851
  results["RECORD_DATA"] = results["RECORD_DATA"].replace("|", "\\|")
848
852
  results.loc[
849
853
  results["RECORD_DATA"] == '"null"', "RECORD_DATA"
@@ -649,6 +649,7 @@ $${}$$;
649
649
  remaining_udf_arg_types.extend([a.arg_data_type for a in udf_def.function_arguments[1:]])
650
650
  all_udf_args = initial_udf_arg + remaining_udf_args
651
651
  all_udf_arg_types = initial_udf_arg_type + remaining_udf_arg_types
652
+ original_udf_arg_types = ["object"] + remaining_udf_arg_types
652
653
  wrapper_udf = f"create or replace function {udf_def.function_name}({','.join(all_udf_args)})\n"
653
654
  # The wrappers are structured differently depending on whether the UDF returns a table or not
654
655
  if udf_def.returns_table:
@@ -668,6 +669,8 @@ $$;
668
669
  setup_script.write(wrapper_udf + "\n")
669
670
  # we're granting visibility only to the wrapper function, not the original udf
670
671
  setup_script.write(f"grant usage on function {udf_def.function_name}({','.join(all_udf_arg_types)}) to application role CONSUMER_FUNCTION_CALLER;\n")
672
+ # actually, temporarily we need to grant visibility to the original udf, due to a Snowflake bug
673
+ setup_script.write(f"grant usage on function {udf_def.function_name}({','.join(original_udf_arg_types)}) to application role CONSUMER_FUNCTION_CALLER;\n")
671
674
 
672
675
  # in rare cases, the plugin author might want to do something of their own in the setup script
673
676
  # so we allow them to create a file called setup_script.sql and we'll append it to the end of the script
@@ -329,7 +329,7 @@ def step_impl_response_inbound(context, stream_name):
329
329
  f"Stream {stream_name} not found in sync_inbound_result. Keys: {list(context.sync_inbound_result.keys())}"
330
330
  )
331
331
 
332
- sync_inbound_result_for_stream = (
332
+ sync_inbound_result_for_stream:pandas.DataFrame = (
333
333
  pandas.concat(context.sync_inbound_result[stream_name])
334
334
  .sort_values(by=["APP_IDENTIFIER"])
335
335
  .sort_index(axis=1)
@@ -343,9 +343,9 @@ def step_impl_response_inbound(context, stream_name):
343
343
  sync_inbound_result_for_stream = sync_inbound_result_for_stream.sort_values(by=["APP_IDENTIFIER"]).sort_index(axis=1).reset_index(drop=True)
344
344
  # because behave tables work best with a string representation of json, we'll convert the results objects to string
345
345
  # expected_result['RESULT'] = expected_result['RESULT'].apply(json.dumps)
346
- sync_inbound_result_for_stream["RECORD_DATA"] = sync_inbound_result_for_stream[
347
- "RECORD_DATA"
348
- ].apply(json.dumps)
346
+ #sync_inbound_result_for_stream["RECORD_DATA"] = sync_inbound_result_for_stream[
347
+ # "RECORD_DATA"
348
+ #].apply(json.dumps)
349
349
 
350
350
  # exclude RETRIEVE_DATE column from both dataframes, naturally they will differ
351
351
  expected_result = expected_result.drop(columns=["RETRIEVE_DATE"])
@@ -357,19 +357,45 @@ def step_impl_response_inbound(context, stream_name):
357
357
  # in order to not break existing tests, if the actual result contains the IS_DELETED column but the expected result doesn't, we'll remove it from the actual result
358
358
  if "IS_DELETED" in sync_inbound_result_for_stream.columns and "IS_DELETED" not in expected_result.columns:
359
359
  sync_inbound_result_for_stream = sync_inbound_result_for_stream.drop(columns=["IS_DELETED"])
360
+
361
+ #expected_result = expected_result.sort_index(axis=1)
362
+ #sync_inbound_result_for_stream = sync_inbound_result_for_stream.sort_index(axis=1)
363
+ logger.info("Setting index of expected_result to APP_IDENTIFIER")
364
+ expected_result.set_index("APP_IDENTIFIER", inplace=True, drop=False)
365
+ logger.info("Sorting index of expected result")
366
+ expected_result = expected_result.sort_index()
367
+ logger.info("Setting index of sync_inbound_result to APP_IDENTIFIER")
368
+ sync_inbound_result_for_stream.set_index("APP_IDENTIFIER", inplace=True, drop=False)
369
+ logger.info("Sorting index of sync_inbound_result")
370
+ sync_inbound_result_for_stream = sync_inbound_result_for_stream.sort_index()
371
+ logger.info(f"expected_result dtypes:\n{expected_result.dtypes}")
372
+ logger.info(f"sync_inbound_result dtypes:\n{sync_inbound_result_for_stream.dtypes}")
373
+ #logger.info("Checking for duplicates in expected_result")
374
+ #duplicates = expected_result[expected_result.duplicated(['APP_IDENTIFIER'], keep="first")]['APP_IDENTIFIER'].unique().tolist()
375
+ #case.assertEqual(
376
+ # len(duplicates),0, f"Duplicate APP_IDENTIFIER in expected_result:\n{duplicates.tolist()}"
377
+ #)
378
+ #logger.info("Checking for duplicates in sync_inbound_result")
379
+ #duplicates = sync_inbound_result_for_stream[sync_inbound_result_for_stream.duplicated(['APP_IDENTIFIER'], keep="first")]['APP_IDENTIFIER'].unique().tolist()
380
+ #case.assertFalse(
381
+ # len(duplicates),0, f"Duplicate APP_IDENTIFIER in sync_inbound_result:\n{duplicates.tolist()}"
382
+ #)
383
+ # remove duplicates from expected_result and sync_inbound_result
384
+ expected_result.drop_duplicates(subset=['APP_IDENTIFIER'], keep="first", inplace=True)
385
+ sync_inbound_result_for_stream.drop_duplicates(subset=['APP_IDENTIFIER'], keep="first", inplace=True)
386
+ logger.info("Resetting index of expected_result to match sync_inbound_result")
387
+ expected_result = expected_result.reindex_like(sync_inbound_result_for_stream)
360
388
  assert list(expected_result.columns) == list(
361
389
  sync_inbound_result_for_stream.columns
362
390
  ), f"Column headings didn't match. Expected: {expected_result.columns}, actual: {sync_inbound_result_for_stream.columns}"
363
391
  pandas.set_option("display.max_columns", 10)
364
392
  pandas.set_option("display.width", 150)
365
- logger.info(f"expected_result: {expected_result}")
366
- logger.info(f"expected_result dtypes: {expected_result.dtypes}")
367
- logger.info(f"sync_inbound_result: {sync_inbound_result_for_stream}")
368
- logger.info(f"sync_inbound_result dtypes: {sync_inbound_result_for_stream.dtypes}")
369
- logger.info(f"differences: {expected_result.compare(sync_inbound_result_for_stream)}")
393
+ logger.info(f"expected_result:\n{expected_result}")
394
+ logger.info(f"sync_inbound_result:\n{sync_inbound_result_for_stream}")
370
395
  case.assertCountEqual(
371
396
  expected_result.columns.to_list(), sync_inbound_result_for_stream.columns.to_list()
372
397
  )
398
+ logger.info(f"differences:\n{expected_result.compare(sync_inbound_result_for_stream)}")
373
399
  assert_frame_equal(expected_result, sync_inbound_result_for_stream)
374
400
 
375
401