appmap 0.36.0 → 0.39.1

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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +1 -1
  3. data/.gitignore +2 -1
  4. data/.rubocop.yml +15 -1
  5. data/.travis.yml +2 -23
  6. data/CHANGELOG.md +20 -0
  7. data/README.md +30 -13
  8. data/Rakefile +4 -3
  9. data/appmap.gemspec +1 -0
  10. data/lib/appmap.rb +2 -2
  11. data/lib/appmap/class_map.rb +19 -5
  12. data/lib/appmap/config.rb +22 -10
  13. data/lib/appmap/event.rb +16 -1
  14. data/lib/appmap/hook.rb +11 -3
  15. data/lib/appmap/hook/method.rb +18 -12
  16. data/lib/appmap/rails/request_handler.rb +20 -4
  17. data/lib/appmap/rspec.rb +1 -1
  18. data/lib/appmap/trace.rb +18 -7
  19. data/lib/appmap/version.rb +2 -2
  20. data/spec/abstract_controller_base_spec.rb +132 -67
  21. data/spec/class_map_spec.rb +36 -0
  22. data/spec/fixtures/hook/instance_method.rb +4 -0
  23. data/spec/fixtures/{rails_users_app → rails5_users_app}/.dockerignore +0 -0
  24. data/spec/fixtures/{rails_users_app → rails5_users_app}/.gitignore +0 -0
  25. data/spec/fixtures/{rails_users_app → rails5_users_app}/.rspec +0 -0
  26. data/spec/fixtures/{rails_users_app → rails5_users_app}/.ruby-version +0 -0
  27. data/spec/fixtures/{rails_users_app → rails5_users_app}/Dockerfile +0 -0
  28. data/spec/fixtures/{rails_users_app → rails5_users_app}/Dockerfile.pg +0 -0
  29. data/spec/fixtures/rails5_users_app/Gemfile +51 -0
  30. data/spec/fixtures/{rails_users_app → rails5_users_app}/Rakefile +0 -0
  31. data/spec/fixtures/{rails_users_app → rails5_users_app}/app/controllers/api/users_controller.rb +0 -0
  32. data/spec/fixtures/{rails_users_app → rails5_users_app}/app/controllers/application_controller.rb +0 -0
  33. data/spec/fixtures/{rails4_users_app/app/assets/images → rails5_users_app/app/controllers/concerns}/.keep +0 -0
  34. data/spec/fixtures/{rails_users_app → rails5_users_app}/app/controllers/health_controller.rb +0 -0
  35. data/spec/fixtures/rails5_users_app/app/controllers/users_controller.rb +13 -0
  36. data/spec/fixtures/{rails4_users_app/app/models → rails5_users_app/app/models/activerecord}/user.rb +0 -0
  37. data/spec/fixtures/{rails4_users_app/app/controllers → rails5_users_app/app/models}/concerns/.keep +0 -0
  38. data/spec/fixtures/{rails_users_app → rails5_users_app}/app/models/sequel/user.rb +0 -0
  39. data/spec/fixtures/{rails4_users_app → rails5_users_app}/app/views/layouts/application.html.haml +0 -0
  40. data/spec/fixtures/{rails4_users_app → rails5_users_app}/app/views/users/index.html.haml +0 -0
  41. data/spec/fixtures/rails5_users_app/appmap.yml +4 -0
  42. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/appmap +0 -0
  43. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/byebug +0 -0
  44. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/gli +0 -0
  45. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/htmldiff +0 -0
  46. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/ldiff +0 -0
  47. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/nokogiri +0 -0
  48. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/rackup +0 -0
  49. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/rails +0 -0
  50. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/rake +0 -0
  51. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/rspec +0 -0
  52. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/ruby-parse +0 -0
  53. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/ruby-rewrite +0 -0
  54. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/sequel +0 -0
  55. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/setup +0 -0
  56. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/sprockets +0 -0
  57. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/thor +0 -0
  58. data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/update +0 -0
  59. data/spec/fixtures/{rails_users_app → rails5_users_app}/config.ru +0 -0
  60. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/application.rb +0 -0
  61. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/boot.rb +0 -0
  62. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/credentials.yml.enc +0 -0
  63. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/database.yml +0 -0
  64. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/environment.rb +0 -0
  65. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/environments/development.rb +0 -0
  66. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/environments/production.rb +0 -0
  67. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/environments/test.rb +0 -0
  68. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/initializers/application_controller_renderer.rb +0 -0
  69. data/spec/fixtures/{rails4_users_app → rails5_users_app}/config/initializers/backtrace_silencers.rb +0 -0
  70. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/initializers/cors.rb +0 -0
  71. data/spec/fixtures/{rails4_users_app → rails5_users_app}/config/initializers/filter_parameter_logging.rb +0 -0
  72. data/spec/fixtures/{rails4_users_app → rails5_users_app}/config/initializers/inflections.rb +0 -0
  73. data/spec/fixtures/{rails4_users_app → rails5_users_app}/config/initializers/mime_types.rb +0 -0
  74. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/initializers/record_button.rb +0 -0
  75. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/initializers/wrap_parameters.rb +0 -0
  76. data/spec/fixtures/{rails_users_app → rails5_users_app}/config/locales/en.yml +0 -0
  77. data/spec/fixtures/{rails4_users_app → rails5_users_app}/config/routes.rb +1 -2
  78. data/spec/fixtures/{rails_users_app → rails5_users_app}/create_app +0 -0
  79. data/spec/fixtures/{rails_users_app → rails5_users_app}/db/migrate/20190728211408_create_users.rb +0 -0
  80. data/spec/fixtures/{rails_users_app → rails5_users_app}/db/schema.rb +0 -0
  81. data/spec/fixtures/{rails_users_app → rails5_users_app}/docker-compose.yml +0 -0
  82. data/spec/fixtures/{rails_users_app → rails5_users_app}/features/api_users.feature +0 -0
  83. data/spec/fixtures/{rails_users_app → rails5_users_app}/features/support/env.rb +0 -0
  84. data/spec/fixtures/{rails_users_app → rails5_users_app}/features/support/hooks.rb +0 -0
  85. data/spec/fixtures/{rails_users_app → rails5_users_app}/features/support/steps.rb +0 -0
  86. data/spec/fixtures/{rails4_users_app/app/mailers → rails5_users_app/lib/tasks}/.keep +0 -0
  87. data/spec/fixtures/{rails4_users_app/app/models → rails5_users_app/log}/.keep +0 -0
  88. data/spec/fixtures/{rails_users_app → rails5_users_app}/public/robots.txt +0 -0
  89. data/spec/fixtures/{rails_users_app → rails5_users_app}/spec/controllers/users_controller_api_spec.rb +1 -1
  90. data/spec/fixtures/rails5_users_app/spec/controllers/users_controller_spec.rb +27 -0
  91. data/spec/fixtures/{rails_users_app → rails5_users_app}/spec/models/user_spec.rb +0 -0
  92. data/spec/fixtures/{rails_users_app → rails5_users_app}/spec/rails_helper.rb +0 -0
  93. data/spec/fixtures/{rails4_users_app → rails5_users_app}/spec/spec_helper.rb +0 -0
  94. data/spec/fixtures/{rails_users_app → rails5_users_app}/users_app/.gitignore +0 -0
  95. data/spec/fixtures/rails6_users_app/.dockerignore +1 -0
  96. data/spec/fixtures/rails6_users_app/.gitignore +39 -0
  97. data/spec/fixtures/rails6_users_app/.rspec +1 -0
  98. data/spec/fixtures/rails6_users_app/.ruby-version +1 -0
  99. data/spec/fixtures/{rails4_users_app → rails6_users_app}/Dockerfile +3 -4
  100. data/spec/fixtures/{rails4_users_app → rails6_users_app}/Dockerfile.pg +1 -1
  101. data/spec/fixtures/{rails_users_app → rails6_users_app}/Gemfile +1 -1
  102. data/spec/fixtures/{rails4_users_app → rails6_users_app}/Rakefile +1 -1
  103. data/spec/fixtures/{rails4_users_app → rails6_users_app}/app/controllers/api/users_controller.rb +1 -1
  104. data/spec/fixtures/rails6_users_app/app/controllers/application_controller.rb +2 -0
  105. data/spec/fixtures/{rails4_users_app/app/models → rails6_users_app/app/controllers}/concerns/.keep +0 -0
  106. data/spec/fixtures/{rails4_users_app → rails6_users_app}/app/controllers/health_controller.rb +1 -1
  107. data/spec/fixtures/rails6_users_app/app/controllers/users_controller.rb +13 -0
  108. data/spec/fixtures/{rails_users_app → rails6_users_app}/app/models/activerecord/user.rb +0 -0
  109. data/spec/fixtures/{rails4_users_app/lib/assets → rails6_users_app/app/models/concerns}/.keep +0 -0
  110. data/spec/fixtures/rails6_users_app/app/models/sequel/user.rb +25 -0
  111. data/spec/fixtures/{rails_users_app → rails6_users_app}/app/views/layouts/application.html.haml +0 -0
  112. data/spec/fixtures/{rails_users_app → rails6_users_app}/app/views/users/index.html.haml +0 -0
  113. data/spec/fixtures/rails6_users_app/appmap.yml +5 -0
  114. data/spec/fixtures/rails6_users_app/bin/appmap +29 -0
  115. data/spec/fixtures/rails6_users_app/bin/byebug +29 -0
  116. data/spec/fixtures/rails6_users_app/bin/gli +29 -0
  117. data/spec/fixtures/rails6_users_app/bin/htmldiff +29 -0
  118. data/spec/fixtures/rails6_users_app/bin/ldiff +29 -0
  119. data/spec/fixtures/rails6_users_app/bin/nokogiri +29 -0
  120. data/spec/fixtures/rails6_users_app/bin/rackup +29 -0
  121. data/spec/fixtures/rails6_users_app/bin/rails +4 -0
  122. data/spec/fixtures/rails6_users_app/bin/rake +29 -0
  123. data/spec/fixtures/rails6_users_app/bin/rspec +29 -0
  124. data/spec/fixtures/rails6_users_app/bin/ruby-parse +29 -0
  125. data/spec/fixtures/rails6_users_app/bin/ruby-rewrite +29 -0
  126. data/spec/fixtures/rails6_users_app/bin/sequel +29 -0
  127. data/spec/fixtures/rails6_users_app/bin/setup +25 -0
  128. data/spec/fixtures/rails6_users_app/bin/sprockets +29 -0
  129. data/spec/fixtures/rails6_users_app/bin/thor +29 -0
  130. data/spec/fixtures/rails6_users_app/bin/update +25 -0
  131. data/spec/fixtures/{rails4_users_app → rails6_users_app}/config.ru +2 -1
  132. data/spec/fixtures/rails6_users_app/config/application.rb +51 -0
  133. data/spec/fixtures/rails6_users_app/config/boot.rb +3 -0
  134. data/spec/fixtures/rails6_users_app/config/credentials.yml.enc +1 -0
  135. data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/database.yml +2 -2
  136. data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/environment.rb +1 -1
  137. data/spec/fixtures/rails6_users_app/config/environments/development.rb +40 -0
  138. data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/environments/production.rb +19 -30
  139. data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/environments/test.rb +5 -11
  140. data/spec/fixtures/rails6_users_app/config/initializers/application_controller_renderer.rb +8 -0
  141. data/spec/fixtures/{rails_users_app → rails6_users_app}/config/initializers/backtrace_silencers.rb +0 -0
  142. data/spec/fixtures/rails6_users_app/config/initializers/cors.rb +16 -0
  143. data/spec/fixtures/{rails_users_app → rails6_users_app}/config/initializers/filter_parameter_logging.rb +0 -0
  144. data/spec/fixtures/{rails_users_app → rails6_users_app}/config/initializers/inflections.rb +0 -0
  145. data/spec/fixtures/{rails_users_app → rails6_users_app}/config/initializers/mime_types.rb +0 -0
  146. data/spec/fixtures/rails6_users_app/config/initializers/record_button.rb +3 -0
  147. data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/initializers/wrap_parameters.rb +1 -6
  148. data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/locales/en.yml +10 -0
  149. data/spec/fixtures/{rails_users_app → rails6_users_app}/config/routes.rb +1 -1
  150. data/spec/fixtures/{rails4_users_app → rails6_users_app}/create_app +7 -3
  151. data/spec/fixtures/rails6_users_app/db/migrate/20190728211408_create_users.rb +9 -0
  152. data/spec/fixtures/rails6_users_app/db/schema.rb +23 -0
  153. data/spec/fixtures/{rails4_users_app → rails6_users_app}/docker-compose.yml +3 -1
  154. data/spec/fixtures/rails6_users_app/features/api_users.feature +13 -0
  155. data/spec/fixtures/rails6_users_app/features/support/env.rb +4 -0
  156. data/spec/fixtures/rails6_users_app/features/support/hooks.rb +11 -0
  157. data/spec/fixtures/rails6_users_app/features/support/steps.rb +18 -0
  158. data/spec/fixtures/{rails4_users_app → rails6_users_app}/lib/tasks/.keep +0 -0
  159. data/spec/fixtures/{rails4_users_app → rails6_users_app}/log/.keep +0 -0
  160. data/spec/fixtures/rails6_users_app/public/robots.txt +1 -0
  161. data/spec/fixtures/rails6_users_app/spec/controllers/users_controller_api_spec.rb +29 -0
  162. data/spec/fixtures/rails6_users_app/spec/controllers/users_controller_spec.rb +27 -0
  163. data/spec/fixtures/rails6_users_app/spec/models/user_spec.rb +39 -0
  164. data/spec/fixtures/{rails4_users_app → rails6_users_app}/spec/rails_helper.rb +3 -32
  165. data/spec/fixtures/{rails_users_app → rails6_users_app}/spec/spec_helper.rb +0 -0
  166. data/spec/fixtures/{rails4_users_app → rails6_users_app/users_app}/.gitignore +8 -1
  167. data/spec/hook_spec.rb +102 -57
  168. data/spec/rails_spec_helper.rb +5 -5
  169. data/spec/railtie_spec.rb +31 -32
  170. data/spec/record_sql_rails_pg_spec.rb +62 -63
  171. data/spec/remote_recording_spec.rb +90 -89
  172. data/spec/rspec_feature_metadata_spec.rb +17 -18
  173. data/test/expectations/openssl_test_key_sign1.json +55 -0
  174. data/test/expectations/openssl_test_key_sign2.json +58 -0
  175. data/test/openssl_test.rb +9 -116
  176. metadata +163 -139
  177. data/spec/abstract_controller4_base_spec.rb +0 -67
  178. data/spec/fixtures/rails4_users_app/.rbenv-gemsets +0 -2
  179. data/spec/fixtures/rails4_users_app/.ruby-version +0 -1
  180. data/spec/fixtures/rails4_users_app/Gemfile +0 -77
  181. data/spec/fixtures/rails4_users_app/README.rdoc +0 -28
  182. data/spec/fixtures/rails4_users_app/app/assets/javascripts/application.js +0 -16
  183. data/spec/fixtures/rails4_users_app/app/assets/stylesheets/application.css +0 -15
  184. data/spec/fixtures/rails4_users_app/app/controllers/application_controller.rb +0 -5
  185. data/spec/fixtures/rails4_users_app/app/controllers/users_controller.rb +0 -5
  186. data/spec/fixtures/rails4_users_app/app/helpers/application_helper.rb +0 -2
  187. data/spec/fixtures/rails4_users_app/appmap.yml +0 -3
  188. data/spec/fixtures/rails4_users_app/bin/rails +0 -9
  189. data/spec/fixtures/rails4_users_app/bin/setup +0 -29
  190. data/spec/fixtures/rails4_users_app/bin/spring +0 -17
  191. data/spec/fixtures/rails4_users_app/config/application.rb +0 -26
  192. data/spec/fixtures/rails4_users_app/config/boot.rb +0 -3
  193. data/spec/fixtures/rails4_users_app/config/environments/development.rb +0 -41
  194. data/spec/fixtures/rails4_users_app/config/initializers/assets.rb +0 -11
  195. data/spec/fixtures/rails4_users_app/config/initializers/cookies_serializer.rb +0 -3
  196. data/spec/fixtures/rails4_users_app/config/initializers/session_store.rb +0 -3
  197. data/spec/fixtures/rails4_users_app/config/initializers/to_time_preserves_timezone.rb +0 -10
  198. data/spec/fixtures/rails4_users_app/config/secrets.yml +0 -22
  199. data/spec/fixtures/rails4_users_app/db/migrate/20191127112304_create_users.rb +0 -10
  200. data/spec/fixtures/rails4_users_app/db/schema.rb +0 -26
  201. data/spec/fixtures/rails4_users_app/db/seeds.rb +0 -7
  202. data/spec/fixtures/rails4_users_app/public/404.html +0 -67
  203. data/spec/fixtures/rails4_users_app/public/422.html +0 -67
  204. data/spec/fixtures/rails4_users_app/public/500.html +0 -66
  205. data/spec/fixtures/rails4_users_app/public/favicon.ico +0 -0
  206. data/spec/fixtures/rails4_users_app/public/robots.txt +0 -5
  207. data/spec/fixtures/rails4_users_app/spec/controllers/users_controller_api_spec.rb +0 -49
  208. data/spec/fixtures/rails4_users_app/test/fixtures/users.yml +0 -9
  209. data/spec/fixtures/rails_users_app/app/controllers/concerns/.keep +0 -0
  210. data/spec/fixtures/rails_users_app/app/controllers/users_controller.rb +0 -5
  211. data/spec/fixtures/rails_users_app/app/models/concerns/.keep +0 -0
  212. data/spec/fixtures/rails_users_app/appmap.yml +0 -3
  213. data/spec/fixtures/rails_users_app/lib/tasks/.keep +0 -0
  214. data/spec/fixtures/rails_users_app/log/.keep +0 -0
  215. data/spec/record_sql_rails4_pg_spec.rb +0 -76
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 102dab80f2d8cffd51fd1377583a1b063078cd77ab7ad4ffdcd20867a084b11b
4
- data.tar.gz: cbb87144593416f84099cf8a9d8ac18f18d9763dce28277320ae6a99ff59ec58
3
+ metadata.gz: 384456ad51727b3c819e8307de92b2785da152a46c5fa60d0a4e6ff690dbb596
4
+ data.tar.gz: e0d5a984bc74ee91b0f9428d83cbaac70c387b442cc55666f36b75907080e620
5
5
  SHA512:
6
- metadata.gz: a24e2ecb22a654d11e91ef28a7fdd961c178144f474a36e26c70e8e243bac18c13e3c5ff606f5ed2a058ddf6d98f9dbd0678a0f986ddfae4f18ed7524c27d41d
7
- data.tar.gz: 712cb7e18026aa80135af7ce54a7a8c412362355c0eb6b151a0f05354cf991ebe9402e298d9646b9fab2e5d673d3338a773a0b1b1d0e1846ec3ed970074a1f77
6
+ metadata.gz: 2f0670d632a370241168ad76ad30dd663568556ea3e524c48aafdbf86ae9d0c8e8f76f48a1c34a7a830457cff66c4417bbf19acb7ac952daeaaec65121e7a0d5
7
+ data.tar.gz: 3f1bec26161a40c75487e7f98f039df0c135f7de77ee089d72dde29c1a5d5fd19b43661c6aff3c3de58e945b87d330b96a66738a95a208ec7a4e75db1bd85363
@@ -1,5 +1,5 @@
1
1
  vendor
2
2
  node_modules
3
- spec/fixtures/rails_users_app
3
+ spec/fixtures/rails*_users_app
4
4
  spec/fixtures/rack_users_app
5
5
 
data/.gitignore CHANGED
@@ -14,4 +14,5 @@ Gemfile.lock
14
14
  appmap.json
15
15
  .vscode
16
16
  .byebug_history
17
- /lib/appmap/appmap.bundle
17
+ /lib/appmap/appmap.bundle
18
+ *.so
@@ -1,3 +1,12 @@
1
+ AllCops:
2
+ NewCops: enable
3
+
4
+ Layout/CaseIndentation:
5
+ EnforcedStyle: end
6
+
7
+ Layout/FirstArgumentIndentation:
8
+ EnforcedStyle: consistent
9
+
1
10
  Layout/SpaceInsideArrayLiteralBrackets:
2
11
  Enabled: false
3
12
 
@@ -8,12 +17,17 @@ Layout/HeredocIndentation:
8
17
  Layout/LineLength:
9
18
  Max: 120
10
19
 
20
+ Metrics/BlockLength:
21
+ ExcludedMethods:
22
+ - it
23
+ - context
24
+
11
25
  Style/MultilineBlockChain:
12
26
  Enabled: false
13
27
 
14
28
  Style/NumericPredicate:
15
29
  Enabled: false
16
-
30
+
17
31
  Style/AndOr:
18
32
  Enabled: false
19
33
 
@@ -16,29 +16,8 @@ before_script:
16
16
 
17
17
  jobs:
18
18
  include:
19
- - stage: minitest
19
+ - stage: test
20
20
  script:
21
21
  - mkdir tmp
22
- - bundle exec rake minitest
23
-
24
- - stage: base
25
- script:
26
- - bundle exec rake build:base:2.5
27
- - stage: base
28
- script:
29
- - bundle exec rake build:base:2.6
30
-
31
- - stage: fixtures
32
- script:
33
- - bundle exec rake build:fixtures:2.5:all
34
- - stage: fixtures
35
- script:
36
- - bundle exec rake build:fixtures:2.6:all
37
-
38
- - stage: spec
39
- script:
40
- - bundle exec rake spec:2.5
41
- - stage: spec
42
- script:
43
- - bundle exec rake spec:2.6
22
+ - bundle exec rake test
44
23
 
@@ -1,3 +1,23 @@
1
+ # v0.39.1
2
+ * Support Ruby 2.7.
3
+ * Remove support for Rails 4.
4
+ * Stop recommending `-t appmap` argument for `rspec`.
5
+
6
+ # v0.39.0
7
+ * Recognize and record `normalized_path_info` in Rails applications, per 1.4 AppMap format version.
8
+
9
+ # v0.38.1
10
+ * Package configuration can be `shallow`, in case which only the initial entry into the package is recorded.
11
+
12
+ # v0.37.2
13
+ * Fix ParameterFilter deprecation warning.
14
+
15
+ # v0.37.1
16
+ * Fix parameter mapping with keyword and rest arguments.
17
+
18
+ # v0.37.0
19
+ * Capture method source and comment.
20
+
1
21
  # v0.36.0
2
22
  * *appmap.yml* package definition may specify `gem`.
3
23
  * Skip loading the railtie if `APPMAP_INITIALIZE` environment variable
data/README.md CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  - [About](#about)
2
3
  - [Installation](#installation)
3
4
  - [Configuration](#configuration)
@@ -13,7 +14,7 @@
13
14
  - [Using fixture apps](#using-fixture-apps)
14
15
  - [`test/fixtures`](#testfixtures)
15
16
  - [`spec/fixtures`](#specfixtures)
16
- - [Build status](#build-status)
17
+
17
18
 
18
19
  # About
19
20
 
@@ -27,8 +28,9 @@ granular than a full debug trace. It's designed to be optimal for understanding
27
28
  There are several ways to record AppMaps of your Ruby program using the `appmap` gem:
28
29
 
29
30
  * Run your RSpec tests with the environment variable `APPMAP=true`. An AppMap will be generated for each spec.
30
- * Run your application server with AppMap remote recording enabled, and use the AppMap.
31
- browser extension to start, stop, and upload recordings.
31
+ * Run your application server with AppMap remote recording enabled, and use the [AppLand
32
+ browser extension](https://github.com/applandinc/appland-browser-extension) to start,
33
+ stop, and upload recordings.
32
34
  * Run the command `appmap record <program>` to record the entire execution of a program.
33
35
 
34
36
  Once you have recorded some AppMaps (for example, by running RSpec tests), you use the `appland upload` command
@@ -37,6 +39,13 @@ by the [AppLand CLI](https://github.com/applandinc/appland-cli/releases).
37
39
  Then, on the [AppLand website](https://app.land), you can
38
40
  visualize the design of your code and share links with collaborators.
39
41
 
42
+ ### Supported versions
43
+
44
+ * Ruby 2.5, 2.6, 2.7
45
+ * Rails 5, 6
46
+
47
+ Support for new versions is added frequently, please check back regularly for updates.
48
+
40
49
  # Installation
41
50
 
42
51
  Add `gem 'appmap'` to your Gemfile just as you would any other dependency.
@@ -91,6 +100,9 @@ Each entry in the `packages` list is a YAML object which has the following keys:
91
100
  * **gem** As an alternative to specifying the path, specify the name of a dependency gem. When using `gem`, don't specify `path`.
92
101
  * **exclude** A list of files and directories which will be ignored. By default, all modules, classes and public
93
102
  functions are inspected.
103
+ * **shallow** When set to `true`, only the first function call entry into a package will be recorded. Subsequent function calls within
104
+ the same package are not recorded unless code execution leaves the package and re-enters it. Default: `true` when using `gem`,
105
+ `false` when using `path`.
94
106
 
95
107
  # Running
96
108
 
@@ -123,7 +135,7 @@ require File.expand_path("../../config/environment", __FILE__)
123
135
  3) Run the tests with the environment variable `APPMAP=true`:
124
136
 
125
137
  ```sh-session
126
- $ APPMAP=true bundle exec rspec -t appmap
138
+ $ APPMAP=true bundle exec rspec
127
139
  ```
128
140
 
129
141
  Each RSpec test will output an AppMap file into the directory `tmp/appmap/rspec`. For example:
@@ -166,16 +178,22 @@ Note that `test_helper.rb` in a Rails project typically loads the application's
166
178
  require_relative '../config/environment'
167
179
  ```
168
180
 
169
- and `appmap/rspec` must be required before this:
181
+ and `appmap/minitest` must be required before this:
170
182
 
171
183
  ```ruby
172
- require 'appmap/rspec'
184
+ require 'appmap/minitest'
173
185
  require_relative '../config/environment'
174
186
  ```
175
187
 
176
- 2) Run the tests with the environment variable `APPMAP=true`:
188
+ 2) Run your tests as you normally would with the environment variable `APPMAP=true`. For example:
177
189
 
178
- ```sh-session
190
+ ```
191
+ $ APPMAP=true bundle exec rake
192
+ ```
193
+
194
+ or
195
+
196
+ ```
179
197
  $ APPMAP=true bundle exec -Ilib -Itest test/*
180
198
  ```
181
199
 
@@ -250,11 +268,11 @@ end
250
268
  $ bundle exec rails server
251
269
  ```
252
270
 
253
- 4. Open the AppApp browser extension and push `Start`.
271
+ 4. Open the AppLand browser extension and push `Start`.
254
272
 
255
273
  5. Use your app. For example, perform a login flow, or run through a manual UI test.
256
274
 
257
- 6. Open the AppApp browser extension and push `Stop`. The recording will be transferred to the AppLand website and opened in your browser.
275
+ 6. Open the AppLand browser extension and push `Stop`. The recording will be transferred to the AppLand website and opened in your browser.
258
276
 
259
277
  ## Ruby on Rails
260
278
 
@@ -267,6 +285,7 @@ Note that using this method is kind of a blunt instrument. Recording RSpecs and
267
285
  For instructions on uploading, see the documentation of the [AppLand CLI](https://github.com/applandinc/appland-cli).
268
286
 
269
287
  # Development
288
+ [![Build Status](https://travis-ci.org/applandinc/appmap-ruby.svg?branch=master)](https://travis-ci.org/applandinc/appmap-ruby)
270
289
 
271
290
  ## Running tests
272
291
 
@@ -291,7 +310,7 @@ $ bundle exec rake compile
291
310
  ### `test/fixtures`
292
311
 
293
312
  The fixture apps in `test/fixtures` are plain Ruby projects that exercise the basic functionality of the
294
- `appmap` gem. To develop in a fixture, simple enter the fixture directory and `bundle`.
313
+ `appmap` gem. To develop in a fixture, simply enter the fixture directory and `bundle`.
295
314
 
296
315
  ### `spec/fixtures`
297
316
 
@@ -341,5 +360,3 @@ Finished in 0.07357 seconds (files took 2.1 seconds to load)
341
360
  4 examples, 0 failures
342
361
  ```
343
362
 
344
- # Build status
345
- [![Build Status](https://travis-ci.org/applandinc/appmap-ruby.svg?branch=master)](https://travis-ci.org/applandinc/appmap-ruby)
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ $: << File.join(__dir__, 'lib')
1
2
  require 'appmap/version'
2
3
  GEM_VERSION = AppMap::VERSION
3
4
 
@@ -17,12 +18,12 @@ namespace 'gem' do
17
18
  require 'bundler/gem_tasks'
18
19
  end
19
20
 
20
- RUBY_VERSIONS=%w[2.5 2.6]
21
- FIXTURE_APPS=%w[rack_users_app rails_users_app rails4_users_app]
21
+ RUBY_VERSIONS=%w[2.5 2.6 2.7]
22
+ FIXTURE_APPS=%w[rack_users_app rails6_users_app rails5_users_app]
22
23
 
23
24
  def run_cmd(*cmd)
24
25
  $stderr.puts "Running: #{cmd}"
25
- out,s = Open3.capture2e(*cmd)
26
+ out, s = Open3.capture2e(*cmd)
26
27
  unless s.success?
27
28
  $stderr.puts <<-END
28
29
  Command failed:
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency 'activesupport'
28
28
  spec.add_dependency 'faraday'
29
29
  spec.add_dependency 'gli'
30
+ spec.add_dependency 'method_source'
30
31
  spec.add_dependency 'parser'
31
32
  spec.add_dependency 'rack'
32
33
 
@@ -83,8 +83,8 @@ module AppMap
83
83
  end
84
84
 
85
85
  # Builds a class map from a config and a list of Ruby methods.
86
- def class_map(methods)
87
- ClassMap.build_from_methods(methods)
86
+ def class_map(methods, options = {})
87
+ ClassMap.build_from_methods(methods, options)
88
88
  end
89
89
 
90
90
  # Returns default metadata detected from the Ruby system and from the
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'method_source'
4
+
3
5
  module AppMap
4
6
  class ClassMap
5
7
  module HasChildren
@@ -48,7 +50,7 @@ module AppMap
48
50
  end
49
51
  end
50
52
  Function = Struct.new(:name) do
51
- attr_accessor :static, :location, :labels
53
+ attr_accessor :static, :location, :labels, :comment, :source
52
54
 
53
55
  def type
54
56
  'function'
@@ -60,24 +62,26 @@ module AppMap
60
62
  type: type,
61
63
  location: location,
62
64
  static: static,
63
- labels: labels
65
+ labels: labels,
66
+ comment: comment,
67
+ source: source
64
68
  }.delete_if { |_, v| v.nil? || v == [] }
65
69
  end
66
70
  end
67
71
  end
68
72
 
69
73
  class << self
70
- def build_from_methods(methods)
74
+ def build_from_methods(methods, options = {})
71
75
  root = Types::Root.new
72
76
  methods.each do |method|
73
- add_function root, method
77
+ add_function root, method, options
74
78
  end
75
79
  root.children.map(&:to_h)
76
80
  end
77
81
 
78
82
  protected
79
83
 
80
- def add_function(root, method)
84
+ def add_function(root, method, include_source: true)
81
85
  package = method.package
82
86
  static = method.static
83
87
 
@@ -109,6 +113,16 @@ module AppMap
109
113
  [ method.defined_class, static ? '.' : '#', method.name ].join
110
114
  end
111
115
 
116
+ if include_source
117
+ begin
118
+ function_info[:source] = method.source
119
+ comment = method.comment || ''
120
+ function_info[:comment] = comment unless comment.empty?
121
+ rescue MethodSource::SourceNotFoundError
122
+ # pass
123
+ end
124
+ end
125
+
112
126
  function_info[:labels] = package.labels if package.labels
113
127
  object_infos << function_info
114
128
 
@@ -2,15 +2,22 @@
2
2
 
3
3
  module AppMap
4
4
  class Config
5
- Package = Struct.new(:path, :gem, :package_name, :exclude, :labels) do
5
+ Package = Struct.new(:path, :gem, :package_name, :exclude, :labels, :shallow) do
6
+ # Indicates that only the entry points to a package will be recorded.
7
+ # Once the code has entered a package, subsequent calls within the package will not be
8
+ # recorded unless the code leaves the package and re-enters it.
9
+ def shallow?
10
+ shallow
11
+ end
12
+
6
13
  class << self
7
- def build_from_path(path, package_name: nil, exclude: [], labels: [])
8
- Package.new(path, nil, package_name, exclude, labels)
14
+ def build_from_path(path, shallow: false, package_name: nil, exclude: [], labels: [])
15
+ Package.new(path, nil, package_name, exclude, labels, shallow)
9
16
  end
10
17
 
11
- def build_from_gem(gem, package_name: nil, exclude: [], labels: [])
18
+ def build_from_gem(gem, shallow: true, package_name: nil, exclude: [], labels: [])
12
19
  gem_paths(gem).map do |gem_path|
13
- Package.new(gem_path, gem, package_name, exclude, labels)
20
+ Package.new(gem_path, gem, package_name, exclude, labels, shallow)
14
21
  end
15
22
  end
16
23
 
@@ -36,7 +43,8 @@ module AppMap
36
43
  package_name: package_name,
37
44
  gem: gem,
38
45
  exclude: exclude.blank? ? nil : exclude,
39
- labels: labels.blank? ? nil : labels
46
+ labels: labels.blank? ? nil : labels,
47
+ shallow: shallow
40
48
  }.compact
41
49
  end
42
50
  end
@@ -49,7 +57,8 @@ module AppMap
49
57
  # Methods that should always be hooked, with their containing
50
58
  # package and labels that should be applied to them.
51
59
  HOOKED_METHODS = {
52
- 'ActiveSupport::SecurityUtils' => Hook.new(:secure_compare, Package.build_from_path('active_support', package_name: 'active_support', labels: %w[security crypto]))
60
+ 'ActiveSupport::SecurityUtils' => Hook.new(:secure_compare, Package.build_from_path('active_support', package_name: 'active_support', labels: %w[security crypto])),
61
+ 'ActionView::Renderer' => Hook.new(:render, Package.build_from_path('action_view', package_name: 'action_view', labels: %w[view]))
53
62
  }.freeze
54
63
 
55
64
  BUILTIN_METHODS = {
@@ -66,7 +75,7 @@ module AppMap
66
75
  'Marshal' => Hook.new(%i[dump load], Package.build_from_path('marshal', labels: %w[serialization marshal])),
67
76
  'Psych' => Hook.new(%i[dump dump_stream load load_stream parse parse_stream], Package.build_from_path('yaml', package_name: 'psych', labels: %w[serialization yaml])),
68
77
  'JSON::Ext::Parser' => Hook.new(:parse, Package.build_from_path('json', package_name: 'json', labels: %w[serialization json])),
69
- 'JSON::Ext::Generator::State' => Hook.new(:generate, Package.build_from_path('json', package_name: 'json', labels: %w[serialization json]))
78
+ 'JSON::Ext::Generator::State' => Hook.new(:generate, Package.build_from_path('json', package_name: 'json', labels: %w[serialization json])),
70
79
  }.freeze
71
80
 
72
81
  attr_reader :name, :packages
@@ -91,9 +100,12 @@ module AppMap
91
100
  raise 'AppMap package configuration should specify gem or path, not both' if gem && path
92
101
 
93
102
  if gem
94
- Package.build_from_gem(gem, exclude: package['exclude'] || [])
103
+ shallow = package['shallow']
104
+ # shallow is true by default for gems
105
+ shallow = true if shallow.nil?
106
+ Package.build_from_gem(gem, exclude: package['exclude'] || [], shallow: shallow)
95
107
  else
96
- [ Package.build_from_path(path, exclude: package['exclude'] || []) ]
108
+ [ Package.build_from_path(path, exclude: package['exclude'] || [], shallow: package['shallow']) ]
97
109
  end
98
110
  end.flatten
99
111
  Config.new config_data['name'], packages
@@ -89,10 +89,25 @@ module AppMap
89
89
  else
90
90
  mc.path = [ defined_class, static ? '.' : '#', method.name ].join
91
91
  end
92
+
93
+ # Check if the method has key parameters. If there are any they'll always be last.
94
+ # If yes, then extract it from arguments.
95
+ has_key = [[:dummy], *method.parameters].last.first.to_s.start_with?('key') && arguments[-1].is_a?(Hash)
96
+ kwargs = has_key && arguments[-1].dup || {}
97
+
92
98
  mc.parameters = method.parameters.map.with_index do |method_param, idx|
93
99
  param_type, param_name = method_param
94
100
  param_name ||= 'arg'
95
- value = arguments[idx]
101
+ value = case param_type
102
+ when :keyrest
103
+ kwargs
104
+ when /^key/
105
+ kwargs.delete param_name
106
+ when :rest
107
+ arguments[idx..(has_key ? -2 : -1)]
108
+ else
109
+ arguments[idx]
110
+ end
96
111
  {
97
112
  name: param_name,
98
113
  class: value.class.name,
@@ -6,6 +6,9 @@ module AppMap
6
6
  class Hook
7
7
  LOG = (ENV['APPMAP_DEBUG'] == 'true' || ENV['DEBUG'] == 'true')
8
8
 
9
+ OBJECT_INSTANCE_METHODS = %i[! != !~ <=> == === =~ __id__ __send__ class clone define_singleton_method display dup enum_for eql? equal? extend freeze frozen? hash inspect instance_eval instance_exec instance_of? instance_variable_defined? instance_variable_get instance_variable_set instance_variables is_a? itself kind_of? method methods nil? object_id private_methods protected_methods public_method public_methods public_send remove_instance_variable respond_to? send singleton_class singleton_method singleton_methods taint tainted? tap then to_enum to_s to_h to_a trust untaint untrust untrusted? yield_self].freeze
10
+ OBJECT_STATIC_METHODS = %i[! != !~ < <= <=> == === =~ > >= __id__ __send__ alias_method allocate ancestors attr attr_accessor attr_reader attr_writer autoload autoload? class class_eval class_exec class_variable_defined? class_variable_get class_variable_set class_variables clone const_defined? const_get const_missing const_set constants define_method define_singleton_method deprecate_constant display dup enum_for eql? equal? extend freeze frozen? hash include include? included_modules inspect instance_eval instance_exec instance_method instance_methods instance_of? instance_variable_defined? instance_variable_get instance_variable_set instance_variables is_a? itself kind_of? method method_defined? methods module_eval module_exec name new nil? object_id prepend private_class_method private_constant private_instance_methods private_method_defined? private_methods protected_instance_methods protected_method_defined? protected_methods public_class_method public_constant public_instance_method public_instance_methods public_method public_method_defined? public_methods public_send remove_class_variable remove_instance_variable remove_method respond_to? send singleton_class singleton_class? singleton_method singleton_methods superclass taint tainted? tap then to_enum to_s trust undef_method untaint untrust untrusted? yield_self].freeze
11
+
9
12
  @unbound_method_arity = ::UnboundMethod.instance_method(:arity)
10
13
  @method_arity = ::Method.instance_method(:arity)
11
14
 
@@ -42,12 +45,17 @@ module AppMap
42
45
  tp = TracePoint.new(:end) do |trace_point|
43
46
  cls = trace_point.self
44
47
 
45
- instance_methods = cls.public_instance_methods(false)
46
- class_methods = cls.singleton_class.public_instance_methods(false) - instance_methods
48
+ instance_methods = cls.public_instance_methods(false) - OBJECT_INSTANCE_METHODS
49
+ class_methods = cls.singleton_class.public_instance_methods(false) - instance_methods - OBJECT_STATIC_METHODS
47
50
 
48
51
  hook = lambda do |hook_cls|
49
52
  lambda do |method_id|
50
- method = hook_cls.public_instance_method(method_id)
53
+ method = begin
54
+ hook_cls.public_instance_method(method_id)
55
+ rescue NameError
56
+ warn "AppMap: Method #{hook_cls} #{method.name} is not accessible" if LOG
57
+ return
58
+ end
51
59
 
52
60
  warn "AppMap: Examining #{hook_cls} #{method.name}" if LOG
53
61