sorbet-progress 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|