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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 07e527046e92f1f1e2495f003b8aa2609b9ff195661887a8c81c0c67d4345c5f
4
- data.tar.gz: bbdb474efbac72727561ae902917ae921095b5db2a7968dd7a6a2c75e585418b
3
+ metadata.gz: 85820701fa4e8dd96cd436463b04a7f0129f52db846c9cd0c87dd3ec476dd446
4
+ data.tar.gz: 35e929c43bd16c3bbffb339639357351da157c67c1d52a496d3ace5148330092
5
5
  SHA512:
6
- metadata.gz: de774283bbc2b6554bc3a8444326697448a679ec27bae757c5b5069dd279fb9886f2e7d0191d6bd88aaaa9948f60849f776d9e81a1a0b9b819b4d071cc25303c
7
- data.tar.gz: fc65da32aa0fff16fa567515a41883bea8a0ab0d146079acbae96d16edeb7364bd125d31b60e8727e14e73c76b183049493fa156d7ee958c1a62129c2b578073
6
+ metadata.gz: 2e48f41d883f5f894bb70e4b6afa7ef804c14a190631413057b7a743d76c397e5de43a209fbf444def88a2960b0e8a0b62e73ad987b4448e95b73e1bc689651d
7
+ data.tar.gz: 112e4c7582cbf78d7cb78dbef6d33e6a3d0352fb086784451bd5fd6b0ebd05ab6702a6cd8dceca10643fc9e77b809529f28a68cfefe883b33bda7a9fb5efce62
data/.gitignore CHANGED
@@ -6,3 +6,4 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /*.gem
data/.rubocop.yml CHANGED
@@ -214,6 +214,9 @@ Style/SingleLineBlockParams:
214
214
  - a
215
215
  - e
216
216
 
217
+ Style/StringLiterals:
218
+ EnforcedStyle: double_quotes
219
+
217
220
  Style/TernaryParentheses:
218
221
  EnforcedStyle: require_parentheses_when_complex
219
222
 
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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
6
 
data/Gemfile.lock CHANGED
@@ -39,4 +39,4 @@ DEPENDENCIES
39
39
  sorbet-progress!
40
40
 
41
41
  BUNDLED WITH
42
- 1.17.3
42
+ 2.0.2
data/README.md CHANGED
@@ -21,7 +21,10 @@ Or install it yourself:
21
21
 
22
22
  ## Usage
23
23
 
24
- TBD
24
+ ```bash
25
+ srb tc --metrics-file /tmp/sorbet_metrics.json
26
+ sorbet_progress /tmp/sorbet_metrics.json
27
+ ```
25
28
 
26
29
  ## Contributing
27
30
 
data/Rakefile CHANGED
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler/gem_tasks'
4
- require 'rake/testtask'
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
5
 
6
6
  Rake::TestTask.new(:test) do |t|
7
- t.libs << 'test'
8
- t.libs << 'lib'
9
- t.test_files = FileList['test/**/*_test.rb']
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
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ # typed: ignore
4
+
5
+ require 'sorbet_progress'
6
+ SorbetProgress::CLI.new(ARGV).run
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
@@ -3,6 +3,6 @@
3
3
  # typed: true
4
4
  module SorbetProgress
5
5
  def self.gem_version
6
- Gem::Version.new('0.1.0')
6
+ Gem::Version.new("0.2.0")
7
7
  end
8
8
  end
@@ -1,8 +1,10 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
- # typed: strong
4
- require 'sorbet_progress/version'
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
@@ -5,7 +5,7 @@
5
5
  #
6
6
  # https://github.com/sorbet/sorbet-typed/edit/master/lib/ruby/all/open3.rbi
7
7
  #
8
- # typed: strong
8
+ # typed: true
9
9
 
10
10
  module Open3
11
11
  sig do
@@ -5,7 +5,7 @@
5
5
  #
6
6
  # https://github.com/sorbet/sorbet-typed/edit/master/lib/ruby/all/resolv.rbi
7
7
  #
8
- # typed: strong
8
+ # typed: true
9
9
 
10
10
  class Resolv
11
11
  sig { params(name: String).returns(String) }
@@ -1,31 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path('lib', __dir__)
3
+ lib = File.expand_path("lib", __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'sorbet_progress/version'
5
+ require "sorbet_progress/version"
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.name = 'sorbet-progress'
8
+ spec.name = "sorbet-progress"
9
9
  spec.version = SorbetProgress.gem_version.to_s
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'
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 = 'bin'
18
+ spec.bindir = "bin"
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
- spec.require_paths = ['lib']
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 = ['>= 0.4.4365', '<= 0.4.4366']
24
- spec.add_runtime_dependency 'sorbet', requirements
25
- spec.add_runtime_dependency 'sorbet-runtime', requirements
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 'bundler', '~> 1.17'
29
- spec.add_development_dependency 'minitest', '~> 5.0'
30
- spec.add_development_dependency 'rubocop', '~> 0.72.0'
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.1.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: '0'
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: '0'
146
+ version: 3.0.3
140
147
  requirements: []
141
148
  rubygems_version: 3.0.3
142
149
  signing_key: