pastel 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/CHANGELOG.md +6 -0
- data/README.md +20 -2
- data/assets/screenshot.png +0 -0
- data/lib/pastel.rb +12 -2
- data/lib/pastel/ansi.rb +2 -0
- data/lib/pastel/color.rb +20 -3
- data/lib/pastel/color_resolver.rb +5 -0
- data/lib/pastel/delegator.rb +17 -13
- data/lib/pastel/version.rb +1 -1
- data/pastel.gemspec +2 -1
- data/spec/unit/color/code_spec.rb +1 -1
- data/spec/unit/color/decorate_spec.rb +1 -1
- data/spec/unit/color/strip_spec.rb +1 -1
- data/spec/unit/color/styles_spec.rb +1 -1
- data/spec/unit/color/supports_spec.rb +46 -0
- data/spec/unit/delegator_spec.rb +4 -2
- data/spec/unit/new_spec.rb +7 -3
- metadata +13 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eab704ae6d2747d9d0fc40eb19843f91c7dfb331
|
4
|
+
data.tar.gz: f51ab97939b6375f973c16d0215398dd6ad9c97f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c26988ce864c70a9bb5e23de8d85895e69d2449dbf09a8f5d611e92187b7f64ca02fb1ada0f29a9c0fbf1576e44248be5fff5d06dcd775fb36262a4bb98aa8d1
|
7
|
+
data.tar.gz: 29401a138ed3646c77d3b85f49a772266c4acc1662c57d3cd1ae91d8149c1b783e33c262cc5465e73d1b422bb36ded104720d8b13604e580ee9c1ab6d1e7769c
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
0.2.0 (October 12, 2014)
|
2
|
+
|
3
|
+
* Change gemspec to include equatable as dependency
|
4
|
+
* Add #supports? to Color to check for terminal color support
|
5
|
+
* Add ability to force color support through :enabled option
|
6
|
+
* Change Delegator to stop creating instances and improve performance
|
data/README.md
CHANGED
@@ -11,6 +11,8 @@ Terminal output styling with intuitive and clean API that doesn't monkey patch S
|
|
11
11
|
|
12
12
|
**Pastel** is minimal and focused to work in all terminal emulators.
|
13
13
|
|
14
|
+

|
15
|
+
|
14
16
|
## Features
|
15
17
|
|
16
18
|
* Doesn't monkey patch `String`
|
@@ -42,6 +44,7 @@ Or install it yourself as:
|
|
42
44
|
* [2.3 Strip](#23-strip)
|
43
45
|
* [2.4 Styles](#24-styles)
|
44
46
|
* [2.5 Valid?](#25-valid)
|
47
|
+
* [2.6 Enabled?](#26-enabled)
|
45
48
|
* [3. The available styles](#3-the-available-styles)
|
46
49
|
|
47
50
|
## 1 Usage
|
@@ -66,7 +69,7 @@ You can compose multiple styles through chainable API:
|
|
66
69
|
pastel.red.on_green.bold('Unicorns!')
|
67
70
|
```
|
68
71
|
|
69
|
-
It supports variable number of arguments
|
72
|
+
It supports variable number of arguments:
|
70
73
|
|
71
74
|
```ruby
|
72
75
|
pastel.red('Unicorns', 'are', 'running', 'everywhere!')
|
@@ -85,7 +88,7 @@ pastel.red('Unicorns ', pastel.on_green('everywhere!'))
|
|
85
88
|
You can pass variable number of styled strings like so:
|
86
89
|
|
87
90
|
```ruby
|
88
|
-
pastel.red('Unicorns
|
91
|
+
pastel.red('Unicorns ', pastel.bold.underline('everywhere'), '!')
|
89
92
|
```
|
90
93
|
|
91
94
|
Please refer to [3. The available styles](#3-the-available-styles) section for full list of supported styles.
|
@@ -123,6 +126,21 @@ pastel.valid?(:red) # => true
|
|
123
126
|
pastel.valid?(:unicorn) # => false
|
124
127
|
```
|
125
128
|
|
129
|
+
### 2.6 Enabled?
|
130
|
+
|
131
|
+
In order to detect if your terminal supports coloring do:
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
pastel.enabled? # => false
|
135
|
+
```
|
136
|
+
|
137
|
+
In cases when the color support is not provided no styling will be applied to the colored string. Moreover, you can force **Pastel** to always print out string with coloring switched on:
|
138
|
+
|
139
|
+
```ruby
|
140
|
+
pastel = Pastel.new(enabled: true)
|
141
|
+
pastel.enabled? # => false
|
142
|
+
```
|
143
|
+
|
126
144
|
## 3 The available styles
|
127
145
|
|
128
146
|
**Pastel** works with terminal emulators that support minimum sixteen colors. It provides `16` basic colors and `8` styles with further `16` bright color pairs. The corresponding bright color is obtained by prepending the `bright` to the normal color name. For example, color `red` will have `bright_red` as its pair.
|
Binary file
|
data/lib/pastel.rb
CHANGED
@@ -12,8 +12,18 @@ module Pastel
|
|
12
12
|
# Raised when the style attribute is not supported
|
13
13
|
InvalidAttributeNameError = Class.new(::ArgumentError)
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
# Create Pastel chainable API
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# pastel = Pastel.new enabled: true
|
19
|
+
#
|
20
|
+
# @return [Delegator]
|
21
|
+
#
|
22
|
+
# @api public
|
23
|
+
def new(options = {})
|
24
|
+
color = Color.new(options)
|
25
|
+
resolver = ColorResolver.new(color)
|
26
|
+
Delegator.for(resolver, DecoratorChain.empty)
|
17
27
|
end
|
18
28
|
|
19
29
|
module_function :new
|
data/lib/pastel/ansi.rb
CHANGED
@@ -30,6 +30,7 @@ module Pastel
|
|
30
30
|
BRIGHT_BLUE = "\e[94m"
|
31
31
|
BRIGHT_MAGENTA = "\e[95m"
|
32
32
|
BRIGHT_CYAN = "\e[96m"
|
33
|
+
BRIGHT_WHITE = "\e[97m"
|
33
34
|
|
34
35
|
# Escape codes for background color.
|
35
36
|
ON_BLACK = "\e[40m"
|
@@ -48,6 +49,7 @@ module Pastel
|
|
48
49
|
ON_BRIGHT_BLUE = "\e[104m"
|
49
50
|
ON_BRIGHT_MAGENTA = "\e[105m"
|
50
51
|
ON_BRIGHT_CYAN = "\e[106m"
|
52
|
+
ON_BRIGHT_WHITE = "\e[107m"
|
51
53
|
|
52
54
|
BACKGROUND_COLORS = constants.grep(/^ON_*/).freeze
|
53
55
|
end # ANSI
|
data/lib/pastel/color.rb
CHANGED
@@ -7,12 +7,13 @@ module Pastel
|
|
7
7
|
include ANSI
|
8
8
|
|
9
9
|
attr_reader :enabled
|
10
|
+
alias_method :enabled?, :enabled
|
10
11
|
|
11
12
|
# Initialize a Terminal Color
|
12
13
|
#
|
13
14
|
# @api public
|
14
|
-
def initialize(
|
15
|
-
@enabled = enabled
|
15
|
+
def initialize(options = {})
|
16
|
+
@enabled = options.fetch(:enabled) { supports? }
|
16
17
|
end
|
17
18
|
|
18
19
|
# Disable coloring of this terminal session
|
@@ -22,6 +23,22 @@ module Pastel
|
|
22
23
|
@enabled = false
|
23
24
|
end
|
24
25
|
|
26
|
+
# Detect terminal color support
|
27
|
+
#
|
28
|
+
# @return [Boolean]
|
29
|
+
# true when terminal supports color, false otherwise
|
30
|
+
#
|
31
|
+
# @api public
|
32
|
+
def supports?
|
33
|
+
return false unless $stdout.tty?
|
34
|
+
return false if ENV['TERM'] == 'dumb'
|
35
|
+
if ENV['TERM'] =~ /^screen|^xterm|^vt100|color|ansi|cygwin|linux/i
|
36
|
+
return true
|
37
|
+
end
|
38
|
+
return true if ENV.include?('COLORTERM')
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
25
42
|
# Apply ANSI color to the given string.
|
26
43
|
#
|
27
44
|
# @param [String] string
|
@@ -36,7 +53,7 @@ module Pastel
|
|
36
53
|
#
|
37
54
|
# @api public
|
38
55
|
def decorate(string, *colors)
|
39
|
-
return string if string.empty?
|
56
|
+
return string if string.empty? || !enabled
|
40
57
|
validate(*colors)
|
41
58
|
ansi_colors = colors.map { |color| lookup(color) }
|
42
59
|
ansi_string = "#{ansi_colors.join}#{string}#{ANSI::CLEAR}"
|
data/lib/pastel/delegator.rb
CHANGED
@@ -7,29 +7,33 @@ module Pastel
|
|
7
7
|
# @api private
|
8
8
|
class Delegator
|
9
9
|
extend Forwardable
|
10
|
+
include Equatable
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
attr_reader :resolver
|
12
|
+
def_delegators '@resolver.color', :valid?, :styles, :strip, :decorate, :enabled?
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
@base = base
|
19
|
-
@color = Color.new
|
20
|
-
@resolver = ColorResolver.new(@color)
|
14
|
+
def initialize(resolver, base)
|
15
|
+
@resolver = resolver
|
16
|
+
@base = base
|
21
17
|
end
|
22
18
|
|
23
19
|
# @api public
|
24
|
-
def self.for(
|
25
|
-
new(
|
20
|
+
def self.for(resolver, base)
|
21
|
+
new(resolver, base)
|
26
22
|
end
|
27
23
|
|
28
24
|
protected
|
29
25
|
|
26
|
+
attr_reader :base
|
27
|
+
|
28
|
+
attr_reader :resolver
|
29
|
+
|
30
|
+
def wrap(base)
|
31
|
+
self.class.new(resolver, base)
|
32
|
+
end
|
33
|
+
|
30
34
|
def method_missing(method_name, *args, &block)
|
31
35
|
new_base = base.add(method_name)
|
32
|
-
delegator =
|
36
|
+
delegator = wrap(new_base)
|
33
37
|
if args.empty?
|
34
38
|
delegator
|
35
39
|
else
|
@@ -38,7 +42,7 @@ module Pastel
|
|
38
42
|
end
|
39
43
|
|
40
44
|
def respond_to_missing?(name, include_all = false)
|
41
|
-
super || @color.respond_to?(name, include_all)
|
45
|
+
super || @resolver.color.respond_to?(name, include_all)
|
42
46
|
end
|
43
47
|
end # Delegator
|
44
48
|
end # Pastel
|
data/lib/pastel/version.rb
CHANGED
data/pastel.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.add_dependency "equatable", "~> 0.5"
|
22
|
+
|
21
23
|
spec.add_development_dependency "bundler", "~> 1.6"
|
22
|
-
spec.add_development_dependency "equatable", "~> 0.5"
|
23
24
|
end
|
@@ -5,7 +5,7 @@ require 'spec_helper'
|
|
5
5
|
RSpec.describe Pastel::Color, '.code' do
|
6
6
|
let(:string) { "This is a \e[1m\e[34mbold blue text\e[0m" }
|
7
7
|
|
8
|
-
subject(:color) { described_class.new }
|
8
|
+
subject(:color) { described_class.new(enabled: true) }
|
9
9
|
|
10
10
|
it 'finds single code' do
|
11
11
|
expect(color.code(:black)).to eq(["\e[30m"])
|
@@ -5,7 +5,7 @@ require 'spec_helper'
|
|
5
5
|
RSpec.describe Pastel::Color, '.decorate' do
|
6
6
|
let(:string) { 'string' }
|
7
7
|
|
8
|
-
subject(:color) { described_class.new }
|
8
|
+
subject(:color) { described_class.new(enabled: true) }
|
9
9
|
|
10
10
|
it "doesn't apply styling to empty string" do
|
11
11
|
expect(color.decorate('')).to eq('')
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Pastel::Color, '.supports?' do
|
6
|
+
it "isn't enabled for non tty terminal" do
|
7
|
+
allow($stdout).to receive(:tty?).and_return(false)
|
8
|
+
color = described_class.new
|
9
|
+
|
10
|
+
expect(color.enabled?).to eq(false)
|
11
|
+
expect(color.decorate("Unicorn", :red)).to eq("Unicorn")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "isn't enabled for dumb terminal" do
|
15
|
+
allow($stdout).to receive(:tty?).and_return(true)
|
16
|
+
allow(ENV).to receive(:[]).with('TERM').and_return('dumb')
|
17
|
+
color = described_class.new
|
18
|
+
|
19
|
+
expect(color.enabled?).to eq(false)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "is enabled for term with color support" do
|
23
|
+
allow($stdout).to receive(:tty?).and_return(true)
|
24
|
+
allow(ENV).to receive(:[]).with('TERM').and_return('xterm')
|
25
|
+
color = described_class.new
|
26
|
+
|
27
|
+
expect(color.enabled?).to eq(true)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "is enabled for color terminal" do
|
31
|
+
allow($stdout).to receive(:tty?).and_return(true)
|
32
|
+
allow(ENV).to receive(:[]).with('TERM').and_return('unknown')
|
33
|
+
allow(ENV).to receive(:[]).with('COLORTERM').and_return(true)
|
34
|
+
color = described_class.new
|
35
|
+
|
36
|
+
expect(color.enabled?).to eq(true)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "forces to be enabled with supports? check" do
|
40
|
+
color = described_class.new(enabled: false)
|
41
|
+
allow(color).to receive(:supports?)
|
42
|
+
|
43
|
+
expect(color.enabled?).to eq(false)
|
44
|
+
expect(color).to_not have_received(:supports?)
|
45
|
+
end
|
46
|
+
end
|
data/spec/unit/delegator_spec.rb
CHANGED
@@ -6,16 +6,18 @@ RSpec.describe Pastel::Delegator do
|
|
6
6
|
describe ".respond_to_missing?" do
|
7
7
|
context 'for a method defined on' do
|
8
8
|
it "returns true" do
|
9
|
+
resolver = double(:resolver)
|
9
10
|
chain = double(:chain)
|
10
|
-
decorator = described_class.new(chain)
|
11
|
+
decorator = described_class.new(resolver, chain)
|
11
12
|
expect(decorator.method(:styles)).not_to be_nil
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
15
16
|
context "for an undefined method " do
|
16
17
|
it "returns false" do
|
18
|
+
resolver = double(:resolver, color: true)
|
17
19
|
chain = double(:chain)
|
18
|
-
decorator = described_class.new(chain)
|
20
|
+
decorator = described_class.new(resolver, chain)
|
19
21
|
expect { decorator.method(:unknown) }.to raise_error(NameError)
|
20
22
|
end
|
21
23
|
end
|
data/spec/unit/new_spec.rb
CHANGED
@@ -4,7 +4,7 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
RSpec.describe Pastel do
|
6
6
|
|
7
|
-
subject(:pastel) { described_class.new }
|
7
|
+
subject(:pastel) { described_class.new(enabled: true) }
|
8
8
|
|
9
9
|
describe 'coloring string' do
|
10
10
|
it "doesn't apply styles to empty string" do
|
@@ -55,7 +55,11 @@ RSpec.describe Pastel do
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
|
59
|
-
|
58
|
+
describe 'options passed in' do
|
59
|
+
it "receives enabled option" do
|
60
|
+
pastel = described_class.new(enabled: false)
|
61
|
+
expect(pastel.enabled?).to eq(false)
|
62
|
+
expect(pastel.red('Unicorn', pastel.green('!'))).to eq('Unicorn!')
|
63
|
+
end
|
60
64
|
end
|
61
65
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pastel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 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: 2014-10-
|
11
|
+
date: 2014-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: equatable
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
type: :
|
19
|
+
version: '0.5'
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '1.6'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '1.6'
|
41
41
|
description: Terminal strings styling with intuitive and clean API.
|
42
42
|
email:
|
43
43
|
- ''
|
@@ -50,10 +50,12 @@ files:
|
|
50
50
|
- .ruby-gemset
|
51
51
|
- .ruby-version
|
52
52
|
- .travis.yml
|
53
|
+
- CHANGELOG.md
|
53
54
|
- Gemfile
|
54
55
|
- LICENSE.txt
|
55
56
|
- README.md
|
56
57
|
- Rakefile
|
58
|
+
- assets/screenshot.png
|
57
59
|
- lib/pastel.rb
|
58
60
|
- lib/pastel/ansi.rb
|
59
61
|
- lib/pastel/color.rb
|
@@ -67,6 +69,7 @@ files:
|
|
67
69
|
- spec/unit/color/decorate_spec.rb
|
68
70
|
- spec/unit/color/strip_spec.rb
|
69
71
|
- spec/unit/color/styles_spec.rb
|
72
|
+
- spec/unit/color/supports_spec.rb
|
70
73
|
- spec/unit/decorator_chain_spec.rb
|
71
74
|
- spec/unit/delegator_spec.rb
|
72
75
|
- spec/unit/new_spec.rb
|
@@ -103,6 +106,7 @@ test_files:
|
|
103
106
|
- spec/unit/color/decorate_spec.rb
|
104
107
|
- spec/unit/color/strip_spec.rb
|
105
108
|
- spec/unit/color/styles_spec.rb
|
109
|
+
- spec/unit/color/supports_spec.rb
|
106
110
|
- spec/unit/decorator_chain_spec.rb
|
107
111
|
- spec/unit/delegator_spec.rb
|
108
112
|
- spec/unit/new_spec.rb
|