appmap 0.37.0 → 0.40.0
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.
- checksums.yaml +4 -4
- data/.dockerignore +1 -1
- data/.rubocop.yml +12 -1
- data/.travis.yml +2 -23
- data/CHANGELOG.md +24 -0
- data/CONTRIBUTING.md +22 -0
- data/README.md +79 -50
- data/Rakefile +3 -3
- data/lib/appmap/class_map.rb +25 -8
- data/lib/appmap/config.rb +22 -10
- data/lib/appmap/event.rb +16 -1
- data/lib/appmap/hook.rb +11 -3
- data/lib/appmap/hook/method.rb +18 -12
- data/lib/appmap/rails/request_handler.rb +25 -4
- data/lib/appmap/railtie.rb +1 -5
- data/lib/appmap/trace.rb +18 -7
- data/lib/appmap/version.rb +2 -2
- data/spec/abstract_controller_base_spec.rb +132 -67
- data/spec/fixtures/hook/instance_method.rb +4 -0
- data/spec/fixtures/hook/labels.rb +6 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/.dockerignore +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/.gitignore +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/.rspec +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/.ruby-version +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/Dockerfile +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/Dockerfile.pg +0 -0
- data/spec/fixtures/rails5_users_app/Gemfile +50 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/Rakefile +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/app/controllers/api/users_controller.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/app/controllers/application_controller.rb +0 -0
- data/spec/fixtures/{rails4_users_app/app/assets/images → rails5_users_app/app/controllers/concerns}/.keep +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/app/controllers/health_controller.rb +0 -0
- data/spec/fixtures/rails5_users_app/app/controllers/users_controller.rb +13 -0
- data/spec/fixtures/{rails4_users_app/app/models → rails5_users_app/app/models/activerecord}/user.rb +0 -0
- data/spec/fixtures/{rails4_users_app/app/controllers → rails5_users_app/app/models}/concerns/.keep +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/app/models/sequel/user.rb +0 -0
- data/spec/fixtures/{rails4_users_app → rails5_users_app}/app/views/layouts/application.html.haml +0 -0
- data/spec/fixtures/{rails4_users_app → rails5_users_app}/app/views/users/index.html.haml +0 -0
- data/spec/fixtures/rails5_users_app/appmap.yml +4 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/appmap +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/byebug +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/gli +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/htmldiff +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/ldiff +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/nokogiri +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/rackup +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/rails +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/rake +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/rspec +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/ruby-parse +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/ruby-rewrite +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/sequel +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/setup +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/sprockets +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/thor +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/bin/update +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config.ru +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/application.rb +2 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/boot.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/credentials.yml.enc +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/database.yml +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/environment.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/environments/development.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/environments/production.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/environments/test.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/initializers/application_controller_renderer.rb +0 -0
- data/spec/fixtures/{rails4_users_app → rails5_users_app}/config/initializers/backtrace_silencers.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/initializers/cors.rb +0 -0
- data/spec/fixtures/{rails4_users_app → rails5_users_app}/config/initializers/filter_parameter_logging.rb +0 -0
- data/spec/fixtures/{rails4_users_app → rails5_users_app}/config/initializers/inflections.rb +0 -0
- data/spec/fixtures/{rails4_users_app → rails5_users_app}/config/initializers/mime_types.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/initializers/record_button.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/initializers/wrap_parameters.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/locales/en.yml +0 -0
- data/spec/fixtures/{rails4_users_app → rails5_users_app}/config/routes.rb +1 -2
- data/spec/fixtures/{rails_users_app → rails5_users_app}/create_app +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/db/migrate/20190728211408_create_users.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/db/schema.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/docker-compose.yml +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/features/api_users.feature +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/features/support/env.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/features/support/hooks.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/features/support/steps.rb +0 -0
- data/spec/fixtures/{rails4_users_app/app/mailers → rails5_users_app/lib/tasks}/.keep +0 -0
- data/spec/fixtures/{rails4_users_app/app/models → rails5_users_app/log}/.keep +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/public/robots.txt +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/spec/controllers/users_controller_api_spec.rb +1 -1
- data/spec/fixtures/rails5_users_app/spec/controllers/users_controller_spec.rb +27 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/spec/models/user_spec.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/spec/rails_helper.rb +0 -0
- data/spec/fixtures/{rails4_users_app → rails5_users_app}/spec/spec_helper.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/users_app/.gitignore +0 -0
- data/spec/fixtures/rails6_users_app/.dockerignore +1 -0
- data/spec/fixtures/rails6_users_app/.gitignore +39 -0
- data/spec/fixtures/rails6_users_app/.rspec +1 -0
- data/spec/fixtures/rails6_users_app/.ruby-version +1 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/Dockerfile +3 -4
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/Dockerfile.pg +1 -1
- data/spec/fixtures/{rails_users_app → rails6_users_app}/Gemfile +3 -4
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/Rakefile +1 -1
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/app/controllers/api/users_controller.rb +1 -1
- data/spec/fixtures/rails6_users_app/app/controllers/application_controller.rb +2 -0
- data/spec/fixtures/{rails4_users_app/app/models → rails6_users_app/app/controllers}/concerns/.keep +0 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/app/controllers/health_controller.rb +1 -1
- data/spec/fixtures/rails6_users_app/app/controllers/users_controller.rb +13 -0
- data/spec/fixtures/{rails_users_app → rails6_users_app}/app/models/activerecord/user.rb +0 -0
- data/spec/fixtures/{rails4_users_app/lib/assets → rails6_users_app/app/models/concerns}/.keep +0 -0
- data/spec/fixtures/rails6_users_app/app/models/sequel/user.rb +25 -0
- data/spec/fixtures/{rails_users_app → rails6_users_app}/app/views/layouts/application.html.haml +0 -0
- data/spec/fixtures/{rails_users_app → rails6_users_app}/app/views/users/index.html.haml +0 -0
- data/spec/fixtures/rails6_users_app/appmap.yml +5 -0
- data/spec/fixtures/rails6_users_app/bin/appmap +29 -0
- data/spec/fixtures/rails6_users_app/bin/byebug +29 -0
- data/spec/fixtures/rails6_users_app/bin/gli +29 -0
- data/spec/fixtures/rails6_users_app/bin/htmldiff +29 -0
- data/spec/fixtures/rails6_users_app/bin/ldiff +29 -0
- data/spec/fixtures/rails6_users_app/bin/nokogiri +29 -0
- data/spec/fixtures/rails6_users_app/bin/rackup +29 -0
- data/spec/fixtures/rails6_users_app/bin/rails +4 -0
- data/spec/fixtures/rails6_users_app/bin/rake +29 -0
- data/spec/fixtures/rails6_users_app/bin/rspec +29 -0
- data/spec/fixtures/rails6_users_app/bin/ruby-parse +29 -0
- data/spec/fixtures/rails6_users_app/bin/ruby-rewrite +29 -0
- data/spec/fixtures/rails6_users_app/bin/sequel +29 -0
- data/spec/fixtures/rails6_users_app/bin/setup +25 -0
- data/spec/fixtures/rails6_users_app/bin/sprockets +29 -0
- data/spec/fixtures/rails6_users_app/bin/thor +29 -0
- data/spec/fixtures/rails6_users_app/bin/update +25 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/config.ru +2 -1
- data/spec/fixtures/rails6_users_app/config/application.rb +53 -0
- data/spec/fixtures/rails6_users_app/config/boot.rb +3 -0
- data/spec/fixtures/rails6_users_app/config/credentials.yml.enc +1 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/database.yml +2 -2
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/environment.rb +1 -1
- data/spec/fixtures/rails6_users_app/config/environments/development.rb +40 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/environments/production.rb +19 -30
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/environments/test.rb +5 -11
- data/spec/fixtures/rails6_users_app/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/fixtures/{rails_users_app → rails6_users_app}/config/initializers/backtrace_silencers.rb +0 -0
- data/spec/fixtures/rails6_users_app/config/initializers/cors.rb +16 -0
- data/spec/fixtures/{rails_users_app → rails6_users_app}/config/initializers/filter_parameter_logging.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails6_users_app}/config/initializers/inflections.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails6_users_app}/config/initializers/mime_types.rb +0 -0
- data/spec/fixtures/rails6_users_app/config/initializers/record_button.rb +3 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/initializers/wrap_parameters.rb +1 -6
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/config/locales/en.yml +10 -0
- data/spec/fixtures/{rails_users_app → rails6_users_app}/config/routes.rb +1 -1
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/create_app +7 -3
- data/spec/fixtures/rails6_users_app/db/migrate/20190728211408_create_users.rb +9 -0
- data/spec/fixtures/rails6_users_app/db/schema.rb +23 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/docker-compose.yml +3 -1
- data/spec/fixtures/rails6_users_app/features/api_users.feature +13 -0
- data/spec/fixtures/rails6_users_app/features/support/env.rb +4 -0
- data/spec/fixtures/rails6_users_app/features/support/hooks.rb +11 -0
- data/spec/fixtures/rails6_users_app/features/support/steps.rb +18 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/lib/tasks/.keep +0 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/log/.keep +0 -0
- data/spec/fixtures/rails6_users_app/public/robots.txt +1 -0
- data/spec/fixtures/rails6_users_app/spec/controllers/users_controller_api_spec.rb +29 -0
- data/spec/fixtures/rails6_users_app/spec/controllers/users_controller_spec.rb +27 -0
- data/spec/fixtures/rails6_users_app/spec/models/user_spec.rb +39 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app}/spec/rails_helper.rb +3 -32
- data/spec/fixtures/{rails_users_app → rails6_users_app}/spec/spec_helper.rb +0 -0
- data/spec/fixtures/{rails4_users_app → rails6_users_app/users_app}/.gitignore +8 -1
- data/spec/hook_spec.rb +111 -57
- data/spec/rails_spec_helper.rb +5 -5
- data/spec/railtie_spec.rb +31 -32
- data/spec/record_sql_rails_pg_spec.rb +62 -63
- data/spec/remote_recording_spec.rb +90 -89
- data/spec/rspec_feature_metadata_spec.rb +17 -18
- data/spec/spec_helper.rb +1 -0
- metadata +148 -139
- data/spec/abstract_controller4_base_spec.rb +0 -67
- data/spec/fixtures/rails4_users_app/.rbenv-gemsets +0 -2
- data/spec/fixtures/rails4_users_app/.ruby-version +0 -1
- data/spec/fixtures/rails4_users_app/Gemfile +0 -77
- data/spec/fixtures/rails4_users_app/README.rdoc +0 -28
- data/spec/fixtures/rails4_users_app/app/assets/javascripts/application.js +0 -16
- data/spec/fixtures/rails4_users_app/app/assets/stylesheets/application.css +0 -15
- data/spec/fixtures/rails4_users_app/app/controllers/application_controller.rb +0 -5
- data/spec/fixtures/rails4_users_app/app/controllers/users_controller.rb +0 -5
- data/spec/fixtures/rails4_users_app/app/helpers/application_helper.rb +0 -2
- data/spec/fixtures/rails4_users_app/appmap.yml +0 -3
- data/spec/fixtures/rails4_users_app/bin/rails +0 -9
- data/spec/fixtures/rails4_users_app/bin/setup +0 -29
- data/spec/fixtures/rails4_users_app/bin/spring +0 -17
- data/spec/fixtures/rails4_users_app/config/application.rb +0 -26
- data/spec/fixtures/rails4_users_app/config/boot.rb +0 -3
- data/spec/fixtures/rails4_users_app/config/environments/development.rb +0 -41
- data/spec/fixtures/rails4_users_app/config/initializers/assets.rb +0 -11
- data/spec/fixtures/rails4_users_app/config/initializers/cookies_serializer.rb +0 -3
- data/spec/fixtures/rails4_users_app/config/initializers/session_store.rb +0 -3
- data/spec/fixtures/rails4_users_app/config/initializers/to_time_preserves_timezone.rb +0 -10
- data/spec/fixtures/rails4_users_app/config/secrets.yml +0 -22
- data/spec/fixtures/rails4_users_app/db/migrate/20191127112304_create_users.rb +0 -10
- data/spec/fixtures/rails4_users_app/db/schema.rb +0 -26
- data/spec/fixtures/rails4_users_app/db/seeds.rb +0 -7
- data/spec/fixtures/rails4_users_app/public/404.html +0 -67
- data/spec/fixtures/rails4_users_app/public/422.html +0 -67
- data/spec/fixtures/rails4_users_app/public/500.html +0 -66
- data/spec/fixtures/rails4_users_app/public/favicon.ico +0 -0
- data/spec/fixtures/rails4_users_app/public/robots.txt +0 -5
- data/spec/fixtures/rails4_users_app/spec/controllers/users_controller_api_spec.rb +0 -49
- data/spec/fixtures/rails4_users_app/test/fixtures/users.yml +0 -9
- data/spec/fixtures/rails_users_app/app/controllers/concerns/.keep +0 -0
- data/spec/fixtures/rails_users_app/app/controllers/users_controller.rb +0 -5
- data/spec/fixtures/rails_users_app/app/models/concerns/.keep +0 -0
- data/spec/fixtures/rails_users_app/appmap.yml +0 -3
- data/spec/fixtures/rails_users_app/lib/tasks/.keep +0 -0
- data/spec/fixtures/rails_users_app/log/.keep +0 -0
- 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:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1b0943dadde84e67780d724918fa26377b869791eaab6edfb714e5081ecb5c80
|
|
4
|
+
data.tar.gz: c492323d80541a913b800924d04a7c24a6c8682263ba3ec4deabfa8d7ade3908
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2a27e5b9bc3dafbba8aafd7035732b6ffcb813d57bb216d0e544af30260c0e26f23a920d1b2d6d35882046e74a57f8b492b12b9869de5d820ff6a4e09cafd716
|
|
7
|
+
data.tar.gz: f1bdc22fda7a6fdf0a37fc1d5bd419947e0fffa16511873dbe8a1549f30bf862566fe74fa4c9952c4338f5263414c99f3d598daec0a599b467e52ebac374b4f7
|
data/.dockerignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
AllCops:
|
|
2
2
|
NewCops: enable
|
|
3
3
|
|
|
4
|
+
Layout/CaseIndentation:
|
|
5
|
+
EnforcedStyle: end
|
|
6
|
+
|
|
7
|
+
Layout/FirstArgumentIndentation:
|
|
8
|
+
EnforcedStyle: consistent
|
|
9
|
+
|
|
4
10
|
Layout/SpaceInsideArrayLiteralBrackets:
|
|
5
11
|
Enabled: false
|
|
6
12
|
|
|
@@ -11,12 +17,17 @@ Layout/HeredocIndentation:
|
|
|
11
17
|
Layout/LineLength:
|
|
12
18
|
Max: 120
|
|
13
19
|
|
|
20
|
+
Metrics/BlockLength:
|
|
21
|
+
ExcludedMethods:
|
|
22
|
+
- it
|
|
23
|
+
- context
|
|
24
|
+
|
|
14
25
|
Style/MultilineBlockChain:
|
|
15
26
|
Enabled: false
|
|
16
27
|
|
|
17
28
|
Style/NumericPredicate:
|
|
18
29
|
Enabled: false
|
|
19
|
-
|
|
30
|
+
|
|
20
31
|
Style/AndOr:
|
|
21
32
|
Enabled: false
|
|
22
33
|
|
data/.travis.yml
CHANGED
|
@@ -16,29 +16,8 @@ before_script:
|
|
|
16
16
|
|
|
17
17
|
jobs:
|
|
18
18
|
include:
|
|
19
|
-
- stage:
|
|
19
|
+
- stage: test
|
|
20
20
|
script:
|
|
21
21
|
- mkdir tmp
|
|
22
|
-
- bundle exec rake
|
|
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
|
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
# v0.40.0
|
|
2
|
+
|
|
3
|
+
* Parse source code comments into function labels.
|
|
4
|
+
|
|
5
|
+
# v0.39.2
|
|
6
|
+
* Correctly recognize normalized path info for subengines.
|
|
7
|
+
|
|
8
|
+
# v0.39.1
|
|
9
|
+
* Support Ruby 2.7.
|
|
10
|
+
* Remove support for Rails 4.
|
|
11
|
+
* Stop recommending `-t appmap` argument for `rspec`.
|
|
12
|
+
|
|
13
|
+
# v0.39.0
|
|
14
|
+
* Recognize and record `normalized_path_info` in Rails applications, per 1.4 AppMap format version.
|
|
15
|
+
|
|
16
|
+
# v0.38.1
|
|
17
|
+
* Package configuration can be `shallow`, in case which only the initial entry into the package is recorded.
|
|
18
|
+
|
|
19
|
+
# v0.37.2
|
|
20
|
+
* Fix ParameterFilter deprecation warning.
|
|
21
|
+
|
|
22
|
+
# v0.37.1
|
|
23
|
+
* Fix parameter mapping with keyword and rest arguments.
|
|
24
|
+
|
|
1
25
|
# v0.37.0
|
|
2
26
|
* Capture method source and comment.
|
|
3
27
|
|
data/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Contributing to appmap-ruby
|
|
2
|
+
|
|
3
|
+
We are incredibly thankful for the contributions we receive from the community. Before contributing, please take a moment to read our [Contributor License Agreement](https://github.com/applandorg/community/blob/master/docs/CLA%20Instructions.pdf) and our [Code of Conduct](https://github.com/applandorg/community/blob/master/docs/Code%20of%20Conduct%20for%20Contributors.pdf).
|
|
4
|
+
|
|
5
|
+
## Contributor License Agreement
|
|
6
|
+
We require our external contributors to sign a Contributor License Agreement ("CLA") in order to ensure that
|
|
7
|
+
our projects remain licensed under Free and Open Source licenses such as while allowing
|
|
8
|
+
Appland to build a sustainable business.
|
|
9
|
+
|
|
10
|
+
AppLand is committed to having a true Free and Open Source Software license for our
|
|
11
|
+
non-commercial software. A CLA enables AppLand to safely commercialize our products while
|
|
12
|
+
keeping a standard FOSS license with all the rights that license grants to users.
|
|
13
|
+
|
|
14
|
+
* [Contributor License Agreement](https://github.com/applandorg/community/blob/master/docs/CLA%20Instructions.pdf)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## Code of Conduct
|
|
18
|
+
|
|
19
|
+
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and
|
|
20
|
+
healthy community.
|
|
21
|
+
|
|
22
|
+
* [Code of Conduct](https://github.com/applandorg/community/blob/master/docs/Code%20of%20Conduct%20for%20Contributors.pdf)
|
data/README.md
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
|
|
2
2
|
- [About](#about)
|
|
3
|
+
- [Supported versions](#supported-versions)
|
|
3
4
|
- [Installation](#installation)
|
|
4
5
|
- [Configuration](#configuration)
|
|
6
|
+
- [Labels](#labels)
|
|
5
7
|
- [Running](#running)
|
|
6
8
|
- [RSpec](#rspec)
|
|
7
9
|
- [Minitest](#minitest)
|
|
8
10
|
- [Cucumber](#cucumber)
|
|
9
11
|
- [Remote recording](#remote-recording)
|
|
10
|
-
|
|
12
|
+
- [AppMap for VSCode](#appmap-for-vscode)
|
|
11
13
|
- [Uploading AppMaps](#uploading-appmaps)
|
|
12
14
|
- [Development](#development)
|
|
13
15
|
- [Running tests](#running-tests)
|
|
@@ -23,33 +25,35 @@
|
|
|
23
25
|
"AppMap" is a data format which records code structure (modules, classes, and methods), code execution events
|
|
24
26
|
(function calls and returns), and code metadata (repo name, repo URL, commit
|
|
25
27
|
SHA, labels, etc). It's more granular than a performance profile, but it's less
|
|
26
|
-
granular than a full debug trace. It's designed to be optimal for understanding the design intent and
|
|
28
|
+
granular than a full debug trace. It's designed to be optimal for understanding the design intent and structure of code and key data flows.
|
|
27
29
|
|
|
28
30
|
There are several ways to record AppMaps of your Ruby program using the `appmap` gem:
|
|
29
31
|
|
|
30
|
-
* Run your RSpec
|
|
32
|
+
* Run your tests (RSpec, Minitest, Cucumber) with the environment variable `APPMAP=true`. An AppMap will be generated for each spec.
|
|
31
33
|
* Run your application server with AppMap remote recording enabled, and use the [AppLand
|
|
32
34
|
browser extension](https://github.com/applandinc/appland-browser-extension) to start,
|
|
33
35
|
stop, and upload recordings.
|
|
34
|
-
*
|
|
36
|
+
* Wrap some code in an `AppMap.record` block, which returns JSON containing the code execution trace.
|
|
35
37
|
|
|
36
|
-
Once you have
|
|
37
|
-
to upload them to the AppLand server. This command, and some others, is provided
|
|
38
|
-
by the [AppLand CLI](https://github.com/applandinc/appland-cli/releases).
|
|
39
|
-
Then, on the [AppLand website](https://app.land), you can
|
|
40
|
-
visualize the design of your code and share links with collaborators.
|
|
38
|
+
Once you have made a recording, there are two ways to view automatically generated diagrams of the AppMaps.
|
|
41
39
|
|
|
42
|
-
|
|
40
|
+
The first option is to load the diagrams directly in your IDE, using the [AppMap extension for VSCode](https://marketplace.visualstudio.com/items?itemName=appland.appmap).
|
|
43
41
|
|
|
44
|
-
|
|
42
|
+
The second option is to upload them to the [AppLand server](https://app.land) using the [AppLand CLI](https://github.com/applandinc/appland-cli/releases).
|
|
45
43
|
|
|
46
|
-
|
|
44
|
+
### Supported versions
|
|
47
45
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
* Ruby 2.5, 2.6, 2.7
|
|
47
|
+
* Rails 5, 6
|
|
48
|
+
|
|
49
|
+
Support for new versions is added frequently, please check back regularly for updates.
|
|
50
|
+
|
|
51
|
+
# Installation
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
<a href="https://www.loom.com/share/78ab32a312ff4b85aa8827a37f1cb655"> <p>Quick and easy setup of the AppMap gem for Rails - Watch Video</p> <img style="max-width:300px;" src="https://cdn.loom.com/sessions/thumbnails/78ab32a312ff4b85aa8827a37f1cb655-with-play.gif"> </a>
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
Add `gem 'appmap'` to your Gemfile just as you would any other dependency. We recommend that the Gem be added to the `:development, :test` section.
|
|
53
57
|
|
|
54
58
|
```
|
|
55
59
|
group :development, :test do
|
|
@@ -65,7 +69,8 @@ If you are using Ruby on Rails, require the railtie after Rails is loaded.
|
|
|
65
69
|
|
|
66
70
|
```
|
|
67
71
|
# application.rb is a good place to do this, along with all the other railties.
|
|
68
|
-
require 'appmap
|
|
72
|
+
# Don't require the railtie in environments that don't bundle the appmap gem.
|
|
73
|
+
require 'appmap/railtie' if defined?(AppMap).
|
|
69
74
|
```
|
|
70
75
|
|
|
71
76
|
# Configuration
|
|
@@ -78,7 +83,14 @@ name: MyProject
|
|
|
78
83
|
packages:
|
|
79
84
|
- path: app/controllers
|
|
80
85
|
- path: app/models
|
|
86
|
+
- path: app/jobs
|
|
87
|
+
- path: app/helpers
|
|
88
|
+
# Include the gems that you want to see in the dependency maps.
|
|
89
|
+
# These are just examples.
|
|
81
90
|
- gem: activerecord
|
|
91
|
+
- gem: devise
|
|
92
|
+
- gem: aws-sdk
|
|
93
|
+
- gem: will_paginate
|
|
82
94
|
```
|
|
83
95
|
|
|
84
96
|
* **name** Provides the project name (required)
|
|
@@ -93,6 +105,37 @@ Each entry in the `packages` list is a YAML object which has the following keys:
|
|
|
93
105
|
* **gem** As an alternative to specifying the path, specify the name of a dependency gem. When using `gem`, don't specify `path`.
|
|
94
106
|
* **exclude** A list of files and directories which will be ignored. By default, all modules, classes and public
|
|
95
107
|
functions are inspected.
|
|
108
|
+
* **shallow** When set to `true`, only the first function call entry into a package will be recorded. Subsequent function calls within
|
|
109
|
+
the same package are not recorded unless code execution leaves the package and re-enters it. Default: `true` when using `gem`,
|
|
110
|
+
`false` when using `path`.
|
|
111
|
+
|
|
112
|
+
# Labels
|
|
113
|
+
|
|
114
|
+
The [AppMap data format](https://github.com/applandinc/appmap) provides for class and function `labels`, which can be used to enhance the AppMap visualizations, and to programatically analyze the data.
|
|
115
|
+
|
|
116
|
+
You can apply function labels using source code comments in your Ruby code. To apply a labels to a function, add a `@label` or `@labels` line to the comment which immediately precedes a function.
|
|
117
|
+
|
|
118
|
+
For example, if you add this comment to your source code:
|
|
119
|
+
|
|
120
|
+
```ruby
|
|
121
|
+
class ApiKey
|
|
122
|
+
# @labels provider.authentication security
|
|
123
|
+
def authenticate(key)
|
|
124
|
+
# logic to verify the key here...
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Then the AppMap metadata section for this function will include:
|
|
130
|
+
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"name": "authenticate",
|
|
134
|
+
"type": "function",
|
|
135
|
+
"labels": [ "provider.authentication", "security" ]
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
96
139
|
|
|
97
140
|
# Running
|
|
98
141
|
|
|
@@ -119,13 +162,10 @@ require 'appmap/rspec'
|
|
|
119
162
|
require File.expand_path("../../config/environment", __FILE__)
|
|
120
163
|
```
|
|
121
164
|
|
|
122
|
-
2)
|
|
123
|
-
examples.
|
|
124
|
-
|
|
125
|
-
3) Run the tests with the environment variable `APPMAP=true`:
|
|
165
|
+
2) Run the tests with the environment variable `APPMAP=true`:
|
|
126
166
|
|
|
127
167
|
```sh-session
|
|
128
|
-
$ APPMAP=true bundle exec rspec
|
|
168
|
+
$ APPMAP=true bundle exec rspec
|
|
129
169
|
```
|
|
130
170
|
|
|
131
171
|
Each RSpec test will output an AppMap file into the directory `tmp/appmap/rspec`. For example:
|
|
@@ -135,23 +175,6 @@ $ find tmp/appmap/rspec
|
|
|
135
175
|
Hello_says_hello_when_prompted.appmap.json
|
|
136
176
|
```
|
|
137
177
|
|
|
138
|
-
If you include the `feature` and `feature_group` metadata, these attributes will be exported to the AppMap file in the
|
|
139
|
-
`metadata` section. It will look something like this:
|
|
140
|
-
|
|
141
|
-
```json
|
|
142
|
-
{
|
|
143
|
-
...
|
|
144
|
-
"metadata": {
|
|
145
|
-
"name": "Hello app says hello when prompted",
|
|
146
|
-
"feature": "Hello app says hello",
|
|
147
|
-
"feature_group": "Hello"
|
|
148
|
-
},
|
|
149
|
-
...
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
If you don't explicitly declare `feature` and `feature_group`, then they will be inferred from the spec name and example descriptions.
|
|
154
|
-
|
|
155
178
|
## Minitest
|
|
156
179
|
|
|
157
180
|
To record Minitest tests, follow these additional steps:
|
|
@@ -168,17 +191,23 @@ Note that `test_helper.rb` in a Rails project typically loads the application's
|
|
|
168
191
|
require_relative '../config/environment'
|
|
169
192
|
```
|
|
170
193
|
|
|
171
|
-
and `appmap/
|
|
194
|
+
and `appmap/minitest` must be required before this:
|
|
172
195
|
|
|
173
196
|
```ruby
|
|
174
|
-
require 'appmap/
|
|
197
|
+
require 'appmap/minitest'
|
|
175
198
|
require_relative '../config/environment'
|
|
176
199
|
```
|
|
177
200
|
|
|
178
|
-
2) Run
|
|
201
|
+
2) Run your tests as you normally would with the environment variable `APPMAP=true`. For example:
|
|
179
202
|
|
|
180
|
-
```
|
|
181
|
-
$ APPMAP=true bundle exec
|
|
203
|
+
```
|
|
204
|
+
$ APPMAP=true bundle exec rake test
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
or
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
$ APPMAP=true bundle exec ruby -Ilib -Itest test/*_test.rb
|
|
182
211
|
```
|
|
183
212
|
|
|
184
213
|
Each Minitest test will output an AppMap file into the directory `tmp/appmap/minitest`. For example:
|
|
@@ -235,9 +264,9 @@ To manually record ad-hoc AppMaps of your Ruby app, use AppMap remote recording.
|
|
|
235
264
|
1. Add the AppMap remote recording middleware. For example, in `config/initializers/appmap_remote_recording.rb`:
|
|
236
265
|
|
|
237
266
|
```ruby
|
|
238
|
-
|
|
267
|
+
if defined?(AppMap)
|
|
268
|
+
require 'appmap/middleware/remote_recording'
|
|
239
269
|
|
|
240
|
-
unless Rails.env.test?
|
|
241
270
|
Rails.application.config.middleware.insert_after \
|
|
242
271
|
Rails::Rack::Logger,
|
|
243
272
|
AppMap::Middleware::RemoteRecording
|
|
@@ -258,14 +287,14 @@ $ bundle exec rails server
|
|
|
258
287
|
|
|
259
288
|
6. Open the AppLand browser extension and push `Stop`. The recording will be transferred to the AppLand website and opened in your browser.
|
|
260
289
|
|
|
261
|
-
|
|
290
|
+
# AppMap for VSCode
|
|
262
291
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
Note that using this method is kind of a blunt instrument. Recording RSpecs and using Remote Recording are usually better options.
|
|
292
|
+
The [AppMap extension for VSCode](https://marketplace.visualstudio.com/items?itemName=appland.appmap) is a great way to onboard developers to new code, and troubleshoot hard-to-understand bugs with visuals.
|
|
266
293
|
|
|
267
294
|
# Uploading AppMaps
|
|
268
295
|
|
|
296
|
+
[https://app.land](https://app.land) can be used to store, analyze, and share AppMaps.
|
|
297
|
+
|
|
269
298
|
For instructions on uploading, see the documentation of the [AppLand CLI](https://github.com/applandinc/appland-cli).
|
|
270
299
|
|
|
271
300
|
# Development
|
data/Rakefile
CHANGED
|
@@ -18,12 +18,12 @@ namespace 'gem' do
|
|
|
18
18
|
require 'bundler/gem_tasks'
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
RUBY_VERSIONS=%w[2.5 2.6]
|
|
22
|
-
FIXTURE_APPS=%w[rack_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]
|
|
23
23
|
|
|
24
24
|
def run_cmd(*cmd)
|
|
25
25
|
$stderr.puts "Running: #{cmd}"
|
|
26
|
-
out,s = Open3.capture2e(*cmd)
|
|
26
|
+
out, s = Open3.capture2e(*cmd)
|
|
27
27
|
unless s.success?
|
|
28
28
|
$stderr.puts <<-END
|
|
29
29
|
Command failed:
|
data/lib/appmap/class_map.rb
CHANGED
|
@@ -113,17 +113,18 @@ module AppMap
|
|
|
113
113
|
[ method.defined_class, static ? '.' : '#', method.name ].join
|
|
114
114
|
end
|
|
115
115
|
|
|
116
|
+
source, comment = begin
|
|
117
|
+
[ method.source, method.comment ]
|
|
118
|
+
rescue MethodSource::SourceNotFoundError
|
|
119
|
+
[ nil, nil, ]
|
|
120
|
+
end
|
|
121
|
+
|
|
116
122
|
if include_source
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
comment = method.comment || ''
|
|
120
|
-
function_info[:comment] = comment unless comment.empty?
|
|
121
|
-
rescue MethodSource::SourceNotFoundError
|
|
122
|
-
# pass
|
|
123
|
-
end
|
|
123
|
+
function_info[:source] = source unless source.blank?
|
|
124
|
+
function_info[:comment] = comment unless comment.blank?
|
|
124
125
|
end
|
|
125
126
|
|
|
126
|
-
function_info[:labels] = package.labels
|
|
127
|
+
function_info[:labels] = parse_labels(comment) + (package.labels || [])
|
|
127
128
|
object_infos << function_info
|
|
128
129
|
|
|
129
130
|
parent = root
|
|
@@ -141,6 +142,22 @@ module AppMap
|
|
|
141
142
|
end
|
|
142
143
|
end
|
|
143
144
|
|
|
145
|
+
# Labels can be embedded in the function comment. Label format is similar to YARD and JavaDoc.
|
|
146
|
+
# The keyword is @labels or @label. The keyword is followed by space-separated labels.
|
|
147
|
+
# For example:
|
|
148
|
+
# @label provider.authentication security
|
|
149
|
+
def parse_labels(comment)
|
|
150
|
+
return [] unless comment
|
|
151
|
+
|
|
152
|
+
comment
|
|
153
|
+
.split("\n")
|
|
154
|
+
.map { |line| line.match(/^\s*#\s*@labels?\s+(.*)/) }
|
|
155
|
+
.compact
|
|
156
|
+
.map { |match| match[1] }
|
|
157
|
+
.inject([]) { |accum, labels| accum += labels.split(/\s+/); accum }
|
|
158
|
+
.sort
|
|
159
|
+
end
|
|
160
|
+
|
|
144
161
|
def find_or_create(list, info)
|
|
145
162
|
obj = list.find { |item| item.type == info[:type] && item.name == info[:name] }
|
|
146
163
|
return obj if obj
|
data/lib/appmap/config.rb
CHANGED
|
@@ -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
|
-
|
|
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
|