tty-color 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
  SHA1:
3
- metadata.gz: f283dfbe29783ae7e0c276ab7c0b826bb3a3597a
4
- data.tar.gz: cd78c6a3723d0faa4bb9ca4e9d079f53ef6c495d
3
+ metadata.gz: e202bf4ea2e5da8b715888731cf0e9488afde5db
4
+ data.tar.gz: 63d578fe8363573b353d4f0cf867c5c0f78f9b5d
5
5
  SHA512:
6
- metadata.gz: 8ca5f9b0fb1a004ff63783bb39b39c8f4eb45323f2a1be4eafb01c747c3b35254ae1fac793c0d629503e246c3d1a8a54024fecf7bcabc19bd8fba5b96f4c5e7d
7
- data.tar.gz: df3075abac7aa41d018fee562276a888a1dd346d8dee6b6c4df62cdcfbca0e56dc44ade95e09fe6a27e081cd743f59bd69c000901b1db7ad38fdfeb0b9cf389a
6
+ metadata.gz: 5db3f22c98af1803e7fe028263f4f95d3a3fb89e7008cc33f9ce4cc5e5066232be6e8cc7d4f5fb84fda2171525965a3bb53fe13d2cd796dcb58a6b0a667e02aa
7
+ data.tar.gz: 4547260a08d17f7f11181a38d4f68876a7ef81c8f7388524042f5e704ba0fdc5e34a788fc959f0c7004db430fa2c61d6482e3854343e9640da274034ad0c9a11
@@ -1,7 +1,18 @@
1
1
  # Change log
2
2
 
3
+ ## [v0.2.0] - 2016-01-13
4
+
5
+ ### Changed
6
+
7
+ * Change ordering of color support checks by @janlelis
8
+ * Change ordering of color mode
9
+ * Change Support#from_env to check ansicon
10
+ * Ensure #tty? works for non-terminal devices
11
+ * Remove color executable
12
+
3
13
  ## [v0.1.0] - 2016-01-02
4
14
 
5
15
  * Initial implementation and release
6
16
 
17
+ [v0.2.0]: https://github.com/peter-murach/tty-color/compare/v0.1.0...v0.2.0
7
18
  [v0.1.0]: https://github.com/peter-murach/tty-color/compare/v0.1.0
data/README.md CHANGED
@@ -58,19 +58,18 @@ puts color?
58
58
 
59
59
  ## Command line tool
60
60
 
61
- **TTY::Color** comes with a command line tool to detect color support in terminal. The results are redirected to standard output.
61
+ [tty-color-cli](https://github.com/peter-murach/tty-color-cli) is a command line tool for the **TTY::Color**.
62
+
63
+ To check if terminal supports colors do:
62
64
 
63
65
  ```bash
64
- color
65
66
  color -s
66
- color --support
67
67
  ```
68
68
 
69
- and to check number of colors:
69
+ and to check color mode:
70
70
 
71
71
  ```bash
72
72
  color -m
73
- color --mode
74
73
  ```
75
74
 
76
75
  ## Contributing
@@ -19,6 +19,11 @@ module TTY
19
19
 
20
20
  attr_accessor :output, :verbose
21
21
 
22
+ # Check if terminal supports colors
23
+ #
24
+ # @return [Boolean]
25
+ #
26
+ # @api public
22
27
  def supports?
23
28
  Support.new(ENV, verbose: verbose).supports?
24
29
  end
@@ -34,9 +39,13 @@ module TTY
34
39
  Mode.new(ENV).mode
35
40
  end
36
41
 
37
- # @api private
42
+ # Check if output is linked with terminal
43
+ #
44
+ # @return [Boolean]
45
+ #
46
+ # @api public
38
47
  def tty?
39
- output.tty?
48
+ output.respond_to(:tty?) && output.tty?
40
49
  end
41
50
  end # Color
42
51
  end # TTY
@@ -35,7 +35,7 @@ module TTY
35
35
  return 0 unless TTY::Color.tty?
36
36
 
37
37
  value = 8
38
- %w(from_tput from_term).each do |from_check|
38
+ %w(from_term from_tput).each do |from_check|
39
39
  break if (value = public_send(from_check)) != NoValue
40
40
  end
41
41
  return 8 if value == NoValue
@@ -67,7 +67,7 @@ module TTY
67
67
  #
68
68
  # @api private
69
69
  def from_tput
70
- colors = %x(tput colors 2>/dev/null).to_i
70
+ colors = `tput colors 2>/dev/null`.to_i
71
71
  colors >= 8 ? colors : NoValue
72
72
  rescue Errno::ENOENT
73
73
  NoValue
@@ -3,6 +3,8 @@
3
3
  module TTY
4
4
  module Color
5
5
  class Support
6
+ SOURCES = %w(from_term from_tput from_env from_curses).freeze
7
+
6
8
  # Initialize a color support
7
9
  # @api public
8
10
  def initialize(env, options = {})
@@ -20,13 +22,40 @@ module TTY
20
22
  return false unless TTY::Color.tty?
21
23
 
22
24
  value = false
23
- %w(from_curses from_tput from_term from_env).each do |from_check|
25
+ SOURCES.each do |from_check|
24
26
  break if (value = public_send(from_check)) != NoValue
25
27
  end
26
28
  return false if value == NoValue
27
29
  value
28
30
  end
29
31
 
32
+ # Inspect environment $TERM variable for color support
33
+ #
34
+ # @api private
35
+ def from_term
36
+ case @env['TERM']
37
+ when 'dumb' then false
38
+ when /^screen|^xterm|^vt100|color|ansi|cygwin|linux/i then true
39
+ else NoValue
40
+ end
41
+ end
42
+
43
+ # Shell out to tput to check color support
44
+ #
45
+ # @api private
46
+ def from_tput
47
+ `tput colors 2>/dev/null`.to_i > 2
48
+ rescue Errno::ENOENT
49
+ NoValue
50
+ end
51
+
52
+ # Check if environment specifies color variables
53
+ #
54
+ # @api private
55
+ def from_env
56
+ ['COLORTERM', 'ANSICON'].any? { |key| @env.key?(key) } || NoValue
57
+ end
58
+
30
59
  # Attempt to load curses to check color support
31
60
  #
32
61
  # @return [Boolean]
@@ -48,33 +77,6 @@ module TTY
48
77
  warn 'no native curses support' if @verbose
49
78
  NoValue
50
79
  end
51
-
52
- # Shell out to tput to check color support
53
- #
54
- # @api private
55
- def from_tput
56
- %x(tput colors 2>/dev/null).to_i > 2
57
- rescue Errno::ENOENT
58
- NoValue
59
- end
60
-
61
- # Inspect environment $TERM variable for color support
62
- #
63
- # @api private
64
- def from_term
65
- case @env['TERM']
66
- when 'dumb' then false
67
- when /^screen|^xterm|^vt100|color|ansi|cygwin|linux/i then true
68
- else NoValue
69
- end
70
- end
71
-
72
- # Check if environment specifies color term
73
- #
74
- # @api private
75
- def from_env
76
- @env.include?('COLORTERM')
77
- end
78
80
  end # Support
79
81
  end # Color
80
82
  end # TTY
@@ -2,6 +2,6 @@
2
2
 
3
3
  module TTY
4
4
  module Color
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end # Color
7
7
  end # TTY
@@ -12,61 +12,83 @@ RSpec.describe TTY::Color::Mode, 'detecting mode' do
12
12
  mode = described_class.new({})
13
13
  allow(mode).to receive(:from_term).and_return(TTY::Color::NoValue)
14
14
  allow(mode).to receive(:from_tput).and_return(TTY::Color::NoValue)
15
+
15
16
  expect(mode.mode).to eq(8)
17
+ expect(mode).to have_received(:from_term).ordered
18
+ expect(mode).to have_received(:from_tput).ordered
16
19
  end
17
20
 
18
- it 'infers mode for xterm-256color' do
21
+ it "detects color mode" do
22
+ allow(TTY::Color).to receive(:tty?).and_return(true)
19
23
  mode = described_class.new('TERM' => 'xterm-256color')
20
- expect(mode.from_term).to eq(256)
21
- end
22
24
 
23
- it 'infers mode for iTerm.app' do
24
- mode = described_class.new('TERM' => 'iTerm.app')
25
- expect(mode.from_term).to eq(256)
25
+ expect(mode.mode).to eq(256)
26
26
  end
27
27
 
28
- it 'infers mode from terminal environment' do
29
- mode = described_class.new('TERM' => 'amiga-8bit')
30
- expect(mode.from_term).to eq(256)
31
- end
28
+ context '#from_term' do
29
+ it 'infers mode for xterm-256color' do
30
+ mode = described_class.new('TERM' => 'xterm-256color')
31
+ expect(mode.from_term).to eq(256)
32
+ end
32
33
 
33
- it 'infers mode for wy730' do
34
- mode = described_class.new('TERM' => 'wy370-105k')
35
- expect(mode.from_term).to eq(64)
36
- end
34
+ it 'infers mode for iTerm.app' do
35
+ mode = described_class.new('TERM' => 'iTerm.app')
36
+ expect(mode.from_term).to eq(256)
37
+ end
37
38
 
38
- it 'infers mode for d430-unix-ccc' do
39
- mode = described_class.new('TERM' => 'd430-unix-ccc')
40
- expect(mode.from_term).to eq(52)
41
- end
39
+ it 'infers mode from terminal environment' do
40
+ mode = described_class.new('TERM' => 'amiga-8bit')
41
+ expect(mode.from_term).to eq(256)
42
+ end
42
43
 
43
- it 'infers mode for d430-unix-s-ccc' do
44
- mode = described_class.new('TERM' => 'd430c-unix-s-ccc')
45
- expect(mode.from_term).to eq(52)
46
- end
44
+ it 'infers mode for wy730' do
45
+ mode = described_class.new('TERM' => 'wy370-105k')
46
+ expect(mode.from_term).to eq(64)
47
+ end
47
48
 
48
- it 'infers mode for nsterm-bce' do
49
- mode = described_class.new('TERM' => 'nsterm-bce')
50
- expect(mode.from_term).to eq(16)
51
- end
49
+ it 'infers mode for d430-unix-ccc' do
50
+ mode = described_class.new('TERM' => 'd430-unix-ccc')
51
+ expect(mode.from_term).to eq(52)
52
+ end
52
53
 
53
- it 'infers mode for d430-c' do
54
- mode = described_class.new('TERM' => 'd430c-dg')
55
- expect(mode.from_term).to eq(16)
56
- end
54
+ it 'infers mode for d430-unix-s-ccc' do
55
+ mode = described_class.new('TERM' => 'd430c-unix-s-ccc')
56
+ expect(mode.from_term).to eq(52)
57
+ end
57
58
 
58
- it 'infers mode for d430-unix-w' do
59
- mode = described_class.new('TERM' => 'd430-unix-w')
60
- expect(mode.from_term).to eq(16)
61
- end
59
+ it 'infers mode for nsterm-bce' do
60
+ mode = described_class.new('TERM' => 'nsterm-bce')
61
+ expect(mode.from_term).to eq(16)
62
+ end
62
63
 
63
- it 'infers mode for vt100' do
64
- mode = described_class.new('TERM' => 'konsole-vt100')
65
- expect(mode.from_term).to eq(8)
66
- end
64
+ it 'infers mode for d430-c' do
65
+ mode = described_class.new('TERM' => 'd430c-dg')
66
+ expect(mode.from_term).to eq(16)
67
+ end
68
+
69
+ it 'infers mode for d430-unix-w' do
70
+ mode = described_class.new('TERM' => 'd430-unix-w')
71
+ expect(mode.from_term).to eq(16)
72
+ end
73
+
74
+ it 'infers mode for vt100' do
75
+ mode = described_class.new('TERM' => 'konsole-vt100')
76
+ expect(mode.from_term).to eq(8)
77
+ end
78
+
79
+ it 'infers mode for xnuppc' do
80
+ mode = described_class.new('TERM' => 'xnuppc+basic')
81
+ expect(mode.from_term).to eq(8)
82
+ end
83
+
84
+ it 'infers mode fro dummy terminal' do
85
+ mode = described_class.new('TERM' => 'dummy')
86
+ expect(mode.from_term).to eq(0)
87
+ end
67
88
 
68
- it 'infers mode for xnuppc' do
69
- mode = described_class.new('TERM' => 'xnuppc+basic')
70
- expect(mode.from_term).to eq(8)
89
+ it "doesn't match any term variable" do
90
+ mode = described_class.new({})
91
+ expect(mode.from_term).to eq(TTY::Color::NoValue)
92
+ end
71
93
  end
72
94
  end
@@ -17,54 +17,96 @@ RSpec.describe TTY::Color::Support, '#supports?' do
17
17
  allow(support).to receive(:from_env).and_return(TTY::Color::NoValue)
18
18
 
19
19
  expect(support.supports?).to eq(false)
20
+
21
+ expect(support).to have_received(:from_term).ordered
22
+ expect(support).to have_received(:from_tput).ordered
23
+ expect(support).to have_received(:from_env).ordered
24
+ expect(support).to have_received(:from_curses).ordered
20
25
  end
21
26
 
22
- it "fails to load curses for color support" do
23
- support = described_class.new({})
24
- allow(support).to receive(:require).with('curses').
25
- and_raise(LoadError)
26
- allow(support).to receive(:warn)
27
+ it "detects color support" do
28
+ support = described_class.new('TERM' => 'xterm')
29
+ allow(TTY::Color).to receive(:tty?).and_return(true)
30
+ allow(support).to receive(:from_tput)
27
31
 
28
- expect(support.from_curses).to eq(TTY::Color::NoValue)
29
- expect(support).to_not have_received(:warn)
32
+ expect(support.supports?).to eq(true)
33
+ expect(support).to_not have_received(:from_tput)
30
34
  end
31
35
 
32
- it "sets verbose mode on" do
33
- support = described_class.new({}, verbose: true)
34
- allow(support).to receive(:require).with('curses').
35
- and_raise(LoadError)
36
- allow(support).to receive(:warn)
36
+ context '#from_curses' do
37
+ it "fails to load curses for color support" do
38
+ support = described_class.new({})
39
+ allow(support).to receive(:require).with('curses').
40
+ and_raise(LoadError)
41
+ allow(support).to receive(:warn)
37
42
 
38
- support.from_curses
43
+ expect(support.from_curses).to eq(TTY::Color::NoValue)
44
+ expect(support).to_not have_received(:warn)
45
+ end
39
46
 
40
- expect(support).to have_received(:warn).with(/no native curses support/)
41
- end
47
+ it "fails to find Curses namespace" do
48
+ support = described_class.new({})
49
+ allow(support).to receive(:require).with('curses')
42
50
 
43
- it "loads curses for color support" do
44
- support = described_class.new({})
45
- allow(support).to receive(:require).with('curses').and_return(true)
46
- stub_const("Curses", Object.new)
47
- curses = double(:curses)
48
- allow(curses).to receive(:init_screen)
49
- allow(curses).to receive(:has_colors?).and_return(true)
50
- allow(curses).to receive(:close_screen)
51
-
52
- expect(support.from_curses(curses)).to eql(true)
53
- expect(curses).to have_received(:has_colors?)
54
- end
51
+ expect(support.from_curses).to eq(TTY::Color::NoValue)
52
+ end
53
+
54
+ it "sets verbose mode on" do
55
+ support = described_class.new({}, verbose: true)
56
+ allow(support).to receive(:require).with('curses').
57
+ and_raise(LoadError)
58
+ allow(support).to receive(:warn)
55
59
 
56
- it "fails to find color for dumb terminal" do
57
- support = described_class.new('TERM' => 'dumb')
58
- expect(support.from_term).to eq(false)
60
+ support.from_curses
61
+
62
+ expect(support).to have_received(:warn).with(/no native curses support/)
63
+ end
64
+
65
+ it "loads curses for color support" do
66
+ support = described_class.new({})
67
+ allow(support).to receive(:require).with('curses').and_return(true)
68
+ stub_const("Curses", Object.new)
69
+ curses = double(:curses)
70
+ allow(curses).to receive(:init_screen)
71
+ allow(curses).to receive(:has_colors?).and_return(true)
72
+ allow(curses).to receive(:close_screen)
73
+
74
+ expect(support.from_curses(curses)).to eql(true)
75
+ expect(curses).to have_received(:has_colors?)
76
+ end
59
77
  end
60
78
 
61
- it "inspects term variable for color capabilities" do
62
- support = described_class.new('TERM' => 'xterm')
63
- expect(support.from_term).to eq(true)
79
+ context '#form_term' do
80
+ it "fails to find color for dumb terminal" do
81
+ support = described_class.new('TERM' => 'dumb')
82
+ expect(support.from_term).to eq(false)
83
+ end
84
+
85
+ it "inspects term variable for color capabilities" do
86
+ support = described_class.new('TERM' => 'xterm')
87
+ expect(support.from_term).to eq(true)
88
+ end
89
+
90
+ it "fails to find color capabilities from term variable " do
91
+ support = described_class.new('TERM' => 'atari')
92
+ expect(support.from_term).to eq(TTY::Color::NoValue)
93
+ end
64
94
  end
65
95
 
66
- it "inspects color terminal variable for support" do
67
- support = described_class.new('COLORTERM' => true)
68
- expect(support.from_env).to eq(true)
96
+ context '#from_env' do
97
+ it "finds color support in colorterm variable" do
98
+ support = described_class.new('COLORTERM' => true)
99
+ expect(support.from_env).to eq(true)
100
+ end
101
+
102
+ it "finds ansicon support" do
103
+ support = described_class.new('ANSICON' => true)
104
+ expect(support.from_env).to eq(true)
105
+ end
106
+
107
+ it "doesn't find any keys in environment" do
108
+ support = described_class.new({})
109
+ expect(support.from_env).to eq(TTY::Color::NoValue)
110
+ end
69
111
  end
70
112
  end
@@ -4,7 +4,7 @@ desc 'Load gem inside irb console'
4
4
  task :console do
5
5
  require 'irb'
6
6
  require 'irb/completion'
7
- require File.join(__FILE__, '../../lib/pastel')
7
+ require File.join(__FILE__, '../../lib/tty-color')
8
8
  ARGV.clear
9
9
  IRB.start
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tty-color
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
  - Piotr Murach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-02 00:00:00.000000000 Z
11
+ date: 2016-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -47,8 +47,7 @@ dependencies:
47
47
  description: Terminal color capabilities detection
48
48
  email:
49
49
  - ''
50
- executables:
51
- - color
50
+ executables: []
52
51
  extensions: []
53
52
  extra_rdoc_files: []
54
53
  files:
@@ -60,7 +59,6 @@ files:
60
59
  - LICENSE.txt
61
60
  - README.md
62
61
  - Rakefile
63
- - bin/color
64
62
  - lib/tty-color.rb
65
63
  - lib/tty/color.rb
66
64
  - lib/tty/color/mode.rb
data/bin/color DELETED
@@ -1,42 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- Signal.trap("INT") { exit 1 }
4
-
5
- lib_dir = File.expand_path("../../lib", __FILE__)
6
- $LOAD_PATH.unshift(lib_dir) if File.directory?(lib_dir)
7
-
8
- require 'optparse'
9
- require 'tty-color'
10
-
11
- options = {}
12
-
13
- parser = OptionParser.new do |opts|
14
- opts.on('-s', '--support', 'Check if terminal supports colors') do
15
- options[:color] = true
16
- end
17
-
18
- opts.on('-m', '--mode', 'Supported colors mode') do
19
- options[:mode] = true
20
- end
21
-
22
- options[:verbose] = false
23
- opts.on('-v', '--verbose', 'Output debug information' ) do
24
- options[:verbose] = true
25
- end
26
-
27
- opts.on('-h', '--help', 'Display help' ) do
28
- puts opts
29
- exit
30
- end
31
- end
32
-
33
- parser.parse!
34
-
35
- TTY::Color.verbose = options[:verbose]
36
-
37
- if options[:mode]
38
- puts TTY::Color.mode
39
- else
40
- puts TTY::Color.color?
41
- end
42
-