sorbet-progress 0.1.0 → 0.2.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/.gitignore +1 -0
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +17 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +1 -1
- data/README.md +4 -1
- data/Rakefile +5 -5
- data/bin/sorbet_progress +6 -0
- data/bin/test.sh +4 -1
- data/lib/sorbet_progress/cli.rb +66 -0
- data/lib/sorbet_progress/error.rb +21 -0
- data/lib/sorbet_progress/metric.rb +18 -0
- data/lib/sorbet_progress/metrics.rb +33 -0
- data/lib/sorbet_progress/parser.rb +47 -0
- data/lib/sorbet_progress/version.rb +1 -1
- data/lib/sorbet_progress.rb +5 -3
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi +1 -1
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi +1 -1
- data/sorbet-progress.gemspec +18 -16
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85820701fa4e8dd96cd436463b04a7f0129f52db846c9cd0c87dd3ec476dd446
|
4
|
+
data.tar.gz: 35e929c43bd16c3bbffb339639357351da157c67c1d52a496d3ace5148330092
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e48f41d883f5f894bb70e4b6afa7ef804c14a190631413057b7a743d76c397e5de43a209fbf444def88a2960b0e8a0b62e73ad987b4448e95b73e1bc689651d
|
7
|
+
data.tar.gz: 112e4c7582cbf78d7cb78dbef6d33e6a3d0352fb086784451bd5fd6b0ebd05ab6702a6cd8dceca10643fc9e77b809529f28a68cfefe883b33bda7a9fb5efce62
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
This project follows [semver 2.0.0](http://semver.org/spec/v2.0.0.html) and the
|
4
|
+
recommendations of [keepachangelog.com](http://keepachangelog.com/).
|
5
|
+
|
6
|
+
## Unreleased
|
7
|
+
|
8
|
+
- Breaking Changes
|
9
|
+
- None
|
10
|
+
- Added
|
11
|
+
- None
|
12
|
+
- Fixed
|
13
|
+
- None
|
14
|
+
|
15
|
+
## 0.2.0 (2019-07-02)
|
16
|
+
|
17
|
+
First working proof of concept.
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require "rake/testtask"
|
5
5
|
|
6
6
|
Rake::TestTask.new(:test) do |t|
|
7
|
-
t.libs <<
|
8
|
-
t.libs <<
|
9
|
-
t.test_files = FileList[
|
7
|
+
t.libs << "test"
|
8
|
+
t.libs << "lib"
|
9
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
10
10
|
end
|
11
11
|
|
12
12
|
task default: :test
|
data/bin/sorbet_progress
ADDED
data/bin/test.sh
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
#!/usr/bin/env bash
|
2
2
|
|
3
3
|
set -e
|
4
|
-
bundle exec srb tc
|
4
|
+
bundle exec srb tc --metrics-file /tmp/sorbet_metrics.json
|
5
|
+
ruby -I lib \
|
6
|
+
-r sorbet_progress \
|
7
|
+
-e 'SorbetProgress::CLI.new(["/tmp/sorbet_metrics.json"]).run'
|
5
8
|
bundle exec rubocop
|
6
9
|
ruby -I lib:test -r 'minitest/autorun' test/all.rb
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# typed: true
|
4
|
+
|
5
|
+
require "sorbet_progress/error"
|
6
|
+
require "sorbet_progress/metrics"
|
7
|
+
require "sorbet_progress/parser"
|
8
|
+
|
9
|
+
module SorbetProgress
|
10
|
+
# Parses the provided metrics file and prints a report.
|
11
|
+
class CLI
|
12
|
+
extend T::Sig
|
13
|
+
|
14
|
+
USAGE = <<~EOS
|
15
|
+
Usage: sorbet_progress /path/to/sorbet_metrics.json
|
16
|
+
EOS
|
17
|
+
|
18
|
+
sig { params(argv: T::Array[String]).void }
|
19
|
+
def initialize(argv)
|
20
|
+
unless argv.length == 1
|
21
|
+
raise Error.new(1, USAGE)
|
22
|
+
end
|
23
|
+
@path = argv.first
|
24
|
+
end
|
25
|
+
|
26
|
+
sig { void }
|
27
|
+
def run
|
28
|
+
metrics = parse(@path)
|
29
|
+
puts "SorbetProgress:"
|
30
|
+
{
|
31
|
+
total_signatures: "ruby_typer.unknown..types.sig.count",
|
32
|
+
total_methods: "ruby_typer.unknown..types.input.methods.total",
|
33
|
+
total_classes: "ruby_typer.unknown..types.input.classes.total",
|
34
|
+
sigil_ignore: "ruby_typer.unknown..types.input.files.sigil.ignore",
|
35
|
+
sigil_false: "ruby_typer.unknown..types.input.files.sigil.false",
|
36
|
+
sigil_true: "ruby_typer.unknown..types.input.files.sigil.true",
|
37
|
+
sigil_strong: "ruby_typer.unknown..types.input.files.sigil.strong"
|
38
|
+
}.each do |label, name|
|
39
|
+
metric = metrics[name]
|
40
|
+
if metric.nil?
|
41
|
+
print_metric_not_found(label)
|
42
|
+
else
|
43
|
+
print_metric(label, metric.value)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
puts "Keep up the good work 👍"
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
sig { params(path: String).returns(Metrics) }
|
52
|
+
def parse(path)
|
53
|
+
Parser.new.parse(File.read(path))
|
54
|
+
rescue Errno::ENOENT => e
|
55
|
+
raise Error.new(2, "Metrics file not found: " + e.message)
|
56
|
+
end
|
57
|
+
|
58
|
+
def print_metric(label, value)
|
59
|
+
puts format("%-17s\t%d", label, value)
|
60
|
+
end
|
61
|
+
|
62
|
+
def print_metric_not_found(label)
|
63
|
+
puts format("%-17s\tunknown", label)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module SorbetProgress
|
5
|
+
# Parent class of all errors raised by SorbetProgress.
|
6
|
+
# Every error should have a unique number.
|
7
|
+
class Error < StandardError
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
sig { params(number: Integer, message: String).void }
|
11
|
+
def initialize(number, message)
|
12
|
+
super(
|
13
|
+
format(
|
14
|
+
"%s (SPE%d)",
|
15
|
+
message,
|
16
|
+
number
|
17
|
+
)
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module SorbetProgress
|
5
|
+
# Just a simple key-value pair, though sorbet could decide to do something
|
6
|
+
# more complicated in the future.
|
7
|
+
class Metric
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
attr_reader :name, :value
|
11
|
+
|
12
|
+
sig { params(name: String, value: Integer).void }
|
13
|
+
def initialize(name, value)
|
14
|
+
@name = name
|
15
|
+
@value = value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet_progress/error"
|
5
|
+
require "sorbet_progress/metric"
|
6
|
+
|
7
|
+
module SorbetProgress
|
8
|
+
# A collection of `Metric`s. Acts like a Hash, though sorbet actually gives
|
9
|
+
# us an array.
|
10
|
+
class Metrics
|
11
|
+
extend T::Sig
|
12
|
+
|
13
|
+
sig { params(array: T::Array[Metric]).void }
|
14
|
+
def initialize(array)
|
15
|
+
@array = array
|
16
|
+
end
|
17
|
+
|
18
|
+
sig { params(name: String).returns(T.nilable(Metric)) }
|
19
|
+
def [](name)
|
20
|
+
@array.find { |metric| metric.name == name }
|
21
|
+
end
|
22
|
+
|
23
|
+
sig { params(name: String).returns(Metric) }
|
24
|
+
def fetch(name)
|
25
|
+
result = @array.find { |metric| metric.name == name }
|
26
|
+
if result.nil?
|
27
|
+
raise Error.new(5, "Metric not found: " + name)
|
28
|
+
else
|
29
|
+
result
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# typed: true
|
4
|
+
|
5
|
+
require "json"
|
6
|
+
require "sorbet_progress/error"
|
7
|
+
require "sorbet_progress/metric"
|
8
|
+
require "sorbet_progress/metrics"
|
9
|
+
|
10
|
+
module SorbetProgress
|
11
|
+
# Parse Sorbet's JSON metrics file.
|
12
|
+
class Parser
|
13
|
+
extend T::Sig
|
14
|
+
|
15
|
+
sig { params(json: String).returns(Metrics) }
|
16
|
+
def parse(json)
|
17
|
+
transform(parse_json(json))
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
sig { params(json: String).returns(Hash) }
|
23
|
+
def parse_json(json)
|
24
|
+
JSON.parse(json)
|
25
|
+
rescue JSON::ParserError => e
|
26
|
+
raise Error.new(3, "Metrics file is not valid JSON: " + e.message)
|
27
|
+
end
|
28
|
+
|
29
|
+
sig { params(parsed: Hash).returns(Metrics) }
|
30
|
+
def transform(parsed)
|
31
|
+
Metrics.new(
|
32
|
+
parsed.
|
33
|
+
fetch("metrics").
|
34
|
+
map { |metric|
|
35
|
+
next unless metric.key?("value")
|
36
|
+
Metric.new(
|
37
|
+
metric.fetch("name"),
|
38
|
+
metric.fetch("value")
|
39
|
+
)
|
40
|
+
}.
|
41
|
+
compact
|
42
|
+
)
|
43
|
+
rescue KeyError => e
|
44
|
+
raise Error.new(4, "Expected file to have key: metrics: " + e.message)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/sorbet_progress.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# typed: true
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
|
-
|
4
|
-
require
|
4
|
+
require "sorbet-runtime"
|
5
|
+
require "sorbet_progress/cli"
|
6
|
+
require "sorbet_progress/version"
|
5
7
|
|
8
|
+
# :nodoc:
|
6
9
|
module SorbetProgress
|
7
|
-
class Error < StandardError; end
|
8
10
|
end
|
data/sorbet-progress.gemspec
CHANGED
@@ -1,31 +1,33 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require
|
5
|
+
require "sorbet_progress/version"
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name =
|
8
|
+
spec.name = "sorbet-progress"
|
9
9
|
spec.version = SorbetProgress.gem_version.to_s
|
10
|
-
spec.licenses = [
|
11
|
-
spec.authors = [
|
12
|
-
spec.email = [
|
13
|
-
spec.summary =
|
14
|
-
spec.homepage =
|
10
|
+
spec.licenses = ["AGPL-3.0-only"]
|
11
|
+
spec.authors = ["Jared Beck"]
|
12
|
+
spec.email = ["jared@jaredbeck.com"]
|
13
|
+
spec.summary = "Measure sorbet adoption progress"
|
14
|
+
spec.homepage = "https://github.com/jaredbeck/sorbet-progress"
|
15
15
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
16
16
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^test/}) }
|
17
17
|
end
|
18
|
-
spec.bindir =
|
18
|
+
spec.bindir = "bin"
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
spec.required_ruby_version = ">= 2.6.3"
|
22
|
+
spec.required_rubygems_version = ">= 3.0.3"
|
21
23
|
|
22
24
|
lambda {
|
23
|
-
requirements = [
|
24
|
-
spec.add_runtime_dependency
|
25
|
-
spec.add_runtime_dependency
|
25
|
+
requirements = [">= 0.4.4365", "<= 0.4.4366"]
|
26
|
+
spec.add_runtime_dependency "sorbet", requirements
|
27
|
+
spec.add_runtime_dependency "sorbet-runtime", requirements
|
26
28
|
}.call
|
27
29
|
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
30
|
+
spec.add_development_dependency "bundler", "~> 1.17"
|
31
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
32
|
+
spec.add_development_dependency "rubocop", "~> 0.72.0"
|
31
33
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sorbet-progress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jared Beck
|
@@ -102,14 +102,21 @@ files:
|
|
102
102
|
- ".gitignore"
|
103
103
|
- ".rubocop.yml"
|
104
104
|
- ".travis.yml"
|
105
|
+
- CHANGELOG.md
|
105
106
|
- CODE_OF_CONDUCT.md
|
106
107
|
- Gemfile
|
107
108
|
- Gemfile.lock
|
108
109
|
- README.md
|
109
110
|
- Rakefile
|
110
111
|
- bin/console
|
112
|
+
- bin/sorbet_progress
|
111
113
|
- bin/test.sh
|
112
114
|
- lib/sorbet_progress.rb
|
115
|
+
- lib/sorbet_progress/cli.rb
|
116
|
+
- lib/sorbet_progress/error.rb
|
117
|
+
- lib/sorbet_progress/metric.rb
|
118
|
+
- lib/sorbet_progress/metrics.rb
|
119
|
+
- lib/sorbet_progress/parser.rb
|
113
120
|
- lib/sorbet_progress/version.rb
|
114
121
|
- sorbet-progress.gemspec
|
115
122
|
- sorbet/config
|
@@ -131,12 +138,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
131
138
|
requirements:
|
132
139
|
- - ">="
|
133
140
|
- !ruby/object:Gem::Version
|
134
|
-
version:
|
141
|
+
version: 2.6.3
|
135
142
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
143
|
requirements:
|
137
144
|
- - ">="
|
138
145
|
- !ruby/object:Gem::Version
|
139
|
-
version:
|
146
|
+
version: 3.0.3
|
140
147
|
requirements: []
|
141
148
|
rubygems_version: 3.0.3
|
142
149
|
signing_key:
|