appmap 0.22.0 → 0.23.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e4bb797e4a52228da17a1d2bea86cc7b39c0e77f868794282a4a506bc118c1b
4
- data.tar.gz: 17c42a6dbab64ded9e0c0735df3e1a6b4ffb871f5368c134038fa4574f18a140
3
+ metadata.gz: 2ba1394503aa1c8f498901ed3c7b903af4bcf5b60b16fe48eee08d9c64f66d67
4
+ data.tar.gz: 665c48d0d450b2500277b2bdcb54dc356e0b31d442c1f7d9fcb47d0c5c054de6
5
5
  SHA512:
6
- metadata.gz: ce536f9473bc5c13127c7f9e327e011123a0b56291197c1c3f91db68c7ec2fa64438382cc08f002e2634cf7a1877b630f43849989197ca0285da72e79a93767d
7
- data.tar.gz: 5a457dbc9afa127d6ca284bf47ee549b3e7a0cb579e1edf2313783ced314e87134ac9a2c4b06e1035402e5619876d7d990b0f65268e12a991480641b5574bc0e
6
+ metadata.gz: 279932323e5ca1ba95eb42a7bc4410e795fb308b2861c1b3ee2bb29ece31e54664983731648967e82ce4367813eb67557791c21bab16cfc67192d743b34d7568
7
+ data.tar.gz: 0141f02617969b168a2dd0c158e8fbfd5b85caa5bc3fa23691c049ae37adefa269d8e76c3c37b4f08f139bc20071b53bf7b31056b2df1c5dfafef44123a7136b
data/.travis.yml ADDED
@@ -0,0 +1,38 @@
1
+ language: ruby
2
+
3
+ services:
4
+ - docker
5
+
6
+ # We expect RAILS_ENV to start off unset, then adjust its value as
7
+ # necessary.
8
+ before_script:
9
+ - unset RAILS_ENV
10
+
11
+ jobs:
12
+ include:
13
+ - stage: minitest
14
+ script:
15
+ - mkdir tmp
16
+ - bundle exec rake minitest
17
+
18
+ - stage: base
19
+ script:
20
+ - bundle exec rake build:base:2.5
21
+ - stage: base
22
+ script:
23
+ - bundle exec rake build:base:2.6
24
+
25
+ - stage: fixtures
26
+ script:
27
+ - bundle exec rake build:fixtures:2.5:all
28
+ - stage: fixtures
29
+ script:
30
+ - bundle exec rake build:fixtures:2.6:all
31
+
32
+ - stage: spec
33
+ script:
34
+ - bundle exec rake spec:2.5
35
+ - stage: spec
36
+ script:
37
+ - bundle exec rake spec:2.6
38
+
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # v0.23.0
2
+
3
+ * **appmap stats** command added.
4
+
1
5
  # v0.22.0
2
6
 
3
7
  * **RSpec** recorder generates an "inventory" (AppMap with classMap, without events) named `Inventory.appmap.json`.
data/README.md CHANGED
@@ -171,5 +171,5 @@ Batch Id: a116f1df-ee57-4bde-8eef-851af0f3d7bc
171
171
  ```
172
172
 
173
173
  # Build status
174
+ [![Build Status](https://travis-ci.org/applandinc/appmap-ruby.svg?branch=master)](https://travis-ci.org/applandinc/appmap-ruby)
174
175
 
175
- ![Build status](https://travis-ci.org/applandinc/appmap-ruby.svg?branch=master)
data/Rakefile CHANGED
@@ -4,6 +4,8 @@ GEM_VERSION = AppMap::VERSION
4
4
  require 'rake/testtask'
5
5
  require 'rdoc/task'
6
6
 
7
+ require 'open3'
8
+
7
9
  namespace 'gem' do
8
10
  require 'bundler/gem_tasks'
9
11
  end
@@ -11,20 +13,32 @@ end
11
13
  RUBY_VERSIONS=%w[2.5 2.6]
12
14
  FIXTURE_APPS=%w[rack_users_app rails_users_app rails4_users_app]
13
15
 
16
+ def run_cmd(*cmd)
17
+ $stderr.puts "Running: #{cmd}"
18
+ out,s = Open3.capture2e(*cmd)
19
+ unless s.success?
20
+ $stderr.puts <<-END
21
+ Command failed:
22
+ <<< Output:
23
+ #{out}
24
+ >>> End of output
25
+ END
26
+ raise 'Docker build failed'
27
+ end
28
+ end
29
+
14
30
  def build_base_image(ruby_version)
15
- system "docker build" \
31
+ run_cmd "docker build" \
16
32
  " --build-arg RUBY_VERSION=#{ruby_version} --build-arg GEM_VERSION=#{GEM_VERSION}" \
17
- " -t appmap:#{GEM_VERSION} -f Dockerfile.appmap ." \
18
- or raise 'Docker build failed'
33
+ " -t appmap:#{GEM_VERSION} -f Dockerfile.appmap ."
19
34
  end
20
35
 
21
36
  def build_app_image(app, ruby_version)
22
37
  Dir.chdir "spec/fixtures/#{app}" do
23
- system "env RUBY_VERSION=#{ruby_version} GEM_VERSION=#{GEM_VERSION}" \
24
- " docker-compose build" \
25
- " --build-arg RUBY_VERSION=#{ruby_version}" \
26
- " --build-arg GEM_VERSION=#{GEM_VERSION}" \
27
- or raise 'docker-compose build failed'
38
+ run_cmd( {"RUBY_VERSION" => ruby_version, "GEM_VERSION" => GEM_VERSION},
39
+ " docker-compose build" \
40
+ " --build-arg RUBY_VERSION=#{ruby_version}" \
41
+ " --build-arg GEM_VERSION=#{GEM_VERSION}")
28
42
  end
29
43
  end
30
44
 
@@ -76,8 +90,7 @@ def run_specs(ruby_version, task_args)
76
90
  # cause it to be ignored. Setting it to '' or +nil+ causes an
77
91
  # empty argument to get passed to rspec, which confuses it.
78
92
  task.pattern = 'never match this'
79
- task.rspec_opts = '-f doc '
80
- task.rspec_opts += args.to_a.join(' ')
93
+ task.rspec_opts = args.to_a.join(' ')
81
94
  end
82
95
  end
83
96
 
@@ -112,6 +125,8 @@ Rake::TestTask.new(:minitest) do |t|
112
125
  t.test_files = FileList['test/**/*_test.rb']
113
126
  end
114
127
 
128
+ task spec: "spec:all"
129
+
115
130
  task test: %i[spec:all minitest]
116
131
 
117
132
  task default: :test
data/exe/appmap CHANGED
@@ -85,6 +85,57 @@ module AppMap
85
85
  end
86
86
  end
87
87
 
88
+ desc 'Calculate and print statistics of scenario files.'
89
+ arg_name 'filename'
90
+ command :stats do |c|
91
+ output_file_flag(c, default_value: '-')
92
+
93
+ c.desc 'Display format for the result (text | json)'
94
+ c.default_value 'text'
95
+ c.flag %i[f format]
96
+
97
+ c.desc 'Maximum number of lines to display for each stat'
98
+ c.flag %i[l limit]
99
+
100
+ c.action do |_, options, args|
101
+ require 'appmap/command/stats'
102
+
103
+ limit = options[:limit].to_i if options[:limit]
104
+
105
+ # Name of the file to analyze. GLI will ensure that it's present.
106
+ filenames = args
107
+ help_now!("'filename' argument is required") if filenames.empty?
108
+
109
+ require 'appmap/algorithm/stats'
110
+ result = filenames.inject(::AppMap::Algorithm::Stats::Result.new([], [])) do |stats_result, filename|
111
+ appmap = begin
112
+ JSON.parse(File.read(filename))
113
+ rescue JSON::ParserError
114
+ STDERR.puts "#{filename} is not valid JSON : #{$!}"
115
+ nil
116
+ end
117
+ stats_result.tap do
118
+ if appmap
119
+ limit = options[:limit].to_i if options[:limit]
120
+ stats_for_file = AppMap::Command::Stats.new(appmap).perform(limit: limit)
121
+ stats_result.merge!(stats_for_file)
122
+ end
123
+ end
124
+ end
125
+
126
+ result.sort!
127
+ result.limit!(limit) if limit
128
+
129
+ display = case options[:format]
130
+ when 'json'
131
+ JSON.pretty_generate(result.as_json)
132
+ else
133
+ result.as_text
134
+ end
135
+ @output_file.write display
136
+ end
137
+ end
138
+
88
139
  desc 'Upload a scenario file to AppLand.'
89
140
  arg_name 'filename'
90
141
  command :upload do |c|
@@ -14,7 +14,7 @@ module AppMap
14
14
  @logger = ->(msg) {}
15
15
  end
16
16
 
17
- def prune
17
+ def perform
18
18
  # This proc counts the number of objects in the class map whose type is 'k'
19
19
  count = proc do |k, e|
20
20
  n = 0
@@ -0,0 +1,88 @@
1
+ module AppMap
2
+ module Algorithm
3
+ StatsStruct = Struct.new(:appmap)
4
+
5
+ # Compute AppMap statistics.
6
+ class Stats < StatsStruct
7
+ Result = Struct.new(:class_frequency, :method_frequency) do
8
+ def merge!(other)
9
+ merge = lambda do |freq, other_freq|
10
+ freq_by_name = freq.inject({}) do |table, entry|
11
+ table.tap do
12
+ table[entry.name] = entry
13
+ end
14
+ end
15
+ other_freq.each do |other_entry|
16
+ entry = freq_by_name[other_entry.name]
17
+ if entry
18
+ entry.count += other_entry.count
19
+ else
20
+ freq << other_entry
21
+ end
22
+ end
23
+ end
24
+ merge.call(class_frequency, other.class_frequency)
25
+ merge.call(method_frequency, other.method_frequency)
26
+
27
+ self
28
+ end
29
+
30
+ def sort!
31
+ comparator = ->(a,b) { b.count <=> a.count }
32
+ class_frequency.sort!(&comparator)
33
+ method_frequency.sort!(&comparator)
34
+
35
+ self
36
+ end
37
+
38
+ def limit!(limit)
39
+ self.class_frequency = class_frequency[0...limit]
40
+ self.method_frequency = method_frequency[0...limit]
41
+
42
+ self
43
+ end
44
+
45
+ def as_text
46
+ lines = [
47
+ "Class frequency:",
48
+ "----------------",
49
+ ] + class_frequency.map(&:to_a).map(&:reverse).map { |line | line.join("\t") } + [
50
+ "",
51
+ "Method frequency:",
52
+ "----------------",
53
+ ] + method_frequency.map(&:to_a).map(&:reverse).map { |line | line.join("\t") }
54
+ lines.join("\n")
55
+ end
56
+ end
57
+ Frequency = Struct.new(:name, :count)
58
+
59
+ def perform(limit: nil)
60
+ events = appmap['events'] || []
61
+ frequency_calc = lambda do |key_func|
62
+ events_by_key = events.inject(Hash.new(0)) do |memo, event|
63
+ key = key_func.call(event)
64
+ memo.tap do
65
+ memo[key] += 1 if key
66
+ end
67
+ end
68
+ events_by_key.map do |key, count|
69
+ Frequency.new(key, count)
70
+ end
71
+ end
72
+
73
+ class_name_func = ->(event) { event['defined_class'] }
74
+ full_name_func = lambda do |event|
75
+ class_name = event['defined_class']
76
+ static = event['static']
77
+ function_name = event['method_id']
78
+ [ class_name, static ? '.' : '#', function_name ].join if class_name && !static.nil? && function_name
79
+ end
80
+
81
+ class_frequency = frequency_calc.call(class_name_func)
82
+ method_frequency = frequency_calc.call(full_name_func)
83
+
84
+ Result.new(class_frequency, method_frequency)
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,12 @@
1
+ module AppMap
2
+ module Command
3
+ StatsStruct = Struct.new(:appmap)
4
+
5
+ class Stats < StatsStruct
6
+ def perform(limit: nil)
7
+ require 'appmap/algorithm/stats'
8
+ AppMap::Algorithm::Stats.new(appmap).perform(limit: limit)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -92,7 +92,7 @@ module AppMap
92
92
  Algorithm::PruneClassMap.new(class_map).tap do |alg|
93
93
  alg.events = events if events
94
94
  alg.logger = ->(msg) { warn msg } if debug?
95
- end.prune
95
+ end.perform
96
96
  end
97
97
  end
98
98
  end
@@ -3,7 +3,7 @@
3
3
  module AppMap
4
4
  URL = 'https://github.com/applandinc/appmap-ruby'
5
5
 
6
- VERSION = '0.22.0'
6
+ VERSION = '0.23.0'
7
7
 
8
8
  APPMAP_FORMAT_VERSION = '1.2'
9
9
  end
@@ -8,7 +8,7 @@ describe 'AbstractControllerBase' do
8
8
  FileUtils.rm_rf tmpdir
9
9
  FileUtils.mkdir_p tmpdir
10
10
  cmd = "docker-compose run --rm -e APPMAP=true -v #{File.absolute_path tmpdir}:/app/tmp app ./bin/rspec spec/controllers/users_controller_api_spec.rb:8"
11
- system cmd, chdir: @fixture_dir or raise 'Failed to run rails_users_app container'
11
+ run_cmd cmd, chdir: @fixture_dir
12
12
 
13
13
  example.run
14
14
  end
@@ -8,7 +8,7 @@ describe 'AbstractControllerBase' do
8
8
  FileUtils.rm_rf tmpdir
9
9
  FileUtils.mkdir_p tmpdir
10
10
  cmd = "docker-compose run --rm -e APPMAP=true -v #{File.absolute_path tmpdir}:/app/tmp app ./bin/rspec spec/controllers/users_controller_api_spec.rb:8"
11
- system cmd, chdir: @fixture_dir or raise 'Failed to run rails_users_app container'
11
+ run_cmd cmd, chdir: @fixture_dir
12
12
 
13
13
  example.run
14
14
  end
@@ -1,11 +1,26 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
+ # Just checking for a healthy container isn't enough, apparently. If
4
+ # we don't wait here, sometimes the database is inaccessible.
5
+ for i in {1..10}; do
6
+ psql -h pg -U postgres postgres -c 'select 1' >/dev/null 2>&1 && break
7
+ printf ' .'
8
+ sleep 1
9
+ done
10
+ echo
11
+ out="$(psql -h pg -U postgres postgres -c 'select 1' 2>&1)"
12
+ if [[ $? != 0 ]]; then
13
+ echo "Postgres didn't start in time:"
14
+ echo "$out"
15
+ exit 1
16
+ fi
17
+
3
18
  psql -h pg -U postgres -c "create database app_development"
4
19
  psql -h pg -U postgres -c "create database app_test"
5
20
 
6
21
  set -e
7
22
 
8
- ./bin/rake db:migrate
23
+ RAILS_ENV=development ./bin/rake db:migrate
9
24
  RAILS_ENV=test ./bin/rake db:migrate
10
25
 
11
26
  echo "INSERT INTO users ( login ) VALUES ( 'admin' ) " | psql -h pg -U postgres app_development
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'open3'
2
3
 
3
4
  def wait_for_container(app_name)
4
5
  start_time = Time.now
@@ -11,24 +12,38 @@ def wait_for_container(app_name)
11
12
  end
12
13
  end
13
14
 
15
+ def run_cmd(*cmd)
16
+ out,s = Open3.capture2e(*cmd)
17
+ unless s.success?
18
+ $stderr.puts <<~END
19
+ Command failed:
20
+ #{cmd}
21
+ <<< Output:
22
+ #{out}
23
+ >>> End of output
24
+ END
25
+ raise 'Command failed'
26
+ end
27
+ end
28
+
14
29
  shared_context 'Rails app pg database' do
15
30
  before(:all) do
16
31
  raise "you must set @fixure_dir" unless @fixture_dir
17
32
 
18
33
  Dir.chdir @fixture_dir do
19
34
  cmd = 'docker-compose up -d pg'
20
- system cmd or raise "Command failed: #{cmd}"
35
+ run_cmd cmd
21
36
  wait_for_container 'pg'
22
37
 
23
38
  cmd = 'docker-compose run --rm app ./create_app'
24
- system cmd or raise "Command failed: #{cmd}"
39
+ run_cmd cmd
25
40
  end
26
41
  end
27
42
 
28
43
  after(:all) do
29
44
  if ENV['NOKILL'] != 'true'
30
45
  cmd = 'docker-compose down -v'
31
- system cmd, chdir: @fixture_dir or raise "Command failed: #{cmd}"
46
+ run_cmd cmd, chdir: @fixture_dir
32
47
  end
33
48
  end
34
49
  end
data/spec/railtie_spec.rb CHANGED
@@ -9,12 +9,21 @@ describe 'AppMap tracer via Railtie' do
9
9
  let(:cmd) { %(docker-compose run --rm -e RAILS_ENV -e APPMAP app ./bin/rails r "puts Rails.configuration.appmap.enabled.inspect") }
10
10
  let(:command_capture2) do
11
11
  require 'open3'
12
- Open3.capture2(env, cmd, chdir: @fixture_dir).tap do |result|
13
- raise 'Failed to run rails_users_app container' unless result[1] == 0
12
+ Open3.capture3(env, cmd, chdir: @fixture_dir).tap do |result|
13
+ unless result[2] == 0
14
+ $stderr.puts <<~END
15
+ Failed to run rails_users_app container
16
+ <<< Output:
17
+ #{result[0]}
18
+ #{result[1]}
19
+ >>> End of output
20
+ END
21
+ raise 'Failed to run rails_users_app container'
22
+ end
14
23
  end
15
24
  end
16
25
  let(:command_output) { command_capture2[0].strip }
17
- let(:command_result) { command_capture2[1] }
26
+ let(:command_result) { command_capture2[2] }
18
27
 
19
28
  it 'is disabled by default' do
20
29
  expect(command_output).to eq('nil')
@@ -7,8 +7,8 @@ describe 'Record SQL queries in a Rails4 app' do
7
7
  around(:each) do |example|
8
8
  FileUtils.rm_rf tmpdir
9
9
  FileUtils.mkdir_p tmpdir
10
- cmd = "docker-compose run --rm -e ORM_MODULE=#{orm_module} -e APPMAP=true -v #{File.absolute_path tmpdir}:/app/tmp app ./bin/rspec -f doc -b spec/controllers/users_controller_api_spec.rb:#{test_line_number}"
11
- system cmd, chdir: @fixture_dir or raise 'Failed to run rails_users_app container'
10
+ cmd = "docker-compose run --rm -e ORM_MODULE=#{orm_module} -e APPMAP=true -v #{File.absolute_path tmpdir}:/app/tmp app ./bin/rspec spec/controllers/users_controller_api_spec.rb:#{test_line_number}"
11
+ run_cmd cmd, chdir: @fixture_dir
12
12
 
13
13
  example.run
14
14
  end
@@ -8,7 +8,8 @@ describe 'Record SQL queries in a Rails app' do
8
8
  FileUtils.rm_rf tmpdir
9
9
  FileUtils.mkdir_p tmpdir
10
10
  cmd = "docker-compose run --rm -e ORM_MODULE=#{orm_module} -e APPMAP=true -v #{File.absolute_path tmpdir}:/app/tmp app ./bin/rspec spec/controllers/users_controller_api_spec.rb:#{test_line_number}"
11
- system cmd, chdir: @fixture_dir or raise 'Failed to run rails_users_app container'
11
+ run_cmd cmd, chdir: @fixture_dir
12
+
12
13
 
13
14
  example.run
14
15
  end
@@ -8,7 +8,7 @@ describe 'RSpec feature and feature group metadata' do
8
8
  FileUtils.rm_rf tmpdir
9
9
  FileUtils.mkdir_p tmpdir
10
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'
11
+ run_cmd cmd, chdir: @fixture_dir
12
12
 
13
13
  example.run
14
14
  end
data/test/cli_test.rb CHANGED
@@ -6,9 +6,11 @@ require 'English'
6
6
 
7
7
  class CLITest < Minitest::Test
8
8
  OUTPUT_FILENAME = File.expand_path('../tmp/appmap.json', __dir__)
9
+ STATS_OUTPUT_FILENAME = File.expand_path('../tmp/stats.txt', __dir__)
9
10
 
10
11
  def setup
11
12
  FileUtils.rm_f OUTPUT_FILENAME
13
+ FileUtils.rm_f STATS_OUTPUT_FILENAME
12
14
  end
13
15
 
14
16
  def test_config_file_must_exist
@@ -58,6 +60,72 @@ class CLITest < Minitest::Test
58
60
  assert output['events'], 'Output should contain events'
59
61
  end
60
62
 
63
+ def test_stats_to_file
64
+ Dir.chdir 'test/fixtures/cli_record_test' do
65
+ `#{File.expand_path '../exe/appmap', __dir__} record -o #{OUTPUT_FILENAME} ./lib/cli_record_test/main.rb`.strip
66
+ end
67
+ assert_equal 0, $CHILD_STATUS.exitstatus
68
+
69
+ output = Dir.chdir 'test/fixtures/cli_record_test' do
70
+ `#{File.expand_path '../exe/appmap', __dir__} stats -o #{STATS_OUTPUT_FILENAME} #{OUTPUT_FILENAME}`.strip
71
+ end
72
+ assert_equal 0, $CHILD_STATUS.exitstatus
73
+ assert_equal '', output
74
+ assert File.file?(OUTPUT_FILENAME), "#{OUTPUT_FILENAME} does not exist"
75
+ end
76
+
77
+
78
+ def test_stats_text
79
+ Dir.chdir 'test/fixtures/cli_record_test' do
80
+ `#{File.expand_path '../exe/appmap', __dir__} record -o #{OUTPUT_FILENAME} ./lib/cli_record_test/main.rb`.strip
81
+ end
82
+ assert_equal 0, $CHILD_STATUS.exitstatus
83
+
84
+ output = Dir.chdir 'test/fixtures/cli_record_test' do
85
+ `#{File.expand_path '../exe/appmap', __dir__} stats -o - #{OUTPUT_FILENAME}`.strip
86
+ end
87
+
88
+ assert_equal 0, $CHILD_STATUS.exitstatus
89
+ assert_equal <<~OUTPUT.strip, output.strip
90
+ Class frequency:
91
+ ----------------
92
+ 2 Main
93
+
94
+ Method frequency:
95
+ ----------------
96
+ 2 Main.say_hello
97
+ OUTPUT
98
+ end
99
+
100
+ def test_stats_json
101
+ Dir.chdir 'test/fixtures/cli_record_test' do
102
+ `#{File.expand_path '../exe/appmap', __dir__} record -o #{OUTPUT_FILENAME} ./lib/cli_record_test/main.rb`.strip
103
+ end
104
+ assert_equal 0, $CHILD_STATUS.exitstatus
105
+
106
+ output = Dir.chdir 'test/fixtures/cli_record_test' do
107
+ `#{File.expand_path '../exe/appmap', __dir__} stats -f json -o - #{OUTPUT_FILENAME}`.strip
108
+ end
109
+
110
+ assert_equal 0, $CHILD_STATUS.exitstatus
111
+ assert_equal <<~OUTPUT.strip, output.strip
112
+ {
113
+ "class_frequency": [
114
+ {
115
+ "name": "Main",
116
+ "count": 2
117
+ }
118
+ ],
119
+ "method_frequency": [
120
+ {
121
+ "name": "Main.say_hello",
122
+ "count": 2
123
+ }
124
+ ]
125
+ }
126
+ OUTPUT
127
+ end
128
+
61
129
  def test_record_to_default_location
62
130
  Dir.chdir 'test/fixtures/cli_record_test' do
63
131
  system({ 'APPMAP_FILE' => OUTPUT_FILENAME }, "#{File.expand_path '../exe/appmap', __dir__} record ./lib/cli_record_test/main.rb")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appmap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.0
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Gilpin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-16 00:00:00.000000000 Z
11
+ date: 2020-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -219,6 +219,7 @@ files:
219
219
  - ".gitignore"
220
220
  - ".rubocop.yml"
221
221
  - ".ruby-version"
222
+ - ".travis.yml"
222
223
  - CHANGELOG.md
223
224
  - Dockerfile.appmap
224
225
  - Gemfile
@@ -238,8 +239,10 @@ files:
238
239
  - exe/appmap
239
240
  - lib/appmap.rb
240
241
  - lib/appmap/algorithm/prune_class_map.rb
242
+ - lib/appmap/algorithm/stats.rb
241
243
  - lib/appmap/command/inspect.rb
242
244
  - lib/appmap/command/record.rb
245
+ - lib/appmap/command/stats.rb
243
246
  - lib/appmap/command/upload.rb
244
247
  - lib/appmap/config.rb
245
248
  - lib/appmap/config/directory.rb