appmap 2.2.0__tar.gz → 3.0.0__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 (193) hide show
  1. {appmap-2.2.0 → appmap-3.0.0}/PKG-INFO +1 -1
  2. {appmap-2.2.0 → appmap-3.0.0}/_appmap/event.py +5 -4
  3. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/expected.appmap.json +9 -9
  4. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/expected/pytest-numpy1-no-test-cases.appmap.json +4 -4
  5. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/expected/pytest-numpy1.appmap.json +4 -4
  6. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/expected/pytest-numpy2-no-test-cases.appmap.json +4 -4
  7. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/expected/pytest-numpy2.appmap.json +4 -4
  8. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/expected/pytest.appmap.json +11 -9
  9. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/expected/unittest-no-test-cases.appmap.json +5 -5
  10. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/expected/unittest.appmap.json +11 -9
  11. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_events.py +3 -3
  12. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_http.py +2 -2
  13. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_labels.py +17 -0
  14. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_params.py +4 -4
  15. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/web_framework.py +8 -8
  16. {appmap-2.2.0 → appmap-3.0.0}/pyproject.toml +1 -1
  17. {appmap-2.2.0 → appmap-3.0.0}/.gitignore +0 -0
  18. {appmap-2.2.0 → appmap-3.0.0}/LICENSE +0 -0
  19. {appmap-2.2.0 → appmap-3.0.0}/README.md +0 -0
  20. {appmap-2.2.0 → appmap-3.0.0}/_appmap/__init__.py +0 -0
  21. {appmap-2.2.0 → appmap-3.0.0}/_appmap/configuration.py +0 -0
  22. {appmap-2.2.0 → appmap-3.0.0}/_appmap/django.py +0 -0
  23. {appmap-2.2.0 → appmap-3.0.0}/_appmap/env.py +0 -0
  24. {appmap-2.2.0 → appmap-3.0.0}/_appmap/fastapi.py +0 -0
  25. {appmap-2.2.0 → appmap-3.0.0}/_appmap/flask.py +0 -0
  26. {appmap-2.2.0 → appmap-3.0.0}/_appmap/generation.py +0 -0
  27. {appmap-2.2.0 → appmap-3.0.0}/_appmap/importer.py +0 -0
  28. {appmap-2.2.0 → appmap-3.0.0}/_appmap/instrument.py +0 -0
  29. {appmap-2.2.0 → appmap-3.0.0}/_appmap/labels.py +0 -0
  30. {appmap-2.2.0 → appmap-3.0.0}/_appmap/metadata.py +0 -0
  31. {appmap-2.2.0 → appmap-3.0.0}/_appmap/noappmap.py +0 -0
  32. {appmap-2.2.0 → appmap-3.0.0}/_appmap/py_version_check.py +0 -0
  33. {appmap-2.2.0 → appmap-3.0.0}/_appmap/recorder.py +0 -0
  34. {appmap-2.2.0 → appmap-3.0.0}/_appmap/recording.py +0 -0
  35. {appmap-2.2.0 → appmap-3.0.0}/_appmap/remote_recording.py +0 -0
  36. {appmap-2.2.0 → appmap-3.0.0}/_appmap/singleton.py +0 -0
  37. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/__init__.py +0 -0
  38. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/appmap_test_base.py +0 -0
  39. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/bin/server_runner +0 -0
  40. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/conftest.py +0 -0
  41. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap-all-paths-malformed.yml +0 -0
  42. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap-broken.yml +0 -0
  43. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap-class.yml +0 -0
  44. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap-empty-path.yml +0 -0
  45. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap-exclude-fn.yml +0 -0
  46. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap-func.yml +0 -0
  47. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap-malformed-path.yml +0 -0
  48. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap-no-pyyaml.yml +0 -0
  49. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap.yml +0 -0
  50. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap_testing/__init__.py +0 -0
  51. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/appmap_testing/django_simplelazyobject.py +0 -0
  52. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config/src/package/__init__.py +0 -0
  53. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config/test/__init__.py +0 -0
  54. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config/test/foo.py +0 -0
  55. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config-exclude/.hide/hidden_mod/__init__.py +0 -0
  56. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config-exclude/node_modules/node_mod/__init__.py +0 -0
  57. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config-exclude/src/package/__init__.py +0 -0
  58. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config-exclude/test/__init__.py +0 -0
  59. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config-exclude/venv/venv_mod/__init__.py +0 -0
  60. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config-up/appmap.yml +0 -0
  61. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config-up/project/p1/__init__.py +0 -0
  62. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/config-up/project/p2/sub1/__init__.py +0 -0
  63. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/appmap.yml +0 -0
  64. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/djangoapp/__init__.py +0 -0
  65. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/djangoapp/djangoapp.py +0 -0
  66. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/djangoapp/hello_world.html +0 -0
  67. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/djangoapp/middleware.py +0 -0
  68. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/djangoapp/settings.py +0 -0
  69. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/djangoapp/settings_dev.py +0 -0
  70. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/djangoapp/urls.py +0 -0
  71. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/init/sitecustomize.py +0 -0
  72. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/manage.py +0 -0
  73. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/pytest.ini +0 -0
  74. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/test/__init__.py +0 -0
  75. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/test/test_app.py +0 -0
  76. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/test/test_request.py +0 -0
  77. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/django/test/test_unittest_setup.py +0 -0
  78. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/example_class.py +0 -0
  79. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/fastapi/appmap.yml +0 -0
  80. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/fastapi/fastapiapp/__init__.py +0 -0
  81. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/fastapi/fastapiapp/main.py +0 -0
  82. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/fastapi/init/sitecustomize.py +0 -0
  83. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/fastapi/test_app.py +0 -0
  84. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/flask/appmap.yml +0 -0
  85. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/flask/flaskapp.py +0 -0
  86. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/flask/init/sitecustomize.py +0 -0
  87. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/flask/templates/test.html +0 -0
  88. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/flask/test_app.py +0 -0
  89. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/flask-instrumented/appmap.yml +0 -0
  90. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/flask-instrumented/flaskapp.py +0 -0
  91. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/flask-instrumented/init/sitecustomize.py +0 -0
  92. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/flask-instrumented/test_app.py +0 -0
  93. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/package1/__init__.py +0 -0
  94. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/package1/package2/__init__.py +0 -0
  95. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/package1/package2/__main__.py +0 -0
  96. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/package1/package2/mod1.py +0 -0
  97. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/params.py +0 -0
  98. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/properties_class.py +0 -0
  99. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/appmap-no-test-cases.yml +0 -0
  100. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/appmap.yml +0 -0
  101. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/expected/status_errored.metadata.json +0 -0
  102. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/expected/status_failed.metadata.json +0 -0
  103. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/expected/status_xfailed.metadata.json +0 -0
  104. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/expected/status_xsucceeded.metadata.json +0 -0
  105. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/simple.py +0 -0
  106. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/tests/__init__.py +0 -0
  107. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/tests/test_noappmap.py +0 -0
  108. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest/tests/test_simple.py +0 -0
  109. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest-instrumented/appmap.yml +0 -0
  110. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest-instrumented/init/sitecustomize.py +0 -0
  111. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/pytest-instrumented/test_instrumented.py +0 -0
  112. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/remote.appmap.json +0 -0
  113. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/trial/.gitignore +0 -0
  114. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/trial/appmap-no-test-cases.yml +0 -0
  115. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/trial/appmap.yml +0 -0
  116. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/trial/expected/pytest-no-test-cases.appmap.json +0 -0
  117. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/trial/expected/pytest.appmap.json +0 -0
  118. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/trial/init/sitecustomize.py +0 -0
  119. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/trial/test/__init__.py +0 -0
  120. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/trial/test/test_deferred.py +0 -0
  121. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/appmap-no-test-cases.yml +0 -0
  122. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/appmap.yml +0 -0
  123. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/expected/status_errored.metadata.json +0 -0
  124. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/expected/status_failed.metadata.json +0 -0
  125. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/expected/status_xfailed.metadata.json +0 -0
  126. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/expected/status_xsucceeded.metadata.json +0 -0
  127. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/init/sitecustomize.py +0 -0
  128. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/simple/__init__.py +0 -0
  129. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/simple/test_noappmap.py +0 -0
  130. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/data/unittest/simple/test_simple.py +0 -0
  131. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/helpers.py +0 -0
  132. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/normalize.py +0 -0
  133. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_command.py +0 -0
  134. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_configuration.py +0 -0
  135. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_describe_value.py +0 -0
  136. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_django.py +0 -0
  137. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_django_simplelazyobject.py +0 -0
  138. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_env.py +0 -0
  139. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_fastapi.py +0 -0
  140. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_flask.py +0 -0
  141. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_generation.py +0 -0
  142. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_importer.py +0 -0
  143. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_metadata.py +0 -0
  144. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_properties.py +0 -0
  145. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_recording.py +0 -0
  146. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_runner.py +0 -0
  147. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_sqlalchemy.py +0 -0
  148. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_test_frameworks.py +0 -0
  149. {appmap-2.2.0 → appmap-3.0.0}/_appmap/test/test_util.py +0 -0
  150. {appmap-2.2.0 → appmap-3.0.0}/_appmap/testing_framework.py +0 -0
  151. {appmap-2.2.0 → appmap-3.0.0}/_appmap/trace_logger.py +0 -0
  152. {appmap-2.2.0 → appmap-3.0.0}/_appmap/unittest.py +0 -0
  153. {appmap-2.2.0 → appmap-3.0.0}/_appmap/utils.py +0 -0
  154. {appmap-2.2.0 → appmap-3.0.0}/_appmap/web_framework.py +0 -0
  155. {appmap-2.2.0 → appmap-3.0.0}/_appmap/wrapt/LICENSE +0 -0
  156. {appmap-2.2.0 → appmap-3.0.0}/_appmap/wrapt/__init__.py +0 -0
  157. {appmap-2.2.0 → appmap-3.0.0}/_appmap/wrapt/arguments.py +0 -0
  158. {appmap-2.2.0 → appmap-3.0.0}/_appmap/wrapt/decorators.py +0 -0
  159. {appmap-2.2.0 → appmap-3.0.0}/_appmap/wrapt/importer.py +0 -0
  160. {appmap-2.2.0 → appmap-3.0.0}/_appmap/wrapt/wrappers.py +0 -0
  161. {appmap-2.2.0 → appmap-3.0.0}/appmap/__init__.py +0 -0
  162. {appmap-2.2.0 → appmap-3.0.0}/appmap/command/__init__.py +0 -0
  163. {appmap-2.2.0 → appmap-3.0.0}/appmap/command/appmap_agent_init.py +0 -0
  164. {appmap-2.2.0 → appmap-3.0.0}/appmap/command/appmap_agent_status.py +0 -0
  165. {appmap-2.2.0 → appmap-3.0.0}/appmap/command/appmap_agent_validate.py +0 -0
  166. {appmap-2.2.0 → appmap-3.0.0}/appmap/command/runner.py +0 -0
  167. {appmap-2.2.0 → appmap-3.0.0}/appmap/django.py +0 -0
  168. {appmap-2.2.0 → appmap-3.0.0}/appmap/fastapi.py +0 -0
  169. {appmap-2.2.0 → appmap-3.0.0}/appmap/flask.py +0 -0
  170. {appmap-2.2.0 → appmap-3.0.0}/appmap/http.py +0 -0
  171. {appmap-2.2.0 → appmap-3.0.0}/appmap/labeling/__init__.py +0 -0
  172. {appmap-2.2.0 → appmap-3.0.0}/appmap/labeling/crypto.yml +0 -0
  173. {appmap-2.2.0 → appmap-3.0.0}/appmap/labeling/django.yml +0 -0
  174. {appmap-2.2.0 → appmap-3.0.0}/appmap/labeling/flask.yml +0 -0
  175. {appmap-2.2.0 → appmap-3.0.0}/appmap/labeling/formats.yml +0 -0
  176. {appmap-2.2.0 → appmap-3.0.0}/appmap/labeling/http.yml +0 -0
  177. {appmap-2.2.0 → appmap-3.0.0}/appmap/labeling/jobs.yml +0 -0
  178. {appmap-2.2.0 → appmap-3.0.0}/appmap/labeling/jwt.yml +0 -0
  179. {appmap-2.2.0 → appmap-3.0.0}/appmap/labeling/logger.yml +0 -0
  180. {appmap-2.2.0 → appmap-3.0.0}/appmap/labeling/random.yml +0 -0
  181. {appmap-2.2.0 → appmap-3.0.0}/appmap/pytest.py +0 -0
  182. {appmap-2.2.0 → appmap-3.0.0}/appmap/sqlalchemy.py +0 -0
  183. {appmap-2.2.0 → appmap-3.0.0}/appmap/unittest.py +0 -0
  184. {appmap-2.2.0 → appmap-3.0.0}/appmap/uvicorn.py +0 -0
  185. {appmap-2.2.0 → appmap-3.0.0}/appmap.pth +0 -0
  186. {appmap-2.2.0 → appmap-3.0.0}/vendor/_appmap/wrapt/LICENSE +0 -0
  187. {appmap-2.2.0 → appmap-3.0.0}/vendor/_appmap/wrapt/__init__.py +0 -0
  188. {appmap-2.2.0 → appmap-3.0.0}/vendor/_appmap/wrapt/arguments.py +0 -0
  189. {appmap-2.2.0 → appmap-3.0.0}/vendor/_appmap/wrapt/decorators.py +0 -0
  190. {appmap-2.2.0 → appmap-3.0.0}/vendor/_appmap/wrapt/importer.py +0 -0
  191. {appmap-2.2.0 → appmap-3.0.0}/vendor/_appmap/wrapt/wrappers.py +0 -0
  192. {appmap-2.2.0 → appmap-3.0.0}/vendor/patches/wrapt.patch +0 -0
  193. {appmap-2.2.0 → appmap-3.0.0}/vendor/vendor.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: appmap
3
- Version: 2.2.0
3
+ Version: 3.0.0
4
4
  Summary: Create AppMap files by recording a Python application.
5
5
  Project-URL: Homepage, https://github.com/applandinc/appmap-python
6
6
  Author-email: Alan Potter <alan@app.land>, Viraj Kanwade <viraj.kanwade@forgeahead.io>, Rafał Rzepecki <rafal@app.land>
@@ -47,13 +47,14 @@ class _EventIds:
47
47
 
48
48
  def display_string(val, display_value=False):
49
49
  # If we're asked to display parameters, make a best-effort attempt
50
- # to get a string value for the parameter using repr(). If parameter
51
- # display is disabled, or repr() has raised, just formulate a value
52
- # from the class and id.
50
+ # to get a string value for the parameter. str types are returned as-is;
51
+ # other types use repr(). If parameter display is disabled, or repr() has
52
+ # raised, just formulate a value from the class and id.
53
53
  value = None
54
54
  if display_value:
55
55
  try:
56
- value = repr(val)
56
+ # Use issubclass(type()) instead of isinstance() to avoid side effects on lazy objects
57
+ value = val if issubclass(type(val), str) else repr(val)
57
58
  except Exception: # pylint: disable=broad-except
58
59
  pass
59
60
 
@@ -23,7 +23,7 @@
23
23
  {
24
24
  "return_value": {
25
25
  "class": "builtins.str",
26
- "value": "'ExampleClass.static_method\\n...\\n'"
26
+ "value": "ExampleClass.static_method\n...\n"
27
27
  },
28
28
  "parent_id": 1,
29
29
  "id": 2,
@@ -49,7 +49,7 @@
49
49
  {
50
50
  "return_value": {
51
51
  "class": "builtins.str",
52
- "value": "'ClassMethodMixin#class_method, cls ExampleClass'"
52
+ "value": "ClassMethodMixin#class_method, cls ExampleClass"
53
53
  },
54
54
  "parent_id": 3,
55
55
  "id": 4,
@@ -75,7 +75,7 @@
75
75
  {
76
76
  "return_value": {
77
77
  "class": "builtins.str",
78
- "value": "'Super#instance_method'"
78
+ "value": "Super#instance_method"
79
79
  },
80
80
  "parent_id": 5,
81
81
  "id": 6,
@@ -127,7 +127,7 @@
127
127
  "name": "data",
128
128
  "kind": "req",
129
129
  "class": "builtins.str",
130
- "value": "'ExampleClass.call_yaml'"
130
+ "value": "ExampleClass.call_yaml"
131
131
  }
132
132
  ],
133
133
  "id": 10,
@@ -144,7 +144,7 @@
144
144
  "name": "data",
145
145
  "kind": "req",
146
146
  "class": "builtins.str",
147
- "value": "'ExampleClass.call_yaml'"
147
+ "value": "ExampleClass.call_yaml"
148
148
  },
149
149
  {
150
150
  "name": "stream",
@@ -176,7 +176,7 @@
176
176
  {
177
177
  "return_value": {
178
178
  "class": "builtins.str",
179
- "value": "'ExampleClass.call_yaml\\n...\\n'"
179
+ "value": "ExampleClass.call_yaml\n...\n"
180
180
  },
181
181
  "parent_id": 11,
182
182
  "id": 12,
@@ -190,7 +190,7 @@
190
190
  "name": "data",
191
191
  "kind": "req",
192
192
  "class": "builtins.str",
193
- "value": "'ExampleClass.call_yaml'"
193
+ "value": "ExampleClass.call_yaml"
194
194
  },
195
195
  {
196
196
  "name": "stream",
@@ -222,7 +222,7 @@
222
222
  {
223
223
  "return_value": {
224
224
  "class": "builtins.str",
225
- "value": "'ExampleClass.call_yaml\\n...\\n'"
225
+ "value": "ExampleClass.call_yaml\n...\n"
226
226
  },
227
227
  "parent_id": 13,
228
228
  "id": 14,
@@ -334,4 +334,4 @@
334
334
  ]
335
335
  }
336
336
  ]
337
- }
337
+ }
@@ -56,7 +56,7 @@
56
56
  {
57
57
  "return_value": {
58
58
  "class": "builtins.str",
59
- "value": "'Hello'"
59
+ "value": "Hello"
60
60
  },
61
61
  "parent_id": 2,
62
62
  "id": 3,
@@ -83,7 +83,7 @@
83
83
  {
84
84
  "return_value": {
85
85
  "class": "builtins.str",
86
- "value": "'world!'"
86
+ "value": "world!"
87
87
  },
88
88
  "parent_id": 4,
89
89
  "id": 5,
@@ -93,7 +93,7 @@
93
93
  {
94
94
  "return_value": {
95
95
  "class": "builtins.str",
96
- "value": "'Hello world!'"
96
+ "value": "Hello world!"
97
97
  },
98
98
  "parent_id": 1,
99
99
  "id": 6,
@@ -239,4 +239,4 @@
239
239
  ]
240
240
  }
241
241
  ]
242
- }
242
+ }
@@ -66,7 +66,7 @@
66
66
  },
67
67
  {
68
68
  "return_value": {
69
- "value": "'Hello'",
69
+ "value": "Hello",
70
70
  "class": "builtins.str"
71
71
  },
72
72
  "parent_id": 3,
@@ -93,7 +93,7 @@
93
93
  },
94
94
  {
95
95
  "return_value": {
96
- "value": "'world!'",
96
+ "value": "world!",
97
97
  "class": "builtins.str"
98
98
  },
99
99
  "parent_id": 5,
@@ -103,7 +103,7 @@
103
103
  },
104
104
  {
105
105
  "return_value": {
106
- "value": "'Hello world!'",
106
+ "value": "Hello world!",
107
107
  "class": "builtins.str"
108
108
  },
109
109
  "parent_id": 2,
@@ -278,4 +278,4 @@
278
278
  ]
279
279
  }
280
280
  ]
281
- }
281
+ }
@@ -56,7 +56,7 @@
56
56
  {
57
57
  "return_value": {
58
58
  "class": "builtins.str",
59
- "value": "'Hello'"
59
+ "value": "Hello"
60
60
  },
61
61
  "parent_id": 2,
62
62
  "id": 3,
@@ -83,7 +83,7 @@
83
83
  {
84
84
  "return_value": {
85
85
  "class": "builtins.str",
86
- "value": "'world!'"
86
+ "value": "world!"
87
87
  },
88
88
  "parent_id": 4,
89
89
  "id": 5,
@@ -93,7 +93,7 @@
93
93
  {
94
94
  "return_value": {
95
95
  "class": "builtins.str",
96
- "value": "'Hello world!'"
96
+ "value": "Hello world!"
97
97
  },
98
98
  "parent_id": 1,
99
99
  "id": 6,
@@ -239,4 +239,4 @@
239
239
  ]
240
240
  }
241
241
  ]
242
- }
242
+ }
@@ -66,7 +66,7 @@
66
66
  },
67
67
  {
68
68
  "return_value": {
69
- "value": "'Hello'",
69
+ "value": "Hello",
70
70
  "class": "builtins.str"
71
71
  },
72
72
  "parent_id": 3,
@@ -93,7 +93,7 @@
93
93
  },
94
94
  {
95
95
  "return_value": {
96
- "value": "'world!'",
96
+ "value": "world!",
97
97
  "class": "builtins.str"
98
98
  },
99
99
  "parent_id": 5,
@@ -103,7 +103,7 @@
103
103
  },
104
104
  {
105
105
  "return_value": {
106
- "value": "'Hello world!'",
106
+ "value": "Hello world!",
107
107
  "class": "builtins.str"
108
108
  },
109
109
  "parent_id": 2,
@@ -278,4 +278,4 @@
278
278
  ]
279
279
  }
280
280
  ]
281
- }
281
+ }
@@ -53,12 +53,14 @@
53
53
  "class": "simple.Simple",
54
54
  "value": "<simple.Simple object at 0xabcdef>"
55
55
  },
56
- "parameters": [{
57
- "class": "builtins.str",
58
- "kind": "req",
59
- "name": "bang",
60
- "value": "'!'"
61
- }],
56
+ "parameters": [
57
+ {
58
+ "class": "builtins.str",
59
+ "kind": "req",
60
+ "name": "bang",
61
+ "value": "!"
62
+ }
63
+ ],
62
64
  "id": 2,
63
65
  "event": "call",
64
66
  "thread_id": 1
@@ -83,7 +85,7 @@
83
85
  {
84
86
  "return_value": {
85
87
  "class": "builtins.str",
86
- "value": "'Hello'"
88
+ "value": "Hello"
87
89
  },
88
90
  "parent_id": 3,
89
91
  "id": 4,
@@ -110,7 +112,7 @@
110
112
  {
111
113
  "return_value": {
112
114
  "class": "builtins.str",
113
- "value": "'world'"
115
+ "value": "world"
114
116
  },
115
117
  "parent_id": 5,
116
118
  "id": 6,
@@ -120,7 +122,7 @@
120
122
  {
121
123
  "return_value": {
122
124
  "class": "builtins.str",
123
- "value": "'Hello world!'"
125
+ "value": "Hello world!"
124
126
  },
125
127
  "parent_id": 2,
126
128
  "id": 7,
@@ -35,7 +35,7 @@
35
35
  "parameters": [
36
36
  {
37
37
  "kind": "req",
38
- "value": "'!'",
38
+ "value": "!",
39
39
  "name": "bang",
40
40
  "class": "builtins.str"
41
41
  }
@@ -67,7 +67,7 @@
67
67
  },
68
68
  {
69
69
  "return_value": {
70
- "value": "'Hello'",
70
+ "value": "Hello",
71
71
  "class": "builtins.str"
72
72
  },
73
73
  "parent_id": 2,
@@ -94,7 +94,7 @@
94
94
  },
95
95
  {
96
96
  "return_value": {
97
- "value": "'world'",
97
+ "value": "world",
98
98
  "class": "builtins.str"
99
99
  },
100
100
  "parent_id": 4,
@@ -104,7 +104,7 @@
104
104
  },
105
105
  {
106
106
  "return_value": {
107
- "value": "'Hello world!'",
107
+ "value": "Hello world!",
108
108
  "class": "builtins.str"
109
109
  },
110
110
  "parent_id": 1,
@@ -145,4 +145,4 @@
145
145
  ]
146
146
  }
147
147
  ]
148
- }
148
+ }
@@ -53,12 +53,14 @@
53
53
  "class": "simple.Simple",
54
54
  "value": "<simple.Simple object at 0xabcdef>"
55
55
  },
56
- "parameters": [{
57
- "class": "builtins.str",
58
- "kind": "req",
59
- "name": "bang",
60
- "value": "'!'"
61
- }],
56
+ "parameters": [
57
+ {
58
+ "class": "builtins.str",
59
+ "kind": "req",
60
+ "name": "bang",
61
+ "value": "!"
62
+ }
63
+ ],
62
64
  "id": 2,
63
65
  "event": "call",
64
66
  "thread_id": 1
@@ -83,7 +85,7 @@
83
85
  {
84
86
  "return_value": {
85
87
  "class": "builtins.str",
86
- "value": "'Hello'"
88
+ "value": "Hello"
87
89
  },
88
90
  "parent_id": 3,
89
91
  "id": 4,
@@ -110,7 +112,7 @@
110
112
  {
111
113
  "return_value": {
112
114
  "class": "builtins.str",
113
- "value": "'world'"
115
+ "value": "world"
114
116
  },
115
117
  "parent_id": 5,
116
118
  "id": 6,
@@ -120,7 +122,7 @@
120
122
  {
121
123
  "return_value": {
122
124
  "class": "builtins.str",
123
- "value": "'Hello world!'"
125
+ "value": "Hello world!"
124
126
  },
125
127
  "parent_id": 2,
126
128
  "id": 7,
@@ -132,11 +132,11 @@ class TestEvents:
132
132
 
133
133
  assert result == "hello"
134
134
  call_event = r.events[0]
135
- # Parameter value should be the repr, not the opaque object string
136
- assert call_event.parameters[0]["value"] == "'hello'"
135
+ # Parameter value should be the raw string, not repr-quoted
136
+ assert call_event.parameters[0]["value"] == "hello"
137
137
  # Return value should also be displayed
138
138
  return_event = r.events[1]
139
- assert return_event.return_value["value"] == "'hello'"
139
+ assert return_event.return_value["value"] == "hello"
140
140
 
141
141
  # Unlabeled method should not have its params displayed, even in the same recording
142
142
  call_event_unlabeled = r.events[2]
@@ -29,8 +29,8 @@ def test_http_client_capture(mock_requests, events):
29
29
  }
30
30
  message = request.message
31
31
  assert message[0] == DictIncluding({"name": "q", "value": "['one', 'two']"})
32
- assert (message[1] == DictIncluding({"name": "q2", "value": "'🦠'"})) or (
33
- message[1] == DictIncluding({"name": "q2", "value": "'\\U0001f9a0'"})
32
+ assert (message[1] == DictIncluding({"name": "q2", "value": "🦠"})) or (
33
+ message[1] == DictIncluding({"name": "q2", "value": "\\U0001f9a0"})
34
34
  )
35
35
 
36
36
  assert events[3].http_client_response == DictIncluding(
@@ -1,5 +1,6 @@
1
1
  import pytest
2
2
 
3
+ import appmap
3
4
  from _appmap.wrapt import BoundFunctionWrapper, FunctionWrapper
4
5
 
5
6
 
@@ -55,6 +56,22 @@ class TestLabels:
55
56
 
56
57
  verify_example_appmap(check_labels, "instance_method")
57
58
 
59
+ @pytest.mark.appmap_enabled(config="appmap-no-pyyaml.yml")
60
+ def test_labeled_function_recorded_without_package(self):
61
+ """A labeled function is recorded even when its package is not in the config."""
62
+ import yaml # pylint: disable=import-outside-toplevel
63
+
64
+ rec = appmap.Recording()
65
+ with rec:
66
+ yaml.dump({"key": "value"})
67
+
68
+ # yaml.dump should appear in the recording events because it's labeled
69
+ # by the formats preset, even though PyYAML is not in the packages list.
70
+ call_events = [e for e in rec.events if e.event == "call"]
71
+ assert any(
72
+ e.method_id == "dump" and "yaml" in e.defined_class for e in call_events
73
+ ), f"Expected yaml.dump in recorded events, got: {[e.method_id for e in call_events]}"
74
+
58
75
  def test_function_only_in_mod(self, verify_example_appmap):
59
76
  def check_labels(*_):
60
77
  # pylint: disable=import-outside-toplevel
@@ -108,7 +108,7 @@ class TestStaticMethods(TestMethodBase):
108
108
  "name": "p",
109
109
  "class": "builtins.str",
110
110
  "kind": "req",
111
- "value": "'static'",
111
+ "value": "static",
112
112
  }
113
113
 
114
114
 
@@ -131,7 +131,7 @@ class TestClassMethods(TestMethodBase):
131
131
  self.assert_parameter(
132
132
  evt,
133
133
  0,
134
- {"name": "p", "class": "builtins.str", "kind": "req", "value": "'cls'"},
134
+ {"name": "p", "class": "builtins.str", "kind": "req", "value": "cls"},
135
135
  )
136
136
 
137
137
 
@@ -145,7 +145,7 @@ class TestInstanceMethods(TestMethodBase):
145
145
  @pytest.mark.parametrize(
146
146
  "params,arg,expected",
147
147
  [
148
- ("one", "world", ("builtins.str", "'world'")),
148
+ ("one", "world", ("builtins.str", "world")),
149
149
  ("one", None, ("builtins.NoneType", "None")),
150
150
  ],
151
151
  indirect=["params"],
@@ -192,7 +192,7 @@ class TestInstanceMethods(TestMethodBase):
192
192
  @pytest.mark.parametrize(
193
193
  "params,arg,expected",
194
194
  [
195
- ("one", "world", ("builtins.str", "'world'")),
195
+ ("one", "world", ("builtins.str", "world")),
196
196
  ("one", None, ("builtins.NoneType", "None")),
197
197
  ],
198
198
  indirect=["params"],
@@ -45,7 +45,7 @@ class _TestFormData:
45
45
  )
46
46
 
47
47
  assert events[0].message == [
48
- DictIncluding({"name": "my_param", "class": "builtins.str", "value": "'example'"})
48
+ DictIncluding({"name": "my_param", "class": "builtins.str", "value": "example"})
49
49
  ]
50
50
 
51
51
  @staticmethod
@@ -53,7 +53,7 @@ class _TestFormData:
53
53
  client.post("/test", data={"my_param": "example"}, content_type="multipart/form-data")
54
54
 
55
55
  assert events[0].message == [
56
- DictIncluding({"name": "my_param", "class": "builtins.str", "value": "'example'"})
56
+ DictIncluding({"name": "my_param", "class": "builtins.str", "value": "example"})
57
57
  ]
58
58
 
59
59
 
@@ -119,7 +119,7 @@ class _TestRequestCapture:
119
119
 
120
120
  assert events[0].message == [
121
121
  DictIncluding(
122
- {"name": "my_param", "class": "builtins.str", "value": "'example'"}
122
+ {"name": "my_param", "class": "builtins.str", "value": "example"}
123
123
  )
124
124
  ]
125
125
  assert events[0].http_server_request == DictIncluding(
@@ -142,7 +142,7 @@ class _TestRequestCapture:
142
142
 
143
143
  assert events[0].message == [
144
144
  DictIncluding(
145
- {"name": "my_param", "class": "builtins.str", "value": "'example'"}
145
+ {"name": "my_param", "class": "builtins.str", "value": "example"}
146
146
  )
147
147
  ]
148
148
 
@@ -166,7 +166,7 @@ class _TestRequestCapture:
166
166
 
167
167
  assert events[0].message == [
168
168
  DictIncluding(
169
- {"name": "my_param", "class": "builtins.str", "value": "'example'"}
169
+ {"name": "my_param", "class": "builtins.str", "value": "example"}
170
170
  )
171
171
  ]
172
172
 
@@ -205,7 +205,7 @@ class _TestRequestCapture:
205
205
 
206
206
  assert events[0].message == [
207
207
  DictIncluding(
208
- {"name": "username", "class": "builtins.str", "value": "'alice'"}
208
+ {"name": "username", "class": "builtins.str", "value": "alice"}
209
209
  ),
210
210
  DictIncluding({"name": "post_id", "class": "builtins.int", "value": "42"}),
211
211
  ]
@@ -222,7 +222,7 @@ class _TestFormCapture:
222
222
  )
223
223
 
224
224
  assert events[0].message == [
225
- DictIncluding({"name": "my_param", "class": "builtins.str", "value": "'example'"})
225
+ DictIncluding({"name": "my_param", "class": "builtins.str", "value": "example"})
226
226
  ]
227
227
 
228
228
  @staticmethod
@@ -230,7 +230,7 @@ class _TestFormCapture:
230
230
  client.post("/test", data={"my_param": "example"}, content_type="multipart/form-data")
231
231
 
232
232
  assert events[0].message == [
233
- DictIncluding({"name": "my_param", "class": "builtins.str", "value": "'example'"})
233
+ DictIncluding({"name": "my_param", "class": "builtins.str", "value": "example"})
234
234
  ]
235
235
 
236
236
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "appmap"
3
- version = "2.2.0"
3
+ version = "3.0.0"
4
4
  description = "Create AppMap files by recording a Python application."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.8"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes