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,30 @@
1
+ require 'rails_spec_helper'
2
+
3
+ describe 'RSpec feature and feature group metadata' do
4
+ before(:all) { @fixture_dir = 'spec/fixtures/rails_users_app' }
5
+ include_examples 'Rails app pg database'
6
+
7
+ around(:each) do |example|
8
+ FileUtils.rm_rf tmpdir
9
+ FileUtils.mkdir_p tmpdir
10
+ cmd = "docker-compose run --rm -e APPMAP=true -v #{File.absolute_path(tmpdir).shellescape}:/app/tmp app ./bin/rspec spec/models/user_spec.rb"
11
+ system cmd, chdir: @fixture_dir or raise 'Failed to run rails_users_app container'
12
+
13
+ example.run
14
+ end
15
+
16
+ let(:tmpdir) { 'tmp/spec/RSpec feature and feature group metadata' }
17
+ let(:appmap_json) { File.join(tmpdir, %(appmap/rspec/User_creation_creates_charles.appmap.json)) }
18
+
19
+ describe do
20
+ it 'are recorded in the appmap' do
21
+ expect(File).to exist(appmap_json)
22
+ appmap = JSON.parse(File.read(appmap_json)).to_yaml
23
+
24
+ expect(appmap).to include(<<-METADATA.strip)
25
+ feature: Create a user
26
+ feature_group: User
27
+ METADATA
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,6 @@
1
+ require 'rspec'
2
+ require 'net/http'
3
+ require 'json'
4
+ require 'yaml'
5
+ require 'English'
6
+ require 'webdrivers/chromedriver'
data/test/cli_test.rb ADDED
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'test_helper'
5
+ require 'English'
6
+
7
+ class CLITest < Minitest::Test
8
+ OUTPUT_FILENAME = File.expand_path('../tmp/appmap.json', __dir__)
9
+
10
+ def setup
11
+ FileUtils.rm_f OUTPUT_FILENAME
12
+ end
13
+
14
+ def test_config_file_must_exist
15
+ output = `./exe/appmap -c foobar inspect 2>&1`
16
+
17
+ assert_equal 1, $CHILD_STATUS.exitstatus
18
+ assert_includes output, 'No such file or directory'
19
+ assert_includes output, 'foobar'
20
+ end
21
+
22
+ def test_inspect_to_file
23
+ `./exe/appmap inspect -o #{OUTPUT_FILENAME}`
24
+
25
+ assert_equal 0, $CHILD_STATUS.exitstatus
26
+ assert File.file?(OUTPUT_FILENAME), "#{OUTPUT_FILENAME} does not exist"
27
+ end
28
+
29
+ def test_inspect_to_stdout
30
+ output = `./exe/appmap inspect -o -`
31
+
32
+ assert !File.file?(OUTPUT_FILENAME), "#{OUTPUT_FILENAME} should not exist"
33
+
34
+ assert_equal 0, $CHILD_STATUS.exitstatus
35
+ assert !output.blank?, 'Output should exist in stdout'
36
+ JSON.parse(output)
37
+ end
38
+
39
+ def test_record
40
+ output = Dir.chdir 'test/fixtures/cli_record_test' do
41
+ `#{File.expand_path '../exe/appmap', __dir__} record -o #{OUTPUT_FILENAME} ./lib/cli_record_test/main.rb`.strip
42
+ end
43
+
44
+ assert_equal 0, $CHILD_STATUS.exitstatus
45
+ assert File.file?(OUTPUT_FILENAME), "#{OUTPUT_FILENAME} does not exist"
46
+ assert_equal 'Hello', output
47
+ output = JSON.parse(File.read(OUTPUT_FILENAME))
48
+ assert output['classMap'], 'Output should contain classMap'
49
+ assert output['events'], 'Output should contain events'
50
+ end
51
+
52
+ def test_record_to_default_location
53
+ Dir.chdir 'test/fixtures/cli_record_test' do
54
+ system({ 'APPMAP_FILE' => OUTPUT_FILENAME }, "#{File.expand_path '../exe/appmap', __dir__} record ./lib/cli_record_test/main.rb")
55
+ end
56
+
57
+ assert_equal 0, $CHILD_STATUS.exitstatus
58
+ assert File.file?(OUTPUT_FILENAME), 'appmap.json does not exist'
59
+ end
60
+
61
+ def test_record_to_stdout
62
+ output = Dir.chdir 'test/fixtures/cli_record_test' do
63
+ `#{File.expand_path '../exe/appmap', __dir__} record -o - ./lib/cli_record_test/main.rb`
64
+ end
65
+
66
+ assert_equal 0, $CHILD_STATUS.exitstatus
67
+ assert_includes output, %("location":"lib/cli_record_test")
68
+ assert !File.file?(OUTPUT_FILENAME), "#{OUTPUT_FILENAME} should not exist"
69
+ end
70
+
71
+ def test_upload
72
+ `./exe/appmap inspect -o #{OUTPUT_FILENAME}`
73
+
74
+ upload_output = `./exe/appmap upload --no-open #{OUTPUT_FILENAME}`
75
+ assert_equal 0, $CHILD_STATUS.exitstatus
76
+ # Example: 93e1e07d-4b39-49ac-82bf-27d63e296cae
77
+ assert_match(/Scenario Id/, upload_output)
78
+ assert_match(/Batch Id/, upload_output)
79
+ assert_match(/[0-9a-f]+\-[0-9a-f\-]+/, upload_output)
80
+ end
81
+ end
@@ -0,0 +1,149 @@
1
+ require 'test_helper'
2
+ require 'appmap/config'
3
+ require 'appmap/inspect'
4
+
5
+ class ConfigTest < Minitest::Test
6
+ include FixtureFile
7
+
8
+ def test_explicit_module_path_naming
9
+ config = AppMap::Config::PackageDir.new(INSPECT_PACKAGE_FIXTURE_DIR).tap do |c|
10
+ c.mode = :explicit
11
+ c.exclude = [ 'module_a/ignore_module_c' ]
12
+ end
13
+ feature = AppMap::Inspect.detect_features(config)
14
+
15
+ assert_equal %w[inspect_package module_a module_b], feature_names(feature)
16
+ end
17
+
18
+ def test_implicit_module_path_naming
19
+ config = AppMap::Config::PackageDir.new(INSPECT_PACKAGE_FIXTURE_DIR).tap do |c|
20
+ c.exclude = [ 'module_a/ignore_module_c' ]
21
+ end
22
+ feature = AppMap::Inspect.detect_features(config)
23
+
24
+ assert_equal %w[inspect_package module_a module_b A B Main], feature_names(feature)
25
+ end
26
+
27
+ def test_ignore_non_ruby_file
28
+ config = AppMap::Config::PackageDir.new(File.join(FIXTURE_DIR, 'ignore_non_ruby_file'))
29
+ feature = AppMap::Inspect.detect_features(config)
30
+ assert_equal %w[ignore_non_ruby_file Cls], feature_names(feature)
31
+ end
32
+
33
+ def test_inspect_multiple_subdirs
34
+ config_yaml = <<-YAML
35
+ packages:
36
+ - path: module_a
37
+ - path: module_b
38
+ named_functions: []
39
+ YAML
40
+
41
+ require 'yaml'
42
+ config = AppMap::Config.load YAML.safe_load(config_yaml)
43
+ features = Dir.chdir File.join(FIXTURE_DIR, 'inspect_multiple_subdirs') do
44
+ config.source_locations.map(&AppMap::Inspect.method(:detect_features))
45
+ end.flatten
46
+ features = features.map(&:reparent)
47
+ assert_equal %w[module_a ModuleA ClassA module_b ModuleB ClassB ClassC], features.map(&method(:feature_names)).flatten
48
+ end
49
+
50
+ def test_active_record_like
51
+ config_yaml = <<-YAML
52
+ packages:
53
+ - path: .
54
+ name: ROOT
55
+ named_functions: []
56
+ YAML
57
+
58
+ require 'yaml'
59
+ config = AppMap::Config.load YAML.safe_load(config_yaml)
60
+ features = Dir.chdir File.join(FIXTURE_DIR, 'active_record_like') do
61
+ config.source_locations.map(&AppMap::Inspect.method(:detect_features))
62
+ end.flatten
63
+ features = features.map(&:reparent)
64
+
65
+ assert_equal <<-FEATURES.strip, JSON.pretty_generate(features)
66
+ [
67
+ {
68
+ "name": "ROOT",
69
+ "location": ".",
70
+ "type": "package",
71
+ "children": [
72
+ {
73
+ "name": "ActiveRecord",
74
+ "location": "./active_record.rb:1",
75
+ "type": "class",
76
+ "children": [
77
+ {
78
+ "name": "Aggregations",
79
+ "location": "./active_record/aggregations.rb:2",
80
+ "type": "class"
81
+ },
82
+ {
83
+ "name": "Associations",
84
+ "location": "./active_record/association.rb:2",
85
+ "type": "class",
86
+ "children": [
87
+ {
88
+ "name": "JoinDependency",
89
+ "location": "./active_record/associations/join_dependency.rb:3",
90
+ "type": "class",
91
+ "children": [
92
+ {
93
+ "name": "JoinBase",
94
+ "location": "./active_record/associations/join_dependency/join_base.rb:4",
95
+ "type": "class"
96
+ },
97
+ {
98
+ "name": "JoinPart",
99
+ "location": "./active_record/associations/join_dependency/join_part.rb:4",
100
+ "type": "class"
101
+ }
102
+ ]
103
+ }
104
+ ]
105
+ },
106
+ {
107
+ "name": "CAPS",
108
+ "location": "./active_record/caps/caps.rb:2",
109
+ "type": "class"
110
+ }
111
+ ]
112
+ },
113
+ {
114
+ "name": "active_record",
115
+ "location": "./active_record",
116
+ "type": "package",
117
+ "children": [
118
+ {
119
+ "name": "associations",
120
+ "location": "./active_record/associations",
121
+ "type": "package",
122
+ "children": [
123
+ {
124
+ "name": "join_dependency",
125
+ "location": "./active_record/associations/join_dependency",
126
+ "type": "package"
127
+ }
128
+ ]
129
+ },
130
+ {
131
+ "name": "caps",
132
+ "location": "./active_record/caps",
133
+ "type": "package"
134
+ }
135
+ ]
136
+ }
137
+ ]
138
+ }
139
+ ]
140
+ FEATURES
141
+ end
142
+
143
+ def feature_names(feature, names = [])
144
+ names.tap do |_|
145
+ names << feature.name
146
+ feature.children.each { |child| feature_names(child, names) }
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ class ExplicitInspectTest < Minitest::Test
4
+ include FixtureFile
5
+
6
+ def test_toplevel_class
7
+ assert_fixture_features :explicit, 'toplevel_class.rb'
8
+ end
9
+
10
+ def test_defs_static_function
11
+ assert_fixture_features :explicit, 'defs_static_function.rb'
12
+ end
13
+
14
+ def test_sclass_static_function
15
+ assert_fixture_features :explicit, 'sclass_static_function.rb'
16
+ end
17
+
18
+ def test_toplevel_function
19
+ assert_fixture_features :explicit, 'toplevel_function.rb'
20
+ end
21
+
22
+ def test_function_within_class
23
+ assert_fixture_features :explicit, 'function_within_class.rb'
24
+ end
25
+
26
+ def test_include_public_methods
27
+ assert_fixture_features :explicit, 'include_public_methods.rb'
28
+ end
29
+ end
@@ -0,0 +1,4 @@
1
+ module ActiveRecord
2
+ class Aggregations
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ActiveRecord
2
+ module Associations
3
+ end
4
+ end
@@ -0,0 +1,8 @@
1
+ module ActiveRecord
2
+ module Associations
3
+ module JoinDependency
4
+ class JoinBase
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module ActiveRecord
2
+ module Associations
3
+ module JoinDependency
4
+ class JoinPart
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ module ActiveRecord
2
+ module Associations
3
+ module JoinDependency
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,4 @@
1
+ module ActiveRecord
2
+ module CAPS
3
+ end
4
+ end
@@ -0,0 +1,2 @@
1
+ module ActiveRecord
2
+ end
@@ -0,0 +1,2 @@
1
+ packages:
2
+ - path: lib/cli_record_test
@@ -0,0 +1,7 @@
1
+ class Main
2
+ def Main.say_hello
3
+ puts 'Hello'
4
+ end
5
+ end
6
+
7
+ Main.say_hello
@@ -0,0 +1,3 @@
1
+ # @appmap
2
+ class Cls
3
+ end
@@ -0,0 +1 @@
1
+ This is not ruby.
@@ -0,0 +1,6 @@
1
+ module A
2
+ class A1
3
+ def action
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module A
2
+ class A2
3
+ def action
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ module A
2
+ module X
3
+ class X1
4
+ def action
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ module B
2
+ class B1
3
+ def action
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,4 @@
1
+ class Root1
2
+ def action
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module ModuleA
2
+ # @appmap
3
+ class ClassA
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ module ModuleA
2
+ end
@@ -0,0 +1,5 @@
1
+ module ModuleB
2
+ # @appmap
3
+ class ClassB
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module ModuleB
2
+ # @appmap
3
+ class ClassC
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ module ModuleB
2
+ end
@@ -0,0 +1,6 @@
1
+ module A
2
+ module B
3
+ class Main
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,96 @@
1
+ class Main
2
+ # @appmap
3
+ def self.main_func; end
4
+ end
5
+
6
+ class Sub < Main
7
+ # @appmap
8
+ def self.sub_func; end
9
+
10
+ # @appmap
11
+ def Main.sub_func_2; end
12
+
13
+ # @appmap
14
+ def self.sub_func_3; end
15
+
16
+ protected
17
+
18
+ # TODO: ensure that this is ignored by implicit scan
19
+ def self.sub_func_protected; end
20
+ end
21
+
22
+ puts DATA.read
23
+ __END__
24
+ {
25
+ "explicit": [
26
+ {
27
+ "name": "main_func",
28
+ "location": "$FIXTURE_DIR/defs_static_function.rb:3",
29
+ "type": "function",
30
+ "class_name": "Main",
31
+ "static": true
32
+ },
33
+ {
34
+ "name": "sub_func",
35
+ "location": "$FIXTURE_DIR/defs_static_function.rb:8",
36
+ "type": "function",
37
+ "class_name": "Sub",
38
+ "static": true
39
+ },
40
+ {
41
+ "name": "sub_func_2",
42
+ "location": "$FIXTURE_DIR/defs_static_function.rb:11",
43
+ "type": "function",
44
+ "class_name": "Main",
45
+ "static": true
46
+ },
47
+ {
48
+ "name": "sub_func_3",
49
+ "location": "$FIXTURE_DIR/defs_static_function.rb:14",
50
+ "type": "function",
51
+ "class_name": "Sub",
52
+ "static": true
53
+ }
54
+ ],
55
+ "implicit": [
56
+ {
57
+ "name": "Main",
58
+ "location": "$FIXTURE_DIR/defs_static_function.rb:1",
59
+ "type": "class",
60
+ "children": [
61
+ {
62
+ "name": "main_func",
63
+ "location": "$FIXTURE_DIR/defs_static_function.rb:3",
64
+ "type": "function",
65
+ "static": true
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ "name": "Sub",
71
+ "location": "$FIXTURE_DIR/defs_static_function.rb:6",
72
+ "type": "class",
73
+ "children": [
74
+ {
75
+ "name": "sub_func",
76
+ "location": "$FIXTURE_DIR/defs_static_function.rb:8",
77
+ "type": "function",
78
+ "static": true
79
+ },
80
+ {
81
+ "name": "sub_func_2",
82
+ "location": "$FIXTURE_DIR/defs_static_function.rb:11",
83
+ "type": "function",
84
+ "class_name": "Main",
85
+ "static": true
86
+ },
87
+ {
88
+ "name": "sub_func_3",
89
+ "location": "$FIXTURE_DIR/defs_static_function.rb:14",
90
+ "type": "function",
91
+ "static": true
92
+ }
93
+ ]
94
+ }
95
+ ]
96
+ }
@@ -0,0 +1,36 @@
1
+ # @appmap
2
+ class Main
3
+ class << self
4
+ # @appmap
5
+ def sclass_function
6
+ end
7
+ end
8
+
9
+ # @appmap
10
+ def instance_function
11
+ end
12
+ end
13
+
14
+ puts DATA.read
15
+ __END__
16
+ [
17
+ {
18
+ "name": "Main",
19
+ "location": "$FIXTURE_DIR/function_within_class.rb:2",
20
+ "type": "class",
21
+ "children": [
22
+ {
23
+ "name": "sclass_function",
24
+ "location": "$FIXTURE_DIR/function_within_class.rb:5",
25
+ "type": "function",
26
+ "static": true
27
+ },
28
+ {
29
+ "name": "instance_function",
30
+ "location": "$FIXTURE_DIR/function_within_class.rb:10",
31
+ "type": "function",
32
+ "static": false
33
+ }
34
+ ]
35
+ }
36
+ ]