appmap 0.18.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 (262) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +5 -0
  3. data/.gitignore +17 -0
  4. data/.rubocop.yml +18 -0
  5. data/.ruby-version +1 -0
  6. data/CHANGELOG.md +100 -0
  7. data/Dockerfile.appmap +5 -0
  8. data/Gemfile +5 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +133 -0
  11. data/Rakefile +117 -0
  12. data/appmap.gemspec +41 -0
  13. data/appmap.yml +8 -0
  14. data/examples/install.rb +76 -0
  15. data/examples/mock_webapp/Gemfile +1 -0
  16. data/examples/mock_webapp/appmap.yml +2 -0
  17. data/examples/mock_webapp/exe/mock_webapp_request +12 -0
  18. data/examples/mock_webapp/lib/mock_webapp/controller.rb +23 -0
  19. data/examples/mock_webapp/lib/mock_webapp/request.rb +12 -0
  20. data/examples/mock_webapp/lib/mock_webapp/user.rb +18 -0
  21. data/exe/_appmap-record-self +49 -0
  22. data/exe/appmap +168 -0
  23. data/lib/appmap/algorithm/prune_class_map.rb +65 -0
  24. data/lib/appmap/command/inspect.rb +11 -0
  25. data/lib/appmap/command/record.rb +91 -0
  26. data/lib/appmap/command/upload.rb +103 -0
  27. data/lib/appmap/config/directory.rb +65 -0
  28. data/lib/appmap/config/file.rb +13 -0
  29. data/lib/appmap/config/named_function.rb +21 -0
  30. data/lib/appmap/config/package_dir.rb +52 -0
  31. data/lib/appmap/config/path.rb +25 -0
  32. data/lib/appmap/config.rb +65 -0
  33. data/lib/appmap/feature.rb +262 -0
  34. data/lib/appmap/inspect/inspector.rb +99 -0
  35. data/lib/appmap/inspect/parse_node.rb +170 -0
  36. data/lib/appmap/inspect/parser.rb +15 -0
  37. data/lib/appmap/inspect.rb +91 -0
  38. data/lib/appmap/middleware/remote_recording.rb +122 -0
  39. data/lib/appmap/parser.rb +60 -0
  40. data/lib/appmap/rails/action_handler.rb +77 -0
  41. data/lib/appmap/rails/sql_handler.rb +148 -0
  42. data/lib/appmap/railtie.rb +32 -0
  43. data/lib/appmap/rspec/parse_node.rb +41 -0
  44. data/lib/appmap/rspec/parser.rb +15 -0
  45. data/lib/appmap/rspec.rb +288 -0
  46. data/lib/appmap/trace/event_handler/rack_handler_webrick.rb +65 -0
  47. data/lib/appmap/trace/tracer.rb +347 -0
  48. data/lib/appmap/version.rb +5 -0
  49. data/lib/appmap.rb +26 -0
  50. data/lore/pages/2019-05-21-install-and-record/index.pug +51 -0
  51. data/lore/pages/2019-05-21-install-and-record/install_example_appmap.png +0 -0
  52. data/lore/pages/2019-05-21-install-and-record/metadata.yml +5 -0
  53. data/lore/pages/layout.pug +66 -0
  54. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap-grid.css +1912 -0
  55. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap-grid.css.map +1 -0
  56. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap-grid.min.css +7 -0
  57. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap-grid.min.css.map +1 -0
  58. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap-reboot.css +331 -0
  59. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap-reboot.css.map +1 -0
  60. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap-reboot.min.css +8 -0
  61. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap-reboot.min.css.map +1 -0
  62. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap.css +9030 -0
  63. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap.css.map +1 -0
  64. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap.min.css +7 -0
  65. data/lore/public/lib/bootstrap-4.1.3/css/bootstrap.min.css.map +1 -0
  66. data/lore/public/stylesheets/style.css +8 -0
  67. data/package-lock.json +1066 -0
  68. data/package.json +24 -0
  69. data/spec/abstract_controller4_base_spec.rb +58 -0
  70. data/spec/abstract_controller_base_spec.rb +59 -0
  71. data/spec/fixtures/rack_users_app/.dockerignore +2 -0
  72. data/spec/fixtures/rack_users_app/.gitignore +2 -0
  73. data/spec/fixtures/rack_users_app/Dockerfile +32 -0
  74. data/spec/fixtures/rack_users_app/Gemfile +10 -0
  75. data/spec/fixtures/rack_users_app/appmap.yml +3 -0
  76. data/spec/fixtures/rack_users_app/config.ru +2 -0
  77. data/spec/fixtures/rack_users_app/docker-compose.yml +9 -0
  78. data/spec/fixtures/rack_users_app/lib/app.rb +36 -0
  79. data/spec/fixtures/rails4_users_app/.gitignore +13 -0
  80. data/spec/fixtures/rails4_users_app/.rbenv-gemsets +2 -0
  81. data/spec/fixtures/rails4_users_app/.ruby-version +1 -0
  82. data/spec/fixtures/rails4_users_app/Dockerfile +30 -0
  83. data/spec/fixtures/rails4_users_app/Dockerfile.pg +3 -0
  84. data/spec/fixtures/rails4_users_app/Gemfile +77 -0
  85. data/spec/fixtures/rails4_users_app/README.rdoc +28 -0
  86. data/spec/fixtures/rails4_users_app/Rakefile +6 -0
  87. data/spec/fixtures/rails4_users_app/app/assets/images/.keep +0 -0
  88. data/spec/fixtures/rails4_users_app/app/assets/javascripts/application.js +16 -0
  89. data/spec/fixtures/rails4_users_app/app/assets/stylesheets/application.css +15 -0
  90. data/spec/fixtures/rails4_users_app/app/controllers/api/users_controller.rb +27 -0
  91. data/spec/fixtures/rails4_users_app/app/controllers/application_controller.rb +5 -0
  92. data/spec/fixtures/rails4_users_app/app/controllers/concerns/.keep +0 -0
  93. data/spec/fixtures/rails4_users_app/app/controllers/health_controller.rb +5 -0
  94. data/spec/fixtures/rails4_users_app/app/controllers/users_controller.rb +5 -0
  95. data/spec/fixtures/rails4_users_app/app/helpers/application_helper.rb +2 -0
  96. data/spec/fixtures/rails4_users_app/app/mailers/.keep +0 -0
  97. data/spec/fixtures/rails4_users_app/app/models/.keep +0 -0
  98. data/spec/fixtures/rails4_users_app/app/models/concerns/.keep +0 -0
  99. data/spec/fixtures/rails4_users_app/app/models/user.rb +18 -0
  100. data/spec/fixtures/rails4_users_app/app/views/layouts/application.html.haml +7 -0
  101. data/spec/fixtures/rails4_users_app/app/views/users/index.html.haml +7 -0
  102. data/spec/fixtures/rails4_users_app/appmap.yml +3 -0
  103. data/spec/fixtures/rails4_users_app/bin/rails +9 -0
  104. data/spec/fixtures/rails4_users_app/bin/setup +29 -0
  105. data/spec/fixtures/rails4_users_app/bin/spring +17 -0
  106. data/spec/fixtures/rails4_users_app/config/application.rb +26 -0
  107. data/spec/fixtures/rails4_users_app/config/boot.rb +3 -0
  108. data/spec/fixtures/rails4_users_app/config/database.yml +17 -0
  109. data/spec/fixtures/rails4_users_app/config/environment.rb +5 -0
  110. data/spec/fixtures/rails4_users_app/config/environments/development.rb +41 -0
  111. data/spec/fixtures/rails4_users_app/config/environments/production.rb +79 -0
  112. data/spec/fixtures/rails4_users_app/config/environments/test.rb +42 -0
  113. data/spec/fixtures/rails4_users_app/config/initializers/assets.rb +11 -0
  114. data/spec/fixtures/rails4_users_app/config/initializers/backtrace_silencers.rb +7 -0
  115. data/spec/fixtures/rails4_users_app/config/initializers/cookies_serializer.rb +3 -0
  116. data/spec/fixtures/rails4_users_app/config/initializers/filter_parameter_logging.rb +4 -0
  117. data/spec/fixtures/rails4_users_app/config/initializers/inflections.rb +16 -0
  118. data/spec/fixtures/rails4_users_app/config/initializers/mime_types.rb +4 -0
  119. data/spec/fixtures/rails4_users_app/config/initializers/session_store.rb +3 -0
  120. data/spec/fixtures/rails4_users_app/config/initializers/to_time_preserves_timezone.rb +10 -0
  121. data/spec/fixtures/rails4_users_app/config/initializers/wrap_parameters.rb +14 -0
  122. data/spec/fixtures/rails4_users_app/config/locales/en.yml +23 -0
  123. data/spec/fixtures/rails4_users_app/config/routes.rb +12 -0
  124. data/spec/fixtures/rails4_users_app/config/secrets.yml +22 -0
  125. data/spec/fixtures/rails4_users_app/config.ru +4 -0
  126. data/spec/fixtures/rails4_users_app/create_app +23 -0
  127. data/spec/fixtures/rails4_users_app/db/migrate/20191127112304_create_users.rb +10 -0
  128. data/spec/fixtures/rails4_users_app/db/schema.rb +26 -0
  129. data/spec/fixtures/rails4_users_app/db/seeds.rb +7 -0
  130. data/spec/fixtures/rails4_users_app/docker-compose.yml +24 -0
  131. data/spec/fixtures/rails4_users_app/lib/assets/.keep +0 -0
  132. data/spec/fixtures/rails4_users_app/lib/tasks/.keep +0 -0
  133. data/spec/fixtures/rails4_users_app/log/.keep +0 -0
  134. data/spec/fixtures/rails4_users_app/public/404.html +67 -0
  135. data/spec/fixtures/rails4_users_app/public/422.html +67 -0
  136. data/spec/fixtures/rails4_users_app/public/500.html +66 -0
  137. data/spec/fixtures/rails4_users_app/public/favicon.ico +0 -0
  138. data/spec/fixtures/rails4_users_app/public/robots.txt +5 -0
  139. data/spec/fixtures/rails4_users_app/spec/controllers/users_controller_api_spec.rb +49 -0
  140. data/spec/fixtures/rails4_users_app/spec/rails_helper.rb +95 -0
  141. data/spec/fixtures/rails4_users_app/spec/spec_helper.rb +96 -0
  142. data/spec/fixtures/rails4_users_app/test/fixtures/users.yml +9 -0
  143. data/spec/fixtures/rails_users_app/.dockerignore +1 -0
  144. data/spec/fixtures/rails_users_app/.gitignore +39 -0
  145. data/spec/fixtures/rails_users_app/.rspec +1 -0
  146. data/spec/fixtures/rails_users_app/.ruby-version +1 -0
  147. data/spec/fixtures/rails_users_app/Dockerfile +29 -0
  148. data/spec/fixtures/rails_users_app/Dockerfile.pg +3 -0
  149. data/spec/fixtures/rails_users_app/Gemfile +51 -0
  150. data/spec/fixtures/rails_users_app/Rakefile +6 -0
  151. data/spec/fixtures/rails_users_app/app/controllers/api/users_controller.rb +27 -0
  152. data/spec/fixtures/rails_users_app/app/controllers/application_controller.rb +2 -0
  153. data/spec/fixtures/rails_users_app/app/controllers/concerns/.keep +0 -0
  154. data/spec/fixtures/rails_users_app/app/controllers/health_controller.rb +5 -0
  155. data/spec/fixtures/rails_users_app/app/controllers/users_controller.rb +5 -0
  156. data/spec/fixtures/rails_users_app/app/models/activerecord/user.rb +18 -0
  157. data/spec/fixtures/rails_users_app/app/models/concerns/.keep +0 -0
  158. data/spec/fixtures/rails_users_app/app/models/sequel/user.rb +25 -0
  159. data/spec/fixtures/rails_users_app/app/views/layouts/application.html.haml +7 -0
  160. data/spec/fixtures/rails_users_app/app/views/users/index.html.haml +7 -0
  161. data/spec/fixtures/rails_users_app/appmap.yml +3 -0
  162. data/spec/fixtures/rails_users_app/bin/_appmap-record-self +29 -0
  163. data/spec/fixtures/rails_users_app/bin/appmap +29 -0
  164. data/spec/fixtures/rails_users_app/bin/byebug +29 -0
  165. data/spec/fixtures/rails_users_app/bin/gli +29 -0
  166. data/spec/fixtures/rails_users_app/bin/htmldiff +29 -0
  167. data/spec/fixtures/rails_users_app/bin/ldiff +29 -0
  168. data/spec/fixtures/rails_users_app/bin/nokogiri +29 -0
  169. data/spec/fixtures/rails_users_app/bin/rackup +29 -0
  170. data/spec/fixtures/rails_users_app/bin/rails +4 -0
  171. data/spec/fixtures/rails_users_app/bin/rake +29 -0
  172. data/spec/fixtures/rails_users_app/bin/rspec +29 -0
  173. data/spec/fixtures/rails_users_app/bin/ruby-parse +29 -0
  174. data/spec/fixtures/rails_users_app/bin/ruby-rewrite +29 -0
  175. data/spec/fixtures/rails_users_app/bin/sequel +29 -0
  176. data/spec/fixtures/rails_users_app/bin/setup +25 -0
  177. data/spec/fixtures/rails_users_app/bin/sprockets +29 -0
  178. data/spec/fixtures/rails_users_app/bin/thor +29 -0
  179. data/spec/fixtures/rails_users_app/bin/update +25 -0
  180. data/spec/fixtures/rails_users_app/config/application.rb +51 -0
  181. data/spec/fixtures/rails_users_app/config/boot.rb +3 -0
  182. data/spec/fixtures/rails_users_app/config/credentials.yml.enc +1 -0
  183. data/spec/fixtures/rails_users_app/config/database.yml +17 -0
  184. data/spec/fixtures/rails_users_app/config/environment.rb +5 -0
  185. data/spec/fixtures/rails_users_app/config/environments/development.rb +40 -0
  186. data/spec/fixtures/rails_users_app/config/environments/production.rb +68 -0
  187. data/spec/fixtures/rails_users_app/config/environments/test.rb +36 -0
  188. data/spec/fixtures/rails_users_app/config/initializers/application_controller_renderer.rb +8 -0
  189. data/spec/fixtures/rails_users_app/config/initializers/backtrace_silencers.rb +7 -0
  190. data/spec/fixtures/rails_users_app/config/initializers/cors.rb +16 -0
  191. data/spec/fixtures/rails_users_app/config/initializers/filter_parameter_logging.rb +4 -0
  192. data/spec/fixtures/rails_users_app/config/initializers/inflections.rb +16 -0
  193. data/spec/fixtures/rails_users_app/config/initializers/mime_types.rb +4 -0
  194. data/spec/fixtures/rails_users_app/config/initializers/record_button.rb +3 -0
  195. data/spec/fixtures/rails_users_app/config/initializers/wrap_parameters.rb +9 -0
  196. data/spec/fixtures/rails_users_app/config/locales/en.yml +33 -0
  197. data/spec/fixtures/rails_users_app/config/routes.rb +11 -0
  198. data/spec/fixtures/rails_users_app/config.ru +5 -0
  199. data/spec/fixtures/rails_users_app/create_app +11 -0
  200. data/spec/fixtures/rails_users_app/db/migrate/20190728211408_create_users.rb +9 -0
  201. data/spec/fixtures/rails_users_app/db/schema.rb +23 -0
  202. data/spec/fixtures/rails_users_app/docker-compose.yml +24 -0
  203. data/spec/fixtures/rails_users_app/lib/tasks/.keep +0 -0
  204. data/spec/fixtures/rails_users_app/log/.keep +0 -0
  205. data/spec/fixtures/rails_users_app/public/robots.txt +1 -0
  206. data/spec/fixtures/rails_users_app/spec/controllers/users_controller_api_spec.rb +29 -0
  207. data/spec/fixtures/rails_users_app/spec/models/user_spec.rb +39 -0
  208. data/spec/fixtures/rails_users_app/spec/rails_helper.rb +66 -0
  209. data/spec/fixtures/rails_users_app/spec/spec_helper.rb +96 -0
  210. data/spec/fixtures/rails_users_app/users_app/.gitignore +20 -0
  211. data/spec/rack_handler_webrick_spec.rb +59 -0
  212. data/spec/rails_spec_helper.rb +34 -0
  213. data/spec/railtie_spec.rb +35 -0
  214. data/spec/record_sql_rails4_pg_spec.rb +76 -0
  215. data/spec/record_sql_rails_pg_spec.rb +68 -0
  216. data/spec/rspec_feature_metadata_spec.rb +30 -0
  217. data/spec/spec_helper.rb +6 -0
  218. data/test/cli_test.rb +81 -0
  219. data/test/config_test.rb +149 -0
  220. data/test/explict_inspect_test.rb +29 -0
  221. data/test/fixtures/active_record_like/active_record/aggregations.rb +4 -0
  222. data/test/fixtures/active_record_like/active_record/association.rb +4 -0
  223. data/test/fixtures/active_record_like/active_record/associations/join_dependency/join_base.rb +8 -0
  224. data/test/fixtures/active_record_like/active_record/associations/join_dependency/join_part.rb +8 -0
  225. data/test/fixtures/active_record_like/active_record/associations/join_dependency.rb +6 -0
  226. data/test/fixtures/active_record_like/active_record/caps/caps.rb +4 -0
  227. data/test/fixtures/active_record_like/active_record.rb +2 -0
  228. data/test/fixtures/cli_record_test/appmap.yml +2 -0
  229. data/test/fixtures/cli_record_test/lib/cli_record_test/main.rb +7 -0
  230. data/test/fixtures/ignore_non_ruby_file/class.rb +3 -0
  231. data/test/fixtures/ignore_non_ruby_file/non-ruby.txt +1 -0
  232. data/test/fixtures/includes_excludes/lib/a/a_1.rb +6 -0
  233. data/test/fixtures/includes_excludes/lib/a/a_2.rb +6 -0
  234. data/test/fixtures/includes_excludes/lib/a/x/x_1.rb +8 -0
  235. data/test/fixtures/includes_excludes/lib/b/b_1.rb +6 -0
  236. data/test/fixtures/includes_excludes/lib/root_1.rb +4 -0
  237. data/test/fixtures/inspect_multiple_subdirs/module_a/class_a.rb +5 -0
  238. data/test/fixtures/inspect_multiple_subdirs/module_a.rb +2 -0
  239. data/test/fixtures/inspect_multiple_subdirs/module_b/class_b.rb +5 -0
  240. data/test/fixtures/inspect_multiple_subdirs/module_b/class_c.rb +5 -0
  241. data/test/fixtures/inspect_multiple_subdirs/module_b.rb +2 -0
  242. data/test/fixtures/inspect_package/module_a/module_b/class_in_module.rb +6 -0
  243. data/test/fixtures/parse_file/defs_static_function.rb +96 -0
  244. data/test/fixtures/parse_file/function_within_class.rb +36 -0
  245. data/test/fixtures/parse_file/include_public_methods.rb +127 -0
  246. data/test/fixtures/parse_file/instance_function.rb +17 -0
  247. data/test/fixtures/parse_file/modules.rb +71 -0
  248. data/test/fixtures/parse_file/sclass_static_function.rb +88 -0
  249. data/test/fixtures/parse_file/toplevel_class.rb +13 -0
  250. data/test/fixtures/parse_file/toplevel_function.rb +14 -0
  251. data/test/fixtures/rspec_recorder/Gemfile +5 -0
  252. data/test/fixtures/rspec_recorder/appmap.yml +3 -0
  253. data/test/fixtures/rspec_recorder/lib/hello.rb +5 -0
  254. data/test/fixtures/rspec_recorder/spec/hello_spec.rb +9 -0
  255. data/test/fixtures/trace_test/trace_program_1.rb +44 -0
  256. data/test/implicit_inspect_test.rb +33 -0
  257. data/test/include_exclude_test.rb +48 -0
  258. data/test/prerecorded_trace_test.rb +76 -0
  259. data/test/rspec_test.rb +22 -0
  260. data/test/test_helper.rb +46 -0
  261. data/test/trace_test.rb +92 -0
  262. metadata +501 -0
@@ -0,0 +1,127 @@
1
+ # @appmap include=public_methods
2
+ class Main
3
+ class << self
4
+ def sclass_function
5
+ end
6
+ end
7
+
8
+ def public_function
9
+ end
10
+
11
+ protected
12
+
13
+ def protected_function
14
+ end
15
+
16
+ def Main.protected_function_2
17
+ end
18
+
19
+ def self.protected_function_3
20
+ end
21
+
22
+ public
23
+
24
+ def public_function_2
25
+ end
26
+ end
27
+
28
+ module Mod
29
+ end
30
+
31
+ # @appmap include=public_methods
32
+ class M2
33
+ include Mod
34
+
35
+ def public_function_3
36
+ end
37
+ end
38
+
39
+ puts DATA.read
40
+ __END__
41
+ {
42
+ "explicit": [
43
+ {
44
+ "name": "Main",
45
+ "location": "$FIXTURE_DIR/include_public_methods.rb:2",
46
+ "attributes": {
47
+ "include": "public_methods"
48
+ },
49
+ "type": "class",
50
+ "children": [
51
+ {
52
+ "name": "public_function",
53
+ "location": "$FIXTURE_DIR/include_public_methods.rb:8",
54
+ "type": "function",
55
+ "static": false
56
+ },
57
+ {
58
+ "name": "public_function_2",
59
+ "location": "$FIXTURE_DIR/include_public_methods.rb:24",
60
+ "type": "function",
61
+ "static": false
62
+ }
63
+ ]
64
+ },
65
+ {
66
+ "name": "M2",
67
+ "location": "$FIXTURE_DIR/include_public_methods.rb:32",
68
+ "attributes": {
69
+ "include": "public_methods"
70
+ },
71
+ "type": "class",
72
+ "children": [
73
+ {
74
+ "name": "public_function_3",
75
+ "location": "$FIXTURE_DIR/include_public_methods.rb:35",
76
+ "type": "function",
77
+ "static": false
78
+ }
79
+ ]
80
+ }
81
+ ],
82
+ "implicit": [
83
+ {
84
+ "name": "Main",
85
+ "location": "$FIXTURE_DIR/include_public_methods.rb:2",
86
+ "type": "class",
87
+ "children": [
88
+ {
89
+ "name": "sclass_function",
90
+ "location": "$FIXTURE_DIR/include_public_methods.rb:4",
91
+ "type": "function",
92
+ "static": true
93
+ },
94
+ {
95
+ "name": "public_function",
96
+ "location": "$FIXTURE_DIR/include_public_methods.rb:8",
97
+ "type": "function",
98
+ "static": false
99
+ },
100
+ {
101
+ "name": "public_function_2",
102
+ "location": "$FIXTURE_DIR/include_public_methods.rb:24",
103
+ "type": "function",
104
+ "static": false
105
+ }
106
+ ]
107
+ },
108
+ {
109
+ "name": "Mod",
110
+ "location": "$FIXTURE_DIR/include_public_methods.rb:28",
111
+ "type": "class"
112
+ },
113
+ {
114
+ "name": "M2",
115
+ "location": "$FIXTURE_DIR/include_public_methods.rb:32",
116
+ "type": "class",
117
+ "children": [
118
+ {
119
+ "name": "public_function_3",
120
+ "location": "$FIXTURE_DIR/include_public_methods.rb:35",
121
+ "type": "function",
122
+ "static": false
123
+ }
124
+ ]
125
+ }
126
+ ]
127
+ }
@@ -0,0 +1,17 @@
1
+ class Main
2
+ # @appmap
3
+ def instance_func
4
+ end
5
+ end
6
+
7
+ puts DATA.read
8
+ __END__
9
+ [
10
+ {
11
+ "name": "instance_func",
12
+ "location": "$FIXTURE_DIR/instance_func.rb:3",
13
+ "type": "function",
14
+ "class_name": "Main",
15
+ "static": false
16
+ }
17
+ ]
@@ -0,0 +1,71 @@
1
+ module Main
2
+ def main_func; end
3
+
4
+ module MainModule
5
+ def module_func; end
6
+
7
+ def MainModule.module_class_func; end
8
+ end
9
+
10
+ class Cls
11
+ module ClsModule
12
+ def cls_module_func; end
13
+ end
14
+ end
15
+ end
16
+ puts DATA.read
17
+ __END__
18
+ [
19
+ {
20
+ "name": "Main",
21
+ "location": "$FIXTURE_DIR/modules.rb:1",
22
+ "type": "class",
23
+ "children": [
24
+ {
25
+ "name": "main_func",
26
+ "location": "$FIXTURE_DIR/modules.rb:2",
27
+ "type": "function",
28
+ "static": false
29
+ },
30
+ {
31
+ "name": "MainModule",
32
+ "location": "$FIXTURE_DIR/modules.rb:4",
33
+ "type": "class",
34
+ "children": [
35
+ {
36
+ "name": "module_func",
37
+ "location": "$FIXTURE_DIR/modules.rb:5",
38
+ "type": "function",
39
+ "static": false
40
+ },
41
+ {
42
+ "name": "module_class_func",
43
+ "location": "$FIXTURE_DIR/modules.rb:7",
44
+ "type": "function",
45
+ "static": true
46
+ }
47
+ ]
48
+ },
49
+ {
50
+ "name": "Cls",
51
+ "location": "$FIXTURE_DIR/modules.rb:10",
52
+ "type": "class",
53
+ "children": [
54
+ {
55
+ "name": "ClsModule",
56
+ "location": "$FIXTURE_DIR/modules.rb:11",
57
+ "type": "class",
58
+ "children": [
59
+ {
60
+ "name": "cls_module_func",
61
+ "location": "$FIXTURE_DIR/modules.rb:12",
62
+ "type": "function",
63
+ "static": false
64
+ }
65
+ ]
66
+ }
67
+ ]
68
+ }
69
+ ]
70
+ }
71
+ ]
@@ -0,0 +1,88 @@
1
+ obj = Object.new
2
+ class << obj
3
+ # @appmap
4
+ def object_sclass_func
5
+ end
6
+ end
7
+
8
+ class Main
9
+ class << self
10
+ # @appmap
11
+ def main_sclass_func_1
12
+ end
13
+ end
14
+ end
15
+
16
+ class Main2
17
+ class << self
18
+ # @appmap
19
+ def main_sclass_func_1
20
+ end
21
+
22
+ # @appmap
23
+ def main_sclass_func_2
24
+ end
25
+ end
26
+ end
27
+
28
+ puts DATA.read
29
+ __END__
30
+ {
31
+ "explicit": [
32
+ {
33
+ "name": "main_sclass_func_1",
34
+ "location": "$FIXTURE_DIR/sclass_static_function.rb:11",
35
+ "type": "function",
36
+ "class_name": "Main",
37
+ "static": true
38
+ },
39
+ {
40
+ "name": "main_sclass_func_1",
41
+ "location": "$FIXTURE_DIR/sclass_static_function.rb:19",
42
+ "type": "function",
43
+ "class_name": "Main2",
44
+ "static": true
45
+ },
46
+ {
47
+ "name": "main_sclass_func_2",
48
+ "location": "$FIXTURE_DIR/sclass_static_function.rb:23",
49
+ "type": "function",
50
+ "class_name": "Main2",
51
+ "static": true
52
+ }
53
+ ],
54
+ "implicit": [
55
+ {
56
+ "name": "Main",
57
+ "location": "$FIXTURE_DIR/sclass_static_function.rb:8",
58
+ "type": "class",
59
+ "children": [
60
+ {
61
+ "name": "main_sclass_func_1",
62
+ "location": "$FIXTURE_DIR/sclass_static_function.rb:11",
63
+ "type": "function",
64
+ "static": true
65
+ }
66
+ ]
67
+ },
68
+ {
69
+ "name": "Main2",
70
+ "location": "$FIXTURE_DIR/sclass_static_function.rb:16",
71
+ "type": "class",
72
+ "children": [
73
+ {
74
+ "name": "main_sclass_func_1",
75
+ "location": "$FIXTURE_DIR/sclass_static_function.rb:19",
76
+ "type": "function",
77
+ "static": true
78
+ },
79
+ {
80
+ "name": "main_sclass_func_2",
81
+ "location": "$FIXTURE_DIR/sclass_static_function.rb:23",
82
+ "type": "function",
83
+ "static": true
84
+ }
85
+ ]
86
+ }
87
+ ]
88
+ }
@@ -0,0 +1,13 @@
1
+ # @appmap
2
+ class Main
3
+ end
4
+
5
+ puts DATA.read
6
+ __END__
7
+ [
8
+ {
9
+ "name": "Main",
10
+ "location": "$FIXTURE_DIR/toplevel_class.rb:2",
11
+ "type": "class"
12
+ }
13
+ ]
@@ -0,0 +1,14 @@
1
+ # @appmap
2
+ def main
3
+ end
4
+
5
+ puts DATA.read
6
+ __END__
7
+ [
8
+ {
9
+ "name": "main",
10
+ "location": "$FIXTURE_DIR/toplevel_function.rb:2",
11
+ "type": "function",
12
+ "static": false
13
+ }
14
+ ]
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'appmap', git: '../../..', branch: `git rev-parse --abbrev-ref HEAD`.strip
4
+ gem 'byebug'
5
+ gem 'rspec'
@@ -0,0 +1,3 @@
1
+ name: rspec_recorder
2
+ packages:
3
+ - path: lib
@@ -0,0 +1,5 @@
1
+ class Hello
2
+ def say_hello
3
+ 'Hello!'
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ require 'rspec'
2
+ require 'appmap/rspec'
3
+ require 'hello'
4
+
5
+ describe Hello, feature_group: 'Hello' do
6
+ it 'says hello', feature: 'Say hello', appmap: true do
7
+ expect(Hello.new.say_hello).to eq('Hello!')
8
+ end
9
+ end
@@ -0,0 +1,44 @@
1
+ module Fixtures
2
+ module TraceTest
3
+ module TraceProgram1
4
+ class Main
5
+ def initialize(printer)
6
+ @printer = printer
7
+ end
8
+
9
+ def say(msg)
10
+ @printer.say(msg)
11
+ end
12
+ end
13
+
14
+ module Printer
15
+ # Stdout is a class with a 'say' instance method.
16
+ class Stdout
17
+ def say(msg)
18
+ puts(msg)
19
+ end
20
+ end
21
+
22
+ # Define 'say' on a static class method.
23
+ class Stderr
24
+ class << self
25
+ def say(msg)
26
+ warn(msg)
27
+ end
28
+ end
29
+ end
30
+
31
+ # make_stderr_printer builds an object which modifies 'say' to print to stderr.
32
+ def Printer.make_stderr_printer
33
+ Stdout.new.tap do |err_printer|
34
+ class << err_printer
35
+ def say(msg)
36
+ warn(msg)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_helper'
2
+
3
+ class ImplicitInspectTest < Minitest::Test
4
+ include FixtureFile
5
+
6
+ def test_toplevel_class
7
+ assert_fixture_features :implicit, 'toplevel_class.rb'
8
+ end
9
+
10
+ def test_defs_static_function
11
+ assert_fixture_features :implicit, 'defs_static_function.rb'
12
+ end
13
+
14
+ def test_sclass_static_function
15
+ assert_fixture_features :implicit, 'sclass_static_function.rb'
16
+ end
17
+
18
+ def test_toplevel_function
19
+ assert_fixture_features :implicit, 'toplevel_function.rb'
20
+ end
21
+
22
+ def test_function_within_class
23
+ assert_fixture_features :implicit, 'function_within_class.rb'
24
+ end
25
+
26
+ def test_include_public_methods
27
+ assert_fixture_features :implicit, 'include_public_methods.rb'
28
+ end
29
+
30
+ def test_modules
31
+ assert_fixture_features :implicit, 'modules.rb'
32
+ end
33
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+ require 'appmap/config'
5
+
6
+ class IncludeExcludeTest < Minitest::Test
7
+ include FixtureFile
8
+
9
+ INCLUDE_EXCLUDE_FIXTURE_DIR = File.join(FIXTURE_DIR, 'includes_excludes')
10
+
11
+ def setup
12
+ @package_dir = AppMap::Config::PackageDir.new(File.join(INCLUDE_EXCLUDE_FIXTURE_DIR, 'lib')).tap do |c|
13
+ c.package_name = 'include_exclude'
14
+ end
15
+ end
16
+
17
+ def test_exclude_dir
18
+ @package_dir.exclude = %w[b]
19
+ assert_equal %w[lib/root_1.rb lib/a], normalized_children
20
+ end
21
+
22
+ def test_exclude_file
23
+ @package_dir.exclude = %w[root_1.rb]
24
+ assert_equal %w[lib/a lib/b], normalized_children
25
+ end
26
+
27
+ def test_exclude_subfile
28
+ @package_dir.exclude = %w[a/a_1.rb root_1.rb b]
29
+ assert_equal %w[lib/a], normalized_children
30
+ assert_equal %w[lib/a/a_2.rb lib/a/x], normalize_paths(@package_dir.children.first.children.map(&:path))
31
+ end
32
+
33
+ def test_exclude_subdir
34
+ @package_dir.exclude = %w[a/a_1.rb root_1.rb b a/x]
35
+ assert_equal %w[lib/a], normalized_children
36
+ assert_equal %w[lib/a/a_2.rb], normalize_paths(@package_dir.children.first.children.map(&:path))
37
+ end
38
+
39
+ protected
40
+
41
+ def normalized_children
42
+ normalize_paths(@package_dir.children.map(&:path))
43
+ end
44
+
45
+ def normalize_paths(paths)
46
+ paths.map { |p| Pathname.new(p).to_s.gsub("#{INCLUDE_EXCLUDE_FIXTURE_DIR}/", '') }
47
+ end
48
+ end
@@ -0,0 +1,76 @@
1
+ require 'test_helper'
2
+ require 'appmap'
3
+ require 'appmap/config'
4
+ require 'appmap/inspect'
5
+ require 'appmap/trace/tracer'
6
+
7
+ class PrerecordedTraceTest < Minitest::Test
8
+ # Runs a sequence of pre-recorded events.
9
+ def test_trace_web_request
10
+ config_yaml = <<-CONFIG
11
+ lib/appmap:
12
+ type: package
13
+ package_name: appmap
14
+ exclude:
15
+ - appmap/server
16
+
17
+ examples:
18
+ type: package
19
+ package_name: examples
20
+ CONFIG
21
+
22
+ events = %q(
23
+ {"id":1,"event":"call","defined_class":"#<Class:MockWebapp::Controller>","method_id":"instance","path":"/Users/kgilpin/Documents/appland/appmap-ruby/examples/mock_webapp/controller.rb","lineno":11,"static":true,"thread_id":70232530171540,"self":{"class":"Class","value":"MockWebapp::Controller","object_id":70232551211420},"parameters":{}}
24
+ {"id":2,"event":"return","defined_class":"#<Class:MockWebapp::Controller>","method_id":"instance","path":"/Users/kgilpin/Documents/appland/appmap-ruby/examples/mock_webapp/controller.rb","lineno":13,"static":true,"thread_id":70232530171540,"return_value":{"class":"MockWebapp::Controller","value":"#\u003cMockWebapp::Controller:0x00007fc094883a18\u003e","object_id":70232551202060},"parent_id":1,"elapsed":7.0e-06}
25
+ {"id":3,"event":"call","defined_class":"MockWebapp::Request","method_id":"initialize","path":"/Users/kgilpin/Documents/appland/appmap-ruby/examples/mock_webapp/request.rb","lineno":8,"static":false,"thread_id":70232530171540,"self":{"class":"MockWebapp::Request","value":"#\u003cstruct MockWebapp::Request params=nil\u003e","object_id":70232551201560},"parameters":{"args":{"class":"Array","value":"[{:id=\u003e\"alice\"}]","object_id":70232551201520}}}
26
+ {"id":4,"event":"return","defined_class":"MockWebapp::Request","method_id":"initialize","path":"/Users/kgilpin/Documents/appland/appmap-ruby/examples/mock_webapp/request.rb","lineno":10,"static":false,"thread_id":70232530171540,"return_value":{"class":"NilClass","value":null,"object_id":8},"parent_id":3,"elapsed":3.0e-06}
27
+ {"id":5,"event":"call","defined_class":"MockWebapp::Controller","method_id":"process","path":"/Users/kgilpin/Documents/appland/appmap-ruby/examples/mock_webapp/controller.rb","lineno":17,"static":false,"thread_id":70232530171540,"self":{"class":"MockWebapp::Controller","value":"#\u003cMockWebapp::Controller:0x00007fc094883a18\u003e","object_id":70232551202060},"parameters":{"request":{"class":"MockWebapp::Request","value":"#\u003cstruct MockWebapp::Request params={:id=\u003e\"alice\"}\u003e","object_id":70232551201560}}}
28
+ {"id":6,"event":"call","defined_class":"MockWebapp::User","method_id":"find","path":"/Users/kgilpin/Documents/appland/appmap-ruby/examples/mock_webapp/user.rb","lineno":13,"static":true,"thread_id":70232530171540,"self":{"class":"Class","value":"MockWebapp::User","object_id":70232551218320},"parameters":{"id":{"class":"String","value":"alice","object_id":70232551201600}}}
29
+ {"id":7,"event":"return","defined_class":"MockWebapp::User","method_id":"find","path":"/Users/kgilpin/Documents/appland/appmap-ruby/examples/mock_webapp/user.rb","lineno":15,"static":true,"thread_id":70232530171540,"return_value":{"class":"MockWebapp::User","value":"#\u003cstruct MockWebapp::User login=\"alice\"\u003e","object_id":70232551218180},"parent_id":6,"elapsed":3.0e-06}
30
+ {"id":8,"event":"return","defined_class":"MockWebapp::Controller","method_id":"process","path":"/Users/kgilpin/Documents/appland/appmap-ruby/examples/mock_webapp/controller.rb","lineno":21,"static":false,"thread_id":70232530171540,"return_value":{"class":"Hash","value":"{:login=\u003e\"alice\"}","object_id":70232551198060},"parent_id":5,"elapsed":0.000251}
31
+ )
32
+
33
+ require 'yaml'
34
+ config = AppMap::Config.load YAML.safe_load(config_yaml)
35
+ features = config.source_locations.map(&AppMap::Inspect.method(:detect_features)).flatten
36
+ methods = features.map(&:collect_functions).flatten
37
+
38
+ def method_call_from_event(evt)
39
+ AppMap::Trace::MethodCall.new(evt.id, evt.event.intern, evt.defined_class, evt.method_id, evt.path, evt.lineno,
40
+ evt.static, evt.thread_id, evt.self, evt.parameters)
41
+ end
42
+
43
+ def method_return_from_event(evt, parent_id, elapsed)
44
+ AppMap::Trace::MethodReturn.new(evt.id, evt.event.intern, evt.defined_class, evt.method_id, evt.path, evt.lineno,
45
+ evt.static, evt.thread_id, nil, nil, evt.return_value).tap do |mr|
46
+ assert_equal parent_id, evt.parent_id
47
+ mr.parent_id = evt.parent_id
48
+ mr.elapsed = evt.elapsed
49
+ end
50
+ end
51
+
52
+ tracer = AppMap::Trace::Tracer.new(methods)
53
+ handler = AppMap::Trace::TracePointHandler.new(tracer)
54
+ handler.call_constructor = method(:method_call_from_event)
55
+ handler.return_constructor = method(:method_return_from_event)
56
+
57
+ events = events
58
+ .split("\n")
59
+ .map(&:strip)
60
+ .reject(&:empty?)
61
+ .map(&JSON.method(:parse))
62
+
63
+ events.each do |evt_hash|
64
+ evt = OpenStruct.new(evt_hash.dup)
65
+ evt['event'] = evt['event'].intern
66
+ handler.handle evt
67
+ end
68
+
69
+ i = 0
70
+ while tracer.event?
71
+ event = tracer.next_event
72
+ assert_equal events[i], JSON.parse(event.to_h.to_json)
73
+ i += 1
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'test_helper'
5
+ require 'English'
6
+
7
+ class RSpecTest < Minitest::Test
8
+ def test_record_rspec
9
+ Bundler.with_clean_env do
10
+ Dir.chdir 'test/fixtures/rspec_recorder' do
11
+ appmap_file = 'tmp/appmap/rspec/Hello_says_hello.json'
12
+ FileUtils.rm_rf 'tmp'
13
+ system 'bundle'
14
+ system({ 'APPMAP' => 'true' }, 'bundle exec rspec')
15
+ assert File.file?(appmap_file), 'appmap output file does not exist'
16
+ assert_includes File.read(appmap_file), %("class":"String","value":"Hello!")
17
+ assert_includes File.read(appmap_file), %("feature":"Say hello")
18
+ assert_includes File.read(appmap_file), %("feature_group":"Hello")
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,46 @@
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
2
+ require 'appmap'
3
+
4
+ require 'minitest/autorun'
5
+
6
+ FIXTURE_DIR = File.join(__dir__, 'fixtures')
7
+ PARSE_FILE_FIXTURE_DIR = File.join(FIXTURE_DIR, 'parse_file')
8
+ INSPECT_PACKAGE_FIXTURE_DIR = File.join(FIXTURE_DIR, 'inspect_package')
9
+
10
+ module FixturePath
11
+ def parse_fixture_file(path)
12
+ File.join(FIXTURE_DIR, 'parse_file', path)
13
+ end
14
+ end
15
+
16
+ module FixtureFile
17
+ include FixturePath
18
+
19
+ def assert_fixture_features(strategy, path)
20
+ require 'appmap/inspect'
21
+
22
+ features = Array(AppMap::Inspect.inspect_file(strategy, file_path: parse_fixture_file(path)))
23
+
24
+ fixup_fixture_path = lambda do |a|
25
+ a.location = a.location.gsub(PARSE_FILE_FIXTURE_DIR, '$FIXTURE_DIR')
26
+ a.children.each(&fixup_fixture_path)
27
+ end
28
+ features.each(&fixup_fixture_path)
29
+
30
+ expectation = JSON.parse(`ruby #{parse_fixture_file(path)}`)
31
+ expectation = expectation[strategy.to_s] \
32
+ if expectation.is_a?(Hash) && expectation[strategy.to_s]
33
+ warn JSON.pretty_generate(features.map(&:to_h)) if ENV['DEBUG']
34
+ assert_equal JSON.pretty_generate(expectation),
35
+ JSON.pretty_generate(features.map(&:to_h))
36
+ end
37
+ end
38
+
39
+ # Verify that the fixture files are valid
40
+ Dir.new(PARSE_FILE_FIXTURE_DIR)
41
+ .entries
42
+ .select { |e| File.file?(File.join(PARSE_FILE_FIXTURE_DIR, e)) && e.index('.rb') == e.size - 3 }
43
+ .each do |e|
44
+ fname = File.join(PARSE_FILE_FIXTURE_DIR, e)
45
+ raise "Fixture #{fname.inspect} is not valid" unless system("ruby #{fname} > /dev/null")
46
+ end