appmap 0.35.2 → 0.39.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/.gitignore +2 -1
- data/.rubocop.yml +15 -1
- data/.travis.yml +0 -7
- data/CHANGELOG.md +22 -0
- data/README.md +24 -12
- data/Rakefile +3 -2
- data/appmap.gemspec +2 -1
- data/appmap.yml +1 -7
- data/lib/appmap.rb +2 -2
- data/lib/appmap/class_map.rb +20 -6
- data/lib/appmap/config.rb +66 -22
- data/lib/appmap/event.rb +16 -1
- data/lib/appmap/hook/method.rb +18 -12
- data/lib/appmap/rails/request_handler.rb +20 -4
- data/lib/appmap/railtie.rb +1 -1
- data/lib/appmap/rspec.rb +1 -1
- data/lib/appmap/trace.rb +18 -7
- data/lib/appmap/version.rb +2 -2
- data/spec/abstract_controller4_base_spec.rb +27 -28
- data/spec/abstract_controller_base_spec.rb +132 -67
- data/spec/class_map_spec.rb +36 -0
- data/spec/fixtures/hook/instance_method.rb +4 -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/{.ruby-version → spec/fixtures/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 +51 -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/{rails_users_app → 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/{rails_users_app → rails5_users_app}/app/models/activerecord/user.rb +0 -0
- data/spec/fixtures/{rails_users_app → 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/{rails_users_app → rails5_users_app}/app/views/layouts/application.html.haml +0 -0
- data/spec/fixtures/{rails_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 +0 -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/{rails_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/{rails_users_app → rails5_users_app}/config/initializers/filter_parameter_logging.rb +0 -0
- data/spec/fixtures/{rails_users_app → rails5_users_app}/config/initializers/inflections.rb +0 -0
- data/spec/fixtures/{rails_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/{rails_users_app → rails5_users_app}/config/routes.rb +1 -1
- 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/{rails_users_app → rails5_users_app}/lib/tasks/.keep +0 -0
- data/spec/fixtures/{rails_users_app → 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/{rails_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/{rails_users_app → rails6_users_app}/.ruby-version +0 -0
- data/spec/fixtures/rails6_users_app/Dockerfile +29 -0
- data/spec/fixtures/rails6_users_app/Dockerfile.pg +3 -0
- data/spec/fixtures/{rails_users_app → rails6_users_app}/Gemfile +1 -1
- data/spec/fixtures/rails6_users_app/Rakefile +6 -0
- data/spec/fixtures/rails6_users_app/app/controllers/api/users_controller.rb +27 -0
- data/spec/fixtures/rails6_users_app/app/controllers/application_controller.rb +2 -0
- data/spec/fixtures/rails6_users_app/app/controllers/concerns/.keep +0 -0
- data/spec/fixtures/rails6_users_app/app/controllers/health_controller.rb +5 -0
- data/spec/fixtures/rails6_users_app/app/controllers/users_controller.rb +13 -0
- data/spec/fixtures/rails6_users_app/app/models/activerecord/user.rb +18 -0
- data/spec/fixtures/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/rails6_users_app/app/views/layouts/application.html.haml +7 -0
- data/spec/fixtures/rails6_users_app/app/views/users/index.html.haml +7 -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/rails6_users_app/config.ru +5 -0
- data/spec/fixtures/rails6_users_app/config/application.rb +51 -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/rails6_users_app/config/database.yml +18 -0
- data/spec/fixtures/rails6_users_app/config/environment.rb +5 -0
- data/spec/fixtures/rails6_users_app/config/environments/development.rb +40 -0
- data/spec/fixtures/rails6_users_app/config/environments/production.rb +68 -0
- data/spec/fixtures/rails6_users_app/config/environments/test.rb +36 -0
- data/spec/fixtures/rails6_users_app/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/fixtures/rails6_users_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/fixtures/rails6_users_app/config/initializers/cors.rb +16 -0
- data/spec/fixtures/rails6_users_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/fixtures/rails6_users_app/config/initializers/inflections.rb +16 -0
- data/spec/fixtures/rails6_users_app/config/initializers/mime_types.rb +4 -0
- data/spec/fixtures/rails6_users_app/config/initializers/record_button.rb +3 -0
- data/spec/fixtures/rails6_users_app/config/initializers/wrap_parameters.rb +9 -0
- data/spec/fixtures/rails6_users_app/config/locales/en.yml +33 -0
- data/spec/fixtures/rails6_users_app/config/routes.rb +11 -0
- data/spec/fixtures/rails6_users_app/create_app +27 -0
- 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/rails6_users_app/docker-compose.yml +28 -0
- 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/rails6_users_app/lib/tasks/.keep +0 -0
- data/spec/fixtures/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/rails6_users_app/spec/rails_helper.rb +66 -0
- data/spec/fixtures/rails6_users_app/spec/spec_helper.rb +96 -0
- data/spec/fixtures/rails6_users_app/users_app/.gitignore +20 -0
- data/spec/hook_spec.rb +103 -22
- data/spec/rails_spec_helper.rb +5 -5
- data/spec/railtie_spec.rb +31 -32
- data/spec/record_sql_rails4_pg_spec.rb +47 -48
- 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/test/expectations/openssl_test_key_sign1.json +55 -0
- data/test/expectations/openssl_test_key_sign2.json +58 -0
- data/test/fixtures/gem_test/Gemfile +6 -0
- data/test/fixtures/gem_test/appmap.yml +3 -0
- data/test/fixtures/gem_test/test/to_param_test.rb +14 -0
- data/test/gem_test.rb +34 -0
- data/test/minitest_test.rb +2 -2
- data/test/openssl_test.rb +10 -117
- metadata +173 -80
- data/spec/fixtures/rails_users_app/app/controllers/users_controller.rb +0 -5
- data/spec/fixtures/rails_users_app/appmap.yml +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7f48fa55666d8310e8a24c268a7b72c1748c22fe0aa9b884000b1e83a703dbac
|
|
4
|
+
data.tar.gz: 5d82f1809e549bc71659048a9dce037eafe6e261c63c09d127bbd6b1f43d5b3c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5077fd340fac2478af5361e518c777b8ef76ffeb358aee18f6f507a6314b687ea02a40721b32fe0d2886d279e76ed3d249f9ebfd7b850fb05a1d5d2168b62c6c
|
|
7
|
+
data.tar.gz: 97b2c5306bd7b07d9f853b883d1ece37f6160683ae0eec5c5d6afe9e6909311468fb2def4e2f70c439ad18a56f9262e77569c7385b2d34dca28e02119302b57d
|
data/.dockerignore
CHANGED
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
AllCops:
|
|
2
|
+
NewCops: enable
|
|
3
|
+
|
|
4
|
+
Layout/CaseIndentation:
|
|
5
|
+
EnforcedStyle: end
|
|
6
|
+
|
|
7
|
+
Layout/FirstArgumentIndentation:
|
|
8
|
+
EnforcedStyle: consistent
|
|
9
|
+
|
|
1
10
|
Layout/SpaceInsideArrayLiteralBrackets:
|
|
2
11
|
Enabled: false
|
|
3
12
|
|
|
@@ -8,12 +17,17 @@ Layout/HeredocIndentation:
|
|
|
8
17
|
Layout/LineLength:
|
|
9
18
|
Max: 120
|
|
10
19
|
|
|
20
|
+
Metrics/BlockLength:
|
|
21
|
+
ExcludedMethods:
|
|
22
|
+
- it
|
|
23
|
+
- context
|
|
24
|
+
|
|
11
25
|
Style/MultilineBlockChain:
|
|
12
26
|
Enabled: false
|
|
13
27
|
|
|
14
28
|
Style/NumericPredicate:
|
|
15
29
|
Enabled: false
|
|
16
|
-
|
|
30
|
+
|
|
17
31
|
Style/AndOr:
|
|
18
32
|
Enabled: false
|
|
19
33
|
|
data/.travis.yml
CHANGED
|
@@ -28,13 +28,6 @@ jobs:
|
|
|
28
28
|
script:
|
|
29
29
|
- bundle exec rake build:base:2.6
|
|
30
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
31
|
- stage: spec
|
|
39
32
|
script:
|
|
40
33
|
- bundle exec rake spec:2.5
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
# v0.39.0
|
|
2
|
+
|
|
3
|
+
* Recognize and record `normalized_path_info` in Rails applications, per 1.4 AppMap format version.
|
|
4
|
+
|
|
5
|
+
# v0.38.1
|
|
6
|
+
|
|
7
|
+
* Package configuration can be `shallow`, in case which only the initial entry into the package is recorded.
|
|
8
|
+
|
|
9
|
+
# v0.37.2
|
|
10
|
+
* Fix ParameterFilter deprecation warning.
|
|
11
|
+
|
|
12
|
+
# v0.37.1
|
|
13
|
+
* Fix parameter mapping with keyword and rest arguments.
|
|
14
|
+
|
|
15
|
+
# v0.37.0
|
|
16
|
+
* Capture method source and comment.
|
|
17
|
+
|
|
18
|
+
# v0.36.0
|
|
19
|
+
* *appmap.yml* package definition may specify `gem`.
|
|
20
|
+
* Skip loading the railtie if `APPMAP_INITIALIZE` environment variable
|
|
21
|
+
is set to `false`.
|
|
22
|
+
|
|
1
23
|
# v0.35.2
|
|
2
24
|
* Make sure `MethodEvent#display_string` works when the value's `#to_s` and/or `#inspect`
|
|
3
25
|
methods have problems.
|
data/README.md
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
- [About](#about)
|
|
2
3
|
- [Installation](#installation)
|
|
3
4
|
- [Configuration](#configuration)
|
|
@@ -13,7 +14,7 @@
|
|
|
13
14
|
- [Using fixture apps](#using-fixture-apps)
|
|
14
15
|
- [`test/fixtures`](#testfixtures)
|
|
15
16
|
- [`spec/fixtures`](#specfixtures)
|
|
16
|
-
|
|
17
|
+
|
|
17
18
|
|
|
18
19
|
# About
|
|
19
20
|
|
|
@@ -27,8 +28,9 @@ granular than a full debug trace. It's designed to be optimal for understanding
|
|
|
27
28
|
There are several ways to record AppMaps of your Ruby program using the `appmap` gem:
|
|
28
29
|
|
|
29
30
|
* Run your RSpec tests with the environment variable `APPMAP=true`. An AppMap will be generated for each spec.
|
|
30
|
-
* Run your application server with AppMap remote recording enabled, and use the
|
|
31
|
-
browser extension to start,
|
|
31
|
+
* Run your application server with AppMap remote recording enabled, and use the [AppLand
|
|
32
|
+
browser extension](https://github.com/applandinc/appland-browser-extension) to start,
|
|
33
|
+
stop, and upload recordings.
|
|
32
34
|
* Run the command `appmap record <program>` to record the entire execution of a program.
|
|
33
35
|
|
|
34
36
|
Once you have recorded some AppMaps (for example, by running RSpec tests), you use the `appland upload` command
|
|
@@ -76,6 +78,7 @@ name: MyProject
|
|
|
76
78
|
packages:
|
|
77
79
|
- path: app/controllers
|
|
78
80
|
- path: app/models
|
|
81
|
+
- gem: activerecord
|
|
79
82
|
```
|
|
80
83
|
|
|
81
84
|
* **name** Provides the project name (required)
|
|
@@ -87,8 +90,12 @@ Each entry in the `packages` list is a YAML object which has the following keys:
|
|
|
87
90
|
|
|
88
91
|
* **path** The path to the source code directory. The path may be relative to the current working directory, or it may
|
|
89
92
|
be an absolute path.
|
|
93
|
+
* **gem** As an alternative to specifying the path, specify the name of a dependency gem. When using `gem`, don't specify `path`.
|
|
90
94
|
* **exclude** A list of files and directories which will be ignored. By default, all modules, classes and public
|
|
91
95
|
functions are inspected.
|
|
96
|
+
* **shallow** When set to `true`, only the first function call entry into a package will be recorded. Subsequent function calls within
|
|
97
|
+
the same package are not recorded unless code execution leaves the package and re-enters it. Default: `true` when using `gem`,
|
|
98
|
+
`false` when using `path`.
|
|
92
99
|
|
|
93
100
|
# Running
|
|
94
101
|
|
|
@@ -164,16 +171,22 @@ Note that `test_helper.rb` in a Rails project typically loads the application's
|
|
|
164
171
|
require_relative '../config/environment'
|
|
165
172
|
```
|
|
166
173
|
|
|
167
|
-
and `appmap/
|
|
174
|
+
and `appmap/minitest` must be required before this:
|
|
168
175
|
|
|
169
176
|
```ruby
|
|
170
|
-
require 'appmap/
|
|
177
|
+
require 'appmap/minitest'
|
|
171
178
|
require_relative '../config/environment'
|
|
172
179
|
```
|
|
173
180
|
|
|
174
|
-
2) Run
|
|
181
|
+
2) Run your tests as you normally would with the environment variable `APPMAP=true`. For example:
|
|
175
182
|
|
|
176
|
-
```
|
|
183
|
+
```
|
|
184
|
+
$ APPMAP=true bundle exec rake
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
or
|
|
188
|
+
|
|
189
|
+
```
|
|
177
190
|
$ APPMAP=true bundle exec -Ilib -Itest test/*
|
|
178
191
|
```
|
|
179
192
|
|
|
@@ -248,11 +261,11 @@ end
|
|
|
248
261
|
$ bundle exec rails server
|
|
249
262
|
```
|
|
250
263
|
|
|
251
|
-
4. Open the
|
|
264
|
+
4. Open the AppLand browser extension and push `Start`.
|
|
252
265
|
|
|
253
266
|
5. Use your app. For example, perform a login flow, or run through a manual UI test.
|
|
254
267
|
|
|
255
|
-
6. Open the
|
|
268
|
+
6. Open the AppLand browser extension and push `Stop`. The recording will be transferred to the AppLand website and opened in your browser.
|
|
256
269
|
|
|
257
270
|
## Ruby on Rails
|
|
258
271
|
|
|
@@ -265,6 +278,7 @@ Note that using this method is kind of a blunt instrument. Recording RSpecs and
|
|
|
265
278
|
For instructions on uploading, see the documentation of the [AppLand CLI](https://github.com/applandinc/appland-cli).
|
|
266
279
|
|
|
267
280
|
# Development
|
|
281
|
+
[](https://travis-ci.org/applandinc/appmap-ruby)
|
|
268
282
|
|
|
269
283
|
## Running tests
|
|
270
284
|
|
|
@@ -289,7 +303,7 @@ $ bundle exec rake compile
|
|
|
289
303
|
### `test/fixtures`
|
|
290
304
|
|
|
291
305
|
The fixture apps in `test/fixtures` are plain Ruby projects that exercise the basic functionality of the
|
|
292
|
-
`appmap` gem. To develop in a fixture,
|
|
306
|
+
`appmap` gem. To develop in a fixture, simply enter the fixture directory and `bundle`.
|
|
293
307
|
|
|
294
308
|
### `spec/fixtures`
|
|
295
309
|
|
|
@@ -339,5 +353,3 @@ Finished in 0.07357 seconds (files took 2.1 seconds to load)
|
|
|
339
353
|
4 examples, 0 failures
|
|
340
354
|
```
|
|
341
355
|
|
|
342
|
-
# Build status
|
|
343
|
-
[](https://travis-ci.org/applandinc/appmap-ruby)
|
data/Rakefile
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
$: << File.join(__dir__, 'lib')
|
|
1
2
|
require 'appmap/version'
|
|
2
3
|
GEM_VERSION = AppMap::VERSION
|
|
3
4
|
|
|
@@ -18,7 +19,7 @@ namespace 'gem' do
|
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
RUBY_VERSIONS=%w[2.5 2.6]
|
|
21
|
-
FIXTURE_APPS=%w[rack_users_app
|
|
22
|
+
FIXTURE_APPS=%w[rack_users_app rails6_users_app rails5_users_app rails4_users_app]
|
|
22
23
|
|
|
23
24
|
def run_cmd(*cmd)
|
|
24
25
|
$stderr.puts "Running: #{cmd}"
|
|
@@ -113,7 +114,7 @@ namespace :spec do
|
|
|
113
114
|
desc ruby_version
|
|
114
115
|
task ruby_version, [:specs] => ["compile", "build:fixtures:#{ruby_version}:all"] do |_, task_args|
|
|
115
116
|
run_specs(ruby_version, task_args)
|
|
116
|
-
end.tap do|t|
|
|
117
|
+
end.tap do |t|
|
|
117
118
|
desc "Run all specs"
|
|
118
119
|
task :all, [:specs] => t
|
|
119
120
|
end
|
data/appmap.gemspec
CHANGED
|
@@ -27,10 +27,11 @@ Gem::Specification.new do |spec|
|
|
|
27
27
|
spec.add_dependency 'activesupport'
|
|
28
28
|
spec.add_dependency 'faraday'
|
|
29
29
|
spec.add_dependency 'gli'
|
|
30
|
+
spec.add_dependency 'method_source'
|
|
30
31
|
spec.add_dependency 'parser'
|
|
31
32
|
spec.add_dependency 'rack'
|
|
32
33
|
|
|
33
|
-
spec.add_development_dependency 'bundler', '
|
|
34
|
+
spec.add_development_dependency 'bundler', '>= 1.16'
|
|
34
35
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
|
35
36
|
spec.add_development_dependency 'pry-byebug'
|
|
36
37
|
spec.add_development_dependency 'rake', '>= 12.3.3'
|
data/appmap.yml
CHANGED
data/lib/appmap.rb
CHANGED
|
@@ -83,8 +83,8 @@ module AppMap
|
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
# Builds a class map from a config and a list of Ruby methods.
|
|
86
|
-
def class_map(methods)
|
|
87
|
-
ClassMap.build_from_methods(methods)
|
|
86
|
+
def class_map(methods, options = {})
|
|
87
|
+
ClassMap.build_from_methods(methods, options)
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
# Returns default metadata detected from the Ruby system and from the
|
data/lib/appmap/class_map.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'method_source'
|
|
4
|
+
|
|
3
5
|
module AppMap
|
|
4
6
|
class ClassMap
|
|
5
7
|
module HasChildren
|
|
@@ -48,7 +50,7 @@ module AppMap
|
|
|
48
50
|
end
|
|
49
51
|
end
|
|
50
52
|
Function = Struct.new(:name) do
|
|
51
|
-
attr_accessor :static, :location, :labels
|
|
53
|
+
attr_accessor :static, :location, :labels, :comment, :source
|
|
52
54
|
|
|
53
55
|
def type
|
|
54
56
|
'function'
|
|
@@ -60,30 +62,32 @@ module AppMap
|
|
|
60
62
|
type: type,
|
|
61
63
|
location: location,
|
|
62
64
|
static: static,
|
|
63
|
-
labels: labels
|
|
65
|
+
labels: labels,
|
|
66
|
+
comment: comment,
|
|
67
|
+
source: source
|
|
64
68
|
}.delete_if { |_, v| v.nil? || v == [] }
|
|
65
69
|
end
|
|
66
70
|
end
|
|
67
71
|
end
|
|
68
72
|
|
|
69
73
|
class << self
|
|
70
|
-
def build_from_methods(methods)
|
|
74
|
+
def build_from_methods(methods, options = {})
|
|
71
75
|
root = Types::Root.new
|
|
72
76
|
methods.each do |method|
|
|
73
|
-
add_function root, method
|
|
77
|
+
add_function root, method, options
|
|
74
78
|
end
|
|
75
79
|
root.children.map(&:to_h)
|
|
76
80
|
end
|
|
77
81
|
|
|
78
82
|
protected
|
|
79
83
|
|
|
80
|
-
def add_function(root, method)
|
|
84
|
+
def add_function(root, method, include_source: true)
|
|
81
85
|
package = method.package
|
|
82
86
|
static = method.static
|
|
83
87
|
|
|
84
88
|
object_infos = [
|
|
85
89
|
{
|
|
86
|
-
name: package.
|
|
90
|
+
name: package.name,
|
|
87
91
|
type: 'package'
|
|
88
92
|
}
|
|
89
93
|
]
|
|
@@ -109,6 +113,16 @@ module AppMap
|
|
|
109
113
|
[ method.defined_class, static ? '.' : '#', method.name ].join
|
|
110
114
|
end
|
|
111
115
|
|
|
116
|
+
if include_source
|
|
117
|
+
begin
|
|
118
|
+
function_info[:source] = method.source
|
|
119
|
+
comment = method.comment || ''
|
|
120
|
+
function_info[:comment] = comment unless comment.empty?
|
|
121
|
+
rescue MethodSource::SourceNotFoundError
|
|
122
|
+
# pass
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
112
126
|
function_info[:labels] = package.labels if package.labels
|
|
113
127
|
object_infos << function_info
|
|
114
128
|
|
data/lib/appmap/config.rb
CHANGED
|
@@ -2,17 +2,49 @@
|
|
|
2
2
|
|
|
3
3
|
module AppMap
|
|
4
4
|
class Config
|
|
5
|
-
Package = Struct.new(:path, :package_name, :exclude, :labels) do
|
|
6
|
-
|
|
7
|
-
|
|
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
|
+
|
|
13
|
+
class << self
|
|
14
|
+
def build_from_path(path, shallow: false, package_name: nil, exclude: [], labels: [])
|
|
15
|
+
Package.new(path, nil, package_name, exclude, labels, shallow)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def build_from_gem(gem, shallow: true, package_name: nil, exclude: [], labels: [])
|
|
19
|
+
gem_paths(gem).map do |gem_path|
|
|
20
|
+
Package.new(gem_path, gem, package_name, exclude, labels, shallow)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private_class_method :new
|
|
25
|
+
|
|
26
|
+
protected
|
|
27
|
+
|
|
28
|
+
def gem_paths(gem)
|
|
29
|
+
gemspec = Gem.loaded_specs[gem] or raise "Gem #{gem.inspect} not found"
|
|
30
|
+
gemspec.source_paths.map do |path|
|
|
31
|
+
File.join(gemspec.gem_dir, path)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def name
|
|
37
|
+
gem || path
|
|
8
38
|
end
|
|
9
39
|
|
|
10
40
|
def to_h
|
|
11
41
|
{
|
|
12
42
|
path: path,
|
|
13
43
|
package_name: package_name,
|
|
44
|
+
gem: gem,
|
|
14
45
|
exclude: exclude.blank? ? nil : exclude,
|
|
15
|
-
labels: labels.blank? ? nil : labels
|
|
46
|
+
labels: labels.blank? ? nil : labels,
|
|
47
|
+
shallow: shallow
|
|
16
48
|
}.compact
|
|
17
49
|
end
|
|
18
50
|
end
|
|
@@ -20,29 +52,30 @@ module AppMap
|
|
|
20
52
|
Hook = Struct.new(:method_names, :package) do
|
|
21
53
|
end
|
|
22
54
|
|
|
23
|
-
|
|
55
|
+
OPENSSL_PACKAGES = Package.build_from_path('openssl', package_name: 'openssl', labels: %w[security crypto])
|
|
24
56
|
|
|
25
57
|
# Methods that should always be hooked, with their containing
|
|
26
58
|
# package and labels that should be applied to them.
|
|
27
59
|
HOOKED_METHODS = {
|
|
28
|
-
'ActiveSupport::SecurityUtils' => Hook.new(:secure_compare, Package.
|
|
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]))
|
|
29
62
|
}.freeze
|
|
30
63
|
|
|
31
64
|
BUILTIN_METHODS = {
|
|
32
|
-
'OpenSSL::PKey::PKey' => Hook.new(:sign,
|
|
33
|
-
'Digest::Instance' => Hook.new(:digest,
|
|
34
|
-
'OpenSSL::X509::Request' => Hook.new(%i[sign verify],
|
|
35
|
-
'OpenSSL::PKCS5' => Hook.new(%i[pbkdf2_hmac_sha1 pbkdf2_hmac],
|
|
36
|
-
'OpenSSL::Cipher' => Hook.new(%i[encrypt decrypt final],
|
|
37
|
-
'OpenSSL::X509::Certificate' => Hook.new(:sign,
|
|
38
|
-
'Net::HTTP' => Hook.new(:request, Package.
|
|
39
|
-
'Net::SMTP' => Hook.new(:send, Package.
|
|
40
|
-
'Net::POP3' => Hook.new(:mails, Package.
|
|
41
|
-
'Net::IMAP' => Hook.new(:send_command, Package.
|
|
42
|
-
'Marshal' => Hook.new(%i[dump load], Package.
|
|
43
|
-
'Psych' => Hook.new(%i[dump dump_stream load load_stream parse parse_stream], Package.
|
|
44
|
-
'JSON::Ext::Parser' => Hook.new(:parse, Package.
|
|
45
|
-
'JSON::Ext::Generator::State' => Hook.new(:generate, Package.
|
|
65
|
+
'OpenSSL::PKey::PKey' => Hook.new(:sign, OPENSSL_PACKAGES),
|
|
66
|
+
'Digest::Instance' => Hook.new(:digest, OPENSSL_PACKAGES),
|
|
67
|
+
'OpenSSL::X509::Request' => Hook.new(%i[sign verify], OPENSSL_PACKAGES),
|
|
68
|
+
'OpenSSL::PKCS5' => Hook.new(%i[pbkdf2_hmac_sha1 pbkdf2_hmac], OPENSSL_PACKAGES),
|
|
69
|
+
'OpenSSL::Cipher' => Hook.new(%i[encrypt decrypt final], OPENSSL_PACKAGES),
|
|
70
|
+
'OpenSSL::X509::Certificate' => Hook.new(:sign, OPENSSL_PACKAGES),
|
|
71
|
+
'Net::HTTP' => Hook.new(:request, Package.build_from_path('net/http', package_name: 'net/http', labels: %w[http io])),
|
|
72
|
+
'Net::SMTP' => Hook.new(:send, Package.build_from_path('net/smtp', package_name: 'net/smtp', labels: %w[smtp email io])),
|
|
73
|
+
'Net::POP3' => Hook.new(:mails, Package.build_from_path('net/pop3', package_name: 'net/pop', labels: %w[pop pop3 email io])),
|
|
74
|
+
'Net::IMAP' => Hook.new(:send_command, Package.build_from_path('net/imap', package_name: 'net/imap', labels: %w[imap email io])),
|
|
75
|
+
'Marshal' => Hook.new(%i[dump load], Package.build_from_path('marshal', labels: %w[serialization marshal])),
|
|
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])),
|
|
77
|
+
'JSON::Ext::Parser' => Hook.new(:parse, 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])),
|
|
46
79
|
}.freeze
|
|
47
80
|
|
|
48
81
|
attr_reader :name, :packages
|
|
@@ -62,8 +95,19 @@ module AppMap
|
|
|
62
95
|
# Loads configuration from a Hash.
|
|
63
96
|
def load(config_data)
|
|
64
97
|
packages = (config_data['packages'] || []).map do |package|
|
|
65
|
-
|
|
66
|
-
|
|
98
|
+
gem = package['gem']
|
|
99
|
+
path = package['path']
|
|
100
|
+
raise 'AppMap package configuration should specify gem or path, not both' if gem && path
|
|
101
|
+
|
|
102
|
+
if gem
|
|
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)
|
|
107
|
+
else
|
|
108
|
+
[ Package.build_from_path(path, exclude: package['exclude'] || [], shallow: package['shallow']) ]
|
|
109
|
+
end
|
|
110
|
+
end.flatten
|
|
67
111
|
Config.new config_data['name'], packages
|
|
68
112
|
end
|
|
69
113
|
end
|