From 061f299eda7a7904f14017a19d44bb99d349f30e Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 5 Oct 2023 17:17:28 +0900 Subject: [PATCH 1/3] Simple colorize collection text like Bundler --- lib/rbs/collection.rb | 1 + lib/rbs/collection/color.rb | 11 +++++++++++ lib/rbs/collection/installer.rb | 3 ++- lib/rbs/collection/sources/base.rb | 1 + lib/rbs/collection/sources/git.rb | 6 +++--- lib/rbs/collection/sources/local.rb | 8 ++++---- test/rbs/cli_test.rb | 2 +- 7 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 lib/rbs/collection/color.rb diff --git a/lib/rbs/collection.rb b/lib/rbs/collection.rb index 56f208221..058015799 100644 --- a/lib/rbs/collection.rb +++ b/lib/rbs/collection.rb @@ -3,6 +3,7 @@ require 'yaml' require 'bundler' +require_relative './collection/color' require_relative './collection/sources' require_relative './collection/config' require_relative './collection/config/lockfile' diff --git a/lib/rbs/collection/color.rb b/lib/rbs/collection/color.rb new file mode 100644 index 000000000..7fb6bc1ed --- /dev/null +++ b/lib/rbs/collection/color.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module RBS + module Collection + module Color + def green(string) + "\e[32m#{string}\e[m" + end + end + end +end diff --git a/lib/rbs/collection/installer.rb b/lib/rbs/collection/installer.rb index 1d573af79..6177a38e0 100644 --- a/lib/rbs/collection/installer.rb +++ b/lib/rbs/collection/installer.rb @@ -3,6 +3,7 @@ module RBS module Collection class Installer + include Color attr_reader :lockfile attr_reader :stdout @@ -25,7 +26,7 @@ def install_from_lockfile stdout: stdout ) end - stdout.puts "It's done! #{selected.size} gems' RBSs now installed." + stdout.puts green("It's done! #{selected.size} gems' RBSs now installed.") end end end diff --git a/lib/rbs/collection/sources/base.rb b/lib/rbs/collection/sources/base.rb index 9ed646080..94f2e5199 100644 --- a/lib/rbs/collection/sources/base.rb +++ b/lib/rbs/collection/sources/base.rb @@ -4,6 +4,7 @@ module RBS module Collection module Sources module Base + include Color def dependencies_of(name, version) manifest = manifest_of(name, version) or return manifest['dependencies'] diff --git a/lib/rbs/collection/sources/git.rb b/lib/rbs/collection/sources/git.rb index 82ea0b844..fed79c915 100644 --- a/lib/rbs/collection/sources/git.rb +++ b/lib/rbs/collection/sources/git.rb @@ -47,7 +47,7 @@ def install(dest:, name:, version:, stdout:) case when gem_dir.symlink? - stdout.puts "Updating to #{format_config_entry(name, version)} from a local source" + stdout.puts green("Updating to #{format_config_entry(name, version)} from a local source") gem_dir.unlink _install(dest: dest, name: name, version: version) when gem_dir.directory? @@ -56,12 +56,12 @@ def install(dest:, name:, version:, stdout:) if prev == metadata_content(name: name, version: version) stdout.puts "Using #{format_config_entry(name, version)}" else - stdout.puts "Updating to #{format_config_entry(name, version)} from #{format_config_entry(prev["name"], prev["version"])}" + stdout.puts green("Updating to #{format_config_entry(name, version)} from #{format_config_entry(prev["name"], prev["version"])}") FileUtils.remove_entry_secure(gem_dir.to_s) _install(dest: dest, name: name, version: version) end when !gem_dir.exist? - stdout.puts "Installing #{format_config_entry(name, version)}" + stdout.puts green("Installing #{format_config_entry(name, version)}") _install(dest: dest, name: name, version: version) else raise diff --git a/lib/rbs/collection/sources/local.rb b/lib/rbs/collection/sources/local.rb index 9a046e8ee..dfa953b3e 100644 --- a/lib/rbs/collection/sources/local.rb +++ b/lib/rbs/collection/sources/local.rb @@ -7,7 +7,7 @@ class Local include Base attr_reader :path, :full_path - + def initialize(path:, base_directory:) # TODO: resolve relative path from dir of rbs_collection.yaml @path = Pathname(path) @@ -40,15 +40,15 @@ def install(dest:, name:, version:, stdout:) prev = gem_dir.readlink gem_dir.unlink _install(from, dest.join(name, version)) - stdout.puts "Updating #{name}:#{version} to #{from} from #{prev}" + stdout.puts green("Updating #{name}:#{version} to #{from} from #{prev}") when gem_dir.directory? # TODO: Show version of git source FileUtils.remove_entry_secure(gem_dir.to_s) _install(from, dest.join(name, version)) - stdout.puts "Updating #{name}:#{version} from git source" + stdout.puts green("Updating #{name}:#{version} from git source") when !gem_dir.exist? _install(from, dest.join(name, version)) - stdout.puts "Installing #{name}:#{version} (#{from})" + stdout.puts green("Installing #{name}:#{version} (#{from})") else raise end diff --git a/test/rbs/cli_test.rb b/test/rbs/cli_test.rb index 188f18ecf..4d7317ef2 100644 --- a/test/rbs/cli_test.rb +++ b/test/rbs/cli_test.rb @@ -912,7 +912,7 @@ def test_collection_install_gemspec stdout, _ = run_rbs("collection", "install", bundler: true) - assert_match(/^Installing ast:(\d(\.\d)*)/, stdout) + assert_match(/Installing ast:(\d(\.\d)*)/, stdout) refute_match(/^Using hola:(\d(\.\d)*)/, stdout) assert dir.join('rbs_collection.lock.yaml').exist? From 8eb256c1f0b0a34b68db75300879598196821f1c Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 5 Oct 2023 20:41:29 +0900 Subject: [PATCH 2/3] Add sig --- sig/collection/color.rbs | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 sig/collection/color.rbs diff --git a/sig/collection/color.rbs b/sig/collection/color.rbs new file mode 100644 index 000000000..3a8e876a3 --- /dev/null +++ b/sig/collection/color.rbs @@ -0,0 +1,7 @@ +module RBS + module Collection + module Color + def green: (String) -> String + end + end +end From 577a50874528fbd835cfbffa4ed61fb1a854adf3 Mon Sep 17 00:00:00 2001 From: ksss Date: Mon, 16 Oct 2023 23:19:21 +0900 Subject: [PATCH 3/3] Consider cases without coloring --- lib/rbs/collection.rb | 2 +- lib/rbs/collection/color.rb | 11 -------- lib/rbs/collection/colored_io.rb | 41 +++++++++++++++++++++++++++++ lib/rbs/collection/installer.rb | 3 +-- lib/rbs/collection/sources/base.rb | 1 - lib/rbs/collection/sources/git.rb | 10 ++++--- lib/rbs/collection/sources/local.rb | 10 ++++--- sig/cli.rbs | 2 ++ sig/collection/color.rbs | 7 ----- sig/collection/colored_io.rbs | 14 ++++++++++ 10 files changed, 71 insertions(+), 30 deletions(-) delete mode 100644 lib/rbs/collection/color.rb create mode 100644 lib/rbs/collection/colored_io.rb delete mode 100644 sig/collection/color.rbs create mode 100644 sig/collection/colored_io.rbs diff --git a/lib/rbs/collection.rb b/lib/rbs/collection.rb index 058015799..d15cc5e91 100644 --- a/lib/rbs/collection.rb +++ b/lib/rbs/collection.rb @@ -3,7 +3,7 @@ require 'yaml' require 'bundler' -require_relative './collection/color' +require_relative './collection/colored_io' require_relative './collection/sources' require_relative './collection/config' require_relative './collection/config/lockfile' diff --git a/lib/rbs/collection/color.rb b/lib/rbs/collection/color.rb deleted file mode 100644 index 7fb6bc1ed..000000000 --- a/lib/rbs/collection/color.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module RBS - module Collection - module Color - def green(string) - "\e[32m#{string}\e[m" - end - end - end -end diff --git a/lib/rbs/collection/colored_io.rb b/lib/rbs/collection/colored_io.rb new file mode 100644 index 000000000..4406db88d --- /dev/null +++ b/lib/rbs/collection/colored_io.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module RBS + module Collection + class ColoredIO + attr_reader :stdout + + def initialize(stdout:) + @stdout = stdout + end + + def puts_green(string) + if can_display_colors? + puts "\e[32m#{string}\e[m" + else + puts string + end + end + + def puts(string) + stdout.puts(string) + end + + private + + # https://github.com/rubygems/rubygems/blob/ed65279100234a17d65d71fe26de5083984ac5b8/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb#L99-L109 + def can_display_colors? + are_colors_supported? && !are_colors_disabled? + end + + def are_colors_supported? + stdout.tty? && ENV["TERM"] != "dumb" + end + + def are_colors_disabled? + !ENV['NO_COLOR'].nil? && !ENV.fetch('NO_COLOR', '').empty? + end + end + private_constant :ColoredIO + end +end diff --git a/lib/rbs/collection/installer.rb b/lib/rbs/collection/installer.rb index 6177a38e0..bba802390 100644 --- a/lib/rbs/collection/installer.rb +++ b/lib/rbs/collection/installer.rb @@ -3,7 +3,6 @@ module RBS module Collection class Installer - include Color attr_reader :lockfile attr_reader :stdout @@ -26,7 +25,7 @@ def install_from_lockfile stdout: stdout ) end - stdout.puts green("It's done! #{selected.size} gems' RBSs now installed.") + ColoredIO.new(stdout: stdout).puts_green("It's done! #{selected.size} gems' RBSs now installed.") end end end diff --git a/lib/rbs/collection/sources/base.rb b/lib/rbs/collection/sources/base.rb index 94f2e5199..9ed646080 100644 --- a/lib/rbs/collection/sources/base.rb +++ b/lib/rbs/collection/sources/base.rb @@ -4,7 +4,6 @@ module RBS module Collection module Sources module Base - include Color def dependencies_of(name, version) manifest = manifest_of(name, version) or return manifest['dependencies'] diff --git a/lib/rbs/collection/sources/git.rb b/lib/rbs/collection/sources/git.rb index fed79c915..684b60d91 100644 --- a/lib/rbs/collection/sources/git.rb +++ b/lib/rbs/collection/sources/git.rb @@ -45,23 +45,25 @@ def install(dest:, name:, version:, stdout:) gem_dir = dest.join(name, version) + colored_io = ColoredIO.new(stdout: stdout) + case when gem_dir.symlink? - stdout.puts green("Updating to #{format_config_entry(name, version)} from a local source") + colored_io.puts_green("Updating to #{format_config_entry(name, version)} from a local source") gem_dir.unlink _install(dest: dest, name: name, version: version) when gem_dir.directory? prev = load_metadata(dir: gem_dir) if prev == metadata_content(name: name, version: version) - stdout.puts "Using #{format_config_entry(name, version)}" + colored_io.puts "Using #{format_config_entry(name, version)}" else - stdout.puts green("Updating to #{format_config_entry(name, version)} from #{format_config_entry(prev["name"], prev["version"])}") + colored_io.puts_green("Updating to #{format_config_entry(name, version)} from #{format_config_entry(prev["name"], prev["version"])}") FileUtils.remove_entry_secure(gem_dir.to_s) _install(dest: dest, name: name, version: version) end when !gem_dir.exist? - stdout.puts green("Installing #{format_config_entry(name, version)}") + colored_io.puts_green("Installing #{format_config_entry(name, version)}") _install(dest: dest, name: name, version: version) else raise diff --git a/lib/rbs/collection/sources/local.rb b/lib/rbs/collection/sources/local.rb index dfa953b3e..c6567e335 100644 --- a/lib/rbs/collection/sources/local.rb +++ b/lib/rbs/collection/sources/local.rb @@ -33,22 +33,24 @@ def install(dest:, name:, version:, stdout:) from = @full_path.join(name, version) gem_dir = dest.join(name, version) + colored_io = ColoredIO.new(stdout: stdout) + case when gem_dir.symlink? && gem_dir.readlink == from - stdout.puts "Using #{name}:#{version} (#{from})" + colored_io.puts "Using #{name}:#{version} (#{from})" when gem_dir.symlink? prev = gem_dir.readlink gem_dir.unlink _install(from, dest.join(name, version)) - stdout.puts green("Updating #{name}:#{version} to #{from} from #{prev}") + colored_io.puts_green("Updating #{name}:#{version} to #{from} from #{prev}") when gem_dir.directory? # TODO: Show version of git source FileUtils.remove_entry_secure(gem_dir.to_s) _install(from, dest.join(name, version)) - stdout.puts green("Updating #{name}:#{version} from git source") + colored_io.puts_green("Updating #{name}:#{version} from git source") when !gem_dir.exist? _install(from, dest.join(name, version)) - stdout.puts green("Installing #{name}:#{version} (#{from})") + colored_io.puts_green("Installing #{name}:#{version} (#{from})") else raise end diff --git a/sig/cli.rbs b/sig/cli.rbs index ef3954c4e..88e1e1521 100644 --- a/sig/cli.rbs +++ b/sig/cli.rbs @@ -18,6 +18,8 @@ module RBS interface _IO def puts: (*untyped) -> void + def tty?: () -> bool + def print: (*untyped) -> void def flush: () -> void diff --git a/sig/collection/color.rbs b/sig/collection/color.rbs deleted file mode 100644 index 3a8e876a3..000000000 --- a/sig/collection/color.rbs +++ /dev/null @@ -1,7 +0,0 @@ -module RBS - module Collection - module Color - def green: (String) -> String - end - end -end diff --git a/sig/collection/colored_io.rbs b/sig/collection/colored_io.rbs new file mode 100644 index 000000000..9a3b5977c --- /dev/null +++ b/sig/collection/colored_io.rbs @@ -0,0 +1,14 @@ +module RBS + module Collection + class ColoredIO + attr_reader stdout: CLI::_IO + def initialize: (stdout: CLI::_IO) -> void + def puts_green: (String) -> void + def puts: (String) -> void + + private def can_display_colors?: () -> bool + private def are_colors_supported?: () -> bool + private def are_colors_disabled?: () -> bool + end + end +end