pastel 0.2.1 → 0.3.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/.travis.yml +0 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile +1 -0
- data/README.md +46 -8
- data/benchmarks/speed.rb +16 -0
- data/lib/pastel.rb +6 -0
- data/lib/pastel/alias_importer.rb +43 -0
- data/lib/pastel/ansi.rb +45 -45
- data/lib/pastel/color.rb +93 -21
- data/lib/pastel/color_resolver.rb +4 -3
- data/lib/pastel/delegator.rb +8 -1
- data/lib/pastel/version.rb +1 -1
- data/spec/unit/alias_color_spec.rb +26 -0
- data/spec/unit/alias_importer_spec.rb +28 -0
- data/spec/unit/color/alias_color_spec.rb +42 -0
- data/spec/unit/color/code_spec.rb +2 -2
- data/spec/unit/color/decorate_spec.rb +2 -2
- data/spec/unit/color/styles_spec.rb +1 -1
- data/spec/unit/color/supports_spec.rb +3 -0
- data/spec/unit/new_spec.rb +25 -4
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3a74798586ce6f5429d3c76faad4e3445319463
|
4
|
+
data.tar.gz: c2b581122d3029f273f29d5c6fcb9cbca064cc64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c47eac8d882f22e8dc9c1217497ce9f4a2aea4371d523801e8c37261aad1fc9f03d8f2e7f45c7ab168f22c68621331e9201d7363d5ae357a129596110a7fa27c
|
7
|
+
data.tar.gz: e7fdf3e1428864ad525fb50dfb3fe6f9f760ce7923d91af73b7f9df054f22e51dbc0db969cbd2def2bcce3b4d6b8337addbc0ac1b406395fb88bf106f5ae8434
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
0.3.0 (November 8, 2014)
|
2
|
+
|
3
|
+
* Add ability to alias colors through alias_color method
|
4
|
+
* Add ability to alias colors through the environment variable
|
5
|
+
* Improve performance of Pastel::Color styles and lookup methods
|
6
|
+
* Fix bug concerned with lack of escaping for nested styles
|
7
|
+
|
1
8
|
0.2.1 (October 13, 2014)
|
2
9
|
|
3
10
|
* Fix issue #1 with unitialize dependency
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -13,6 +13,8 @@ Terminal output styling with intuitive and clean API that doesn't monkey patch S
|
|
13
13
|
|
14
14
|

|
15
15
|
|
16
|
+
**Pastel** provides independent coloring component for [TTY](https://github.com/peter-murach/tty) toolkit.
|
17
|
+
|
16
18
|
## Features
|
17
19
|
|
18
20
|
* Doesn't monkey patch `String`
|
@@ -45,7 +47,9 @@ Or install it yourself as:
|
|
45
47
|
* [2.4 Styles](#24-styles)
|
46
48
|
* [2.5 Valid?](#25-valid)
|
47
49
|
* [2.6 Enabled?](#26-enabled)
|
48
|
-
* [
|
50
|
+
* [2.7 Alias Color](#27-alias-color)
|
51
|
+
* [3. Supported Colors](#3-supported-colors)
|
52
|
+
* [4. Environment](#4-environment)
|
49
53
|
|
50
54
|
## 1 Usage
|
51
55
|
|
@@ -91,7 +95,7 @@ You can pass variable number of styled strings like so:
|
|
91
95
|
pastel.red('Unicorns ', pastel.bold.underline('everywhere'), '!')
|
92
96
|
```
|
93
97
|
|
94
|
-
Please refer to [3.
|
98
|
+
Please refer to [3. Supported Colors](#3-supported-colors) section for full list of supported styles.
|
95
99
|
|
96
100
|
### 2.2 Decorate
|
97
101
|
|
@@ -101,9 +105,11 @@ This method is a lower level string styling call that takes as the first argumen
|
|
101
105
|
pastel.decorate('Unicorn', :green, :on_blue, :bold)
|
102
106
|
```
|
103
107
|
|
108
|
+
This method will be useful in situations where colors are provided as a list of parameters.
|
109
|
+
|
104
110
|
### 2.3 Strip
|
105
111
|
|
106
|
-
Strip all color sequence characters
|
112
|
+
Strip all color sequence characters from the provided strings. The return value will be eithre array of modified strings or a single string. The arguments are not modified.
|
107
113
|
|
108
114
|
```ruby
|
109
115
|
pastel.strip("\e[1m\e[34mbold blue text\e[0m"") # => "bold blue text"
|
@@ -119,11 +125,11 @@ pastel.styles
|
|
119
125
|
|
120
126
|
### 2.5 Valid?
|
121
127
|
|
122
|
-
Determine whether a color
|
128
|
+
Determine whether a color or a list of colors are valid. `valid?` takes one or more attribute strings or symbols and returns true if all attributes are known and false otherwise.
|
123
129
|
|
124
130
|
```ruby
|
125
|
-
pastel.valid?(:red)
|
126
|
-
pastel.valid?(:unicorn)
|
131
|
+
pastel.valid?(:red, :blue) # => true
|
132
|
+
pastel.valid?(:unicorn) # => false
|
127
133
|
```
|
128
134
|
|
129
135
|
### 2.6 Enabled?
|
@@ -141,7 +147,27 @@ pastel = Pastel.new(enabled: true)
|
|
141
147
|
pastel.enabled? # => false
|
142
148
|
```
|
143
149
|
|
144
|
-
|
150
|
+
### 2.7 Alias Color
|
151
|
+
|
152
|
+
In order to setup an alias for the standard color do:
|
153
|
+
|
154
|
+
```ruby
|
155
|
+
pastel.alias_color(:funky, :red)
|
156
|
+
```
|
157
|
+
|
158
|
+
From that point forward, `:funky` alias can be passed to `decorate`, `valid?` with the same meaning as standard color:
|
159
|
+
|
160
|
+
```ruby
|
161
|
+
pastel.funky.on_green('unicorn') # => will use :red color
|
162
|
+
```
|
163
|
+
|
164
|
+
This method allows you to give more meaningful names to existing colors.
|
165
|
+
|
166
|
+
You can also use the `PASTEL_COLORS_ALIASES` environment variable (see [Environment](#4-environment)) to specify aliases.
|
167
|
+
|
168
|
+
Note: Aliases are global and affect all callers in the same process.
|
169
|
+
|
170
|
+
## 3 Supported Colors
|
145
171
|
|
146
172
|
**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.
|
147
173
|
|
@@ -196,9 +222,21 @@ Generic styles:
|
|
196
222
|
* `hidden`
|
197
223
|
* `strikethrough`
|
198
224
|
|
225
|
+
## 4 Environment
|
226
|
+
|
227
|
+
### 4.1 PASTEL_COLORS_ALIASES
|
228
|
+
|
229
|
+
This environment variable allows you to specify custom color aliases at runtime that will be understood by **Pastel**. The environment variable is read and used when the instance of **Pastel** is created. You can also use `alias_color` to create aliases.
|
230
|
+
|
231
|
+
Only alphanumeric and `_` are allowed in the alias names with the following format:
|
232
|
+
|
233
|
+
```ruby
|
234
|
+
PASTEL_COLORS_ALIASES='newcolor_1=red,newcolor_2=on_gree'
|
235
|
+
```
|
236
|
+
|
199
237
|
## Contributing
|
200
238
|
|
201
|
-
1. Fork it ( https://github.com/
|
239
|
+
1. Fork it ( https://github.com/peter-murach/pastel/fork )
|
202
240
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
203
241
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
204
242
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/benchmarks/speed.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'pastel'
|
2
|
+
require 'benchmark/ips'
|
3
|
+
|
4
|
+
pastel = Pastel.new
|
5
|
+
|
6
|
+
Benchmark.ips do |bench|
|
7
|
+
bench.config(time: 5, warmup: 2)
|
8
|
+
|
9
|
+
bench.report('styles') do
|
10
|
+
pastel.styles
|
11
|
+
end
|
12
|
+
|
13
|
+
bench.report('decorate') do
|
14
|
+
pastel.decorate('string', :red, :on_green, :bold)
|
15
|
+
end
|
16
|
+
end
|
data/lib/pastel.rb
CHANGED
@@ -4,6 +4,7 @@ require 'forwardable'
|
|
4
4
|
require 'equatable'
|
5
5
|
|
6
6
|
require 'pastel/ansi'
|
7
|
+
require 'pastel/alias_importer'
|
7
8
|
require 'pastel/color'
|
8
9
|
require 'pastel/color_resolver'
|
9
10
|
require 'pastel/delegator'
|
@@ -14,6 +15,9 @@ module Pastel
|
|
14
15
|
# Raised when the style attribute is not supported
|
15
16
|
InvalidAttributeNameError = Class.new(::ArgumentError)
|
16
17
|
|
18
|
+
# Raised when the color alias is not supported
|
19
|
+
InvalidAliasNameError = Class.new(::ArgumentError)
|
20
|
+
|
17
21
|
# Create Pastel chainable API
|
18
22
|
#
|
19
23
|
# @example
|
@@ -24,6 +28,8 @@ module Pastel
|
|
24
28
|
# @api public
|
25
29
|
def new(options = {})
|
26
30
|
color = Color.new(options)
|
31
|
+
importer = AliasImporter.new(color)
|
32
|
+
importer.import
|
27
33
|
resolver = ColorResolver.new(color)
|
28
34
|
Delegator.for(resolver, DecoratorChain.empty)
|
29
35
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Pastel
|
4
|
+
# A class responsible for importing color aliases
|
5
|
+
class AliasImporter
|
6
|
+
# Create alias importer
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# importer = Pastel::AliasImporter.new(Pastel::Color.new)
|
10
|
+
#
|
11
|
+
# @api public
|
12
|
+
def initialize(color, output = $stderr)
|
13
|
+
@color = color
|
14
|
+
@output = output
|
15
|
+
end
|
16
|
+
|
17
|
+
# Import aliases from the environment
|
18
|
+
#
|
19
|
+
# @example
|
20
|
+
# importer = Pastel::AliasImporter.new(Pastel::Color.new)
|
21
|
+
# importer.import
|
22
|
+
#
|
23
|
+
# @return [nil]
|
24
|
+
#
|
25
|
+
# @api public
|
26
|
+
def import
|
27
|
+
color_aliases = ENV['PASTEL_COLORS_ALIASES']
|
28
|
+
return unless color_aliases
|
29
|
+
color_aliases.split(',').each do |color_alias|
|
30
|
+
new_color, old_color = color_alias.split('=').map(&:to_sym)
|
31
|
+
if !new_color || !old_color
|
32
|
+
output.puts "Bad color mapping `#{color_alias}`"
|
33
|
+
else
|
34
|
+
color.alias_color(new_color, old_color)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
attr_reader :color, :output
|
42
|
+
end # AliasImporter
|
43
|
+
end # Pastel
|
data/lib/pastel/ansi.rb
CHANGED
@@ -3,54 +3,54 @@
|
|
3
3
|
module Pastel
|
4
4
|
# Mixin that provides ANSI codes
|
5
5
|
module ANSI
|
6
|
-
|
6
|
+
ATTRIBUTES = {
|
7
|
+
clear: 0,
|
8
|
+
reset: 0,
|
9
|
+
bold: 1,
|
10
|
+
dark: 2,
|
11
|
+
dim: 2,
|
12
|
+
italic: 3,
|
13
|
+
underline: 4,
|
14
|
+
underscore: 4,
|
15
|
+
inverse: 7,
|
16
|
+
hidden: 8,
|
17
|
+
strikethrough: 9,
|
7
18
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
19
|
+
black: 30,
|
20
|
+
red: 31,
|
21
|
+
green: 32,
|
22
|
+
yellow: 33,
|
23
|
+
blue: 34,
|
24
|
+
magenta: 35,
|
25
|
+
cyan: 36,
|
26
|
+
white: 37,
|
15
27
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
WHITE = "\e[37m"
|
28
|
+
on_black: 40,
|
29
|
+
on_red: 41,
|
30
|
+
on_green: 42,
|
31
|
+
on_yellow: 43,
|
32
|
+
on_blue: 44,
|
33
|
+
on_magenta: 45,
|
34
|
+
on_cyan: 46,
|
35
|
+
on_white: 47,
|
25
36
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
37
|
+
bright_black: 90,
|
38
|
+
bright_red: 91,
|
39
|
+
bright_green: 92,
|
40
|
+
bright_yellow: 93,
|
41
|
+
bright_blue: 94,
|
42
|
+
bright_magenta: 95,
|
43
|
+
bright_cyan: 96,
|
44
|
+
bright_white: 97,
|
34
45
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
ON_BRIGHT_BLACK = "\e[100m"
|
46
|
-
ON_BRIGHT_RED = "\e[101m"
|
47
|
-
ON_BRIGHT_GREEN = "\e[102m"
|
48
|
-
ON_BRIGHT_YELLOW = "\e[103m"
|
49
|
-
ON_BRIGHT_BLUE = "\e[104m"
|
50
|
-
ON_BRIGHT_MAGENTA = "\e[105m"
|
51
|
-
ON_BRIGHT_CYAN = "\e[106m"
|
52
|
-
ON_BRIGHT_WHITE = "\e[107m"
|
53
|
-
|
54
|
-
BACKGROUND_COLORS = constants.grep(/^ON_*/).freeze
|
46
|
+
on_bright_black: 100,
|
47
|
+
on_bright_red: 101,
|
48
|
+
on_bright_green: 102,
|
49
|
+
on_bright_yellow: 103,
|
50
|
+
on_bright_blue: 104,
|
51
|
+
on_bright_magenta: 105,
|
52
|
+
on_bright_cyan: 106,
|
53
|
+
on_bright_white: 107
|
54
|
+
}
|
55
55
|
end # ANSI
|
56
56
|
end # Pastel
|
data/lib/pastel/color.rb
CHANGED
@@ -6,6 +6,8 @@ module Pastel
|
|
6
6
|
include Equatable
|
7
7
|
include ANSI
|
8
8
|
|
9
|
+
ALIASES = {}
|
10
|
+
|
9
11
|
attr_reader :enabled
|
10
12
|
alias_method :enabled?, :enabled
|
11
13
|
|
@@ -45,27 +47,64 @@ module Pastel
|
|
45
47
|
# text to add ANSI strings
|
46
48
|
#
|
47
49
|
# @param [Array[Symbol]] colors
|
50
|
+
# the color names
|
48
51
|
#
|
49
52
|
# @example
|
50
53
|
# color.decorate "text", :yellow, :on_green, :underline
|
51
54
|
#
|
52
55
|
# @return [String]
|
56
|
+
# the colored string
|
53
57
|
#
|
54
58
|
# @api public
|
55
59
|
def decorate(string, *colors)
|
56
60
|
return string if string.empty? || !enabled
|
57
|
-
|
58
|
-
ansi_colors =
|
59
|
-
ansi_string = "#{ansi_colors
|
60
|
-
|
61
|
-
|
61
|
+
|
62
|
+
ansi_colors = lookup(*colors)
|
63
|
+
ansi_string = "#{ansi_colors}#{string}#{clear}"
|
64
|
+
ansi_string = nest_color(collapse_reset(ansi_string), ansi_colors)
|
65
|
+
ansi_string
|
66
|
+
end
|
67
|
+
|
68
|
+
def clear
|
69
|
+
lookup(:clear)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Collapse reset
|
73
|
+
#
|
74
|
+
# @param [String] string
|
75
|
+
# the string to remove duplicates from
|
76
|
+
#
|
77
|
+
# @return [String]
|
78
|
+
#
|
79
|
+
# @api private
|
80
|
+
def collapse_reset(string)
|
81
|
+
ansi_string = string.dup
|
82
|
+
if ansi_string =~ /(#{Regexp.quote(clear)}){2,}/
|
83
|
+
ansi_string.gsub!(/(#{Regexp.quote(clear)}){2,}/, clear)
|
62
84
|
end
|
63
|
-
|
64
|
-
|
65
|
-
|
85
|
+
ansi_string
|
86
|
+
end
|
87
|
+
|
88
|
+
# Nest color
|
89
|
+
#
|
90
|
+
# @param [String] string
|
91
|
+
# the string to decorate
|
92
|
+
#
|
93
|
+
# @param [String] ansi_colors
|
94
|
+
# the ansi colors to apply
|
95
|
+
#
|
96
|
+
# @return [String]
|
97
|
+
#
|
98
|
+
# @api private
|
99
|
+
def nest_color(string, ansi_colors)
|
100
|
+
ansi_string = string.dup
|
101
|
+
matches = ansi_string.scan(/#{Regexp.quote(clear)}/)
|
102
|
+
if matches.length > 1
|
103
|
+
ansi_string.sub!(/#{Regexp.quote(clear)}/, ansi_colors)
|
66
104
|
end
|
67
105
|
ansi_string
|
68
106
|
end
|
107
|
+
private :collapse_reset, :nest_color
|
69
108
|
|
70
109
|
# Same as instance method.
|
71
110
|
#
|
@@ -79,6 +118,7 @@ module Pastel
|
|
79
118
|
# Strip ANSI color codes from a string.
|
80
119
|
#
|
81
120
|
# @param [String] string
|
121
|
+
# the string to sanitize
|
82
122
|
#
|
83
123
|
# @return [String]
|
84
124
|
#
|
@@ -94,21 +134,30 @@ module Pastel
|
|
94
134
|
#
|
95
135
|
# @api public
|
96
136
|
def code(*colors)
|
97
|
-
|
98
|
-
colors.
|
137
|
+
attribute = []
|
138
|
+
colors.each do |color|
|
139
|
+
value = ANSI::ATTRIBUTES[color] || ALIASES[color]
|
140
|
+
if value
|
141
|
+
attribute << value
|
142
|
+
else
|
143
|
+
validate(color)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
attribute
|
99
147
|
end
|
100
148
|
|
101
149
|
# Find color representation.
|
102
150
|
#
|
103
|
-
# @param [Symbol,String]
|
104
|
-
# the color name to lookup
|
151
|
+
# @param [Symbol,String] colors
|
152
|
+
# the color name(s) to lookup
|
105
153
|
#
|
106
154
|
# @return [String]
|
107
|
-
# the ANSI code
|
155
|
+
# the ANSI code(s)
|
108
156
|
#
|
109
157
|
# @api private
|
110
|
-
def lookup(
|
111
|
-
|
158
|
+
def lookup(*colors)
|
159
|
+
attribute = code(*colors)
|
160
|
+
"\e[#{attribute.join(';')}m"
|
112
161
|
end
|
113
162
|
|
114
163
|
# Expose all ANSI color names and their codes
|
@@ -117,10 +166,7 @@ module Pastel
|
|
117
166
|
#
|
118
167
|
# @api public
|
119
168
|
def styles
|
120
|
-
ANSI.
|
121
|
-
acc[col.to_sym.downcase] = lookup(col)
|
122
|
-
acc
|
123
|
-
end
|
169
|
+
ANSI::ATTRIBUTES.merge(ALIASES)
|
124
170
|
end
|
125
171
|
|
126
172
|
# List all available style names
|
@@ -135,16 +181,42 @@ module Pastel
|
|
135
181
|
# Check if provided colors are known colors
|
136
182
|
#
|
137
183
|
# @param [Array[Symbol,String]]
|
138
|
-
# the colors to check
|
184
|
+
# the list of colors to check
|
139
185
|
#
|
140
186
|
# @reutrn [Boolean]
|
187
|
+
# true if all colors are valid, false otherwise
|
141
188
|
#
|
142
189
|
# @api public
|
143
190
|
def valid?(*colors)
|
144
191
|
colors.all? { |color| style_names.include?(color.to_sym) }
|
145
192
|
end
|
146
193
|
|
147
|
-
|
194
|
+
# Define a new color alias
|
195
|
+
#
|
196
|
+
# @param [String] alias_name
|
197
|
+
# the color alias to define
|
198
|
+
# @param [String] color
|
199
|
+
# the color the alias will correspond to
|
200
|
+
#
|
201
|
+
# @return [String]
|
202
|
+
# the standard color value of the alias
|
203
|
+
#
|
204
|
+
# @api public
|
205
|
+
def alias_color(alias_name, color)
|
206
|
+
validate(color)
|
207
|
+
|
208
|
+
if !(alias_name.to_s =~ /^[\w]+$/)
|
209
|
+
fail InvalidAliasNameError, "Invalid alias name `#{alias_name}`"
|
210
|
+
elsif ANSI::ATTRIBUTES[alias_name]
|
211
|
+
fail InvalidAliasNameError,
|
212
|
+
"Cannot alias standard color `#{alias_name}`"
|
213
|
+
end
|
214
|
+
|
215
|
+
ALIASES[alias_name.to_sym] = ANSI::ATTRIBUTES[color]
|
216
|
+
color
|
217
|
+
end
|
218
|
+
|
219
|
+
private
|
148
220
|
|
149
221
|
# @api private
|
150
222
|
def validate(*colors)
|
@@ -18,11 +18,12 @@ module Pastel
|
|
18
18
|
@color = color
|
19
19
|
end
|
20
20
|
|
21
|
+
# Resolve uncolored string
|
22
|
+
#
|
23
|
+
# @api private
|
21
24
|
def resolve(base, *args)
|
22
25
|
unprocessed_string = args.join
|
23
|
-
|
24
|
-
color.decorate(component, decorator)
|
25
|
-
end
|
26
|
+
color.decorate(unprocessed_string, *base)
|
26
27
|
end
|
27
28
|
end # ColorResolver
|
28
29
|
end # Pastel
|
data/lib/pastel/delegator.rb
CHANGED
@@ -10,7 +10,7 @@ module Pastel
|
|
10
10
|
include Equatable
|
11
11
|
|
12
12
|
def_delegators '@resolver.color', :valid?, :styles, :strip, :decorate,
|
13
|
-
:enabled
|
13
|
+
:enabled?, :alias_color
|
14
14
|
|
15
15
|
# Create Delegator
|
16
16
|
#
|
@@ -31,6 +31,13 @@ module Pastel
|
|
31
31
|
new(resolver, base)
|
32
32
|
end
|
33
33
|
|
34
|
+
# Object string representation
|
35
|
+
#
|
36
|
+
# @api
|
37
|
+
def inspect
|
38
|
+
"<##{self.class.name}>"
|
39
|
+
end
|
40
|
+
|
34
41
|
protected
|
35
42
|
|
36
43
|
attr_reader :base
|
data/lib/pastel/version.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Pastel, '.alias_color' do
|
6
|
+
|
7
|
+
subject(:pastel) { described_class.new(enabled: true) }
|
8
|
+
|
9
|
+
it "aliases color" do
|
10
|
+
pastel.alias_color(:funky, :red)
|
11
|
+
expect(pastel.funky('unicorn')).to eq("\e[31municorn\e[0m")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "aliases color and combines with regular ones" do
|
15
|
+
pastel.alias_color(:funky, :red)
|
16
|
+
expect(pastel.funky.on_green('unicorn')).to eq("\e[31;42municorn\e[0m")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "reads aliases from the environment" do
|
20
|
+
color_aliases = "funky=red"
|
21
|
+
allow(ENV).to receive(:[]).with('PASTEL_COLORS_ALIASES').
|
22
|
+
and_return(color_aliases)
|
23
|
+
described_class.new(enabled: true)
|
24
|
+
expect(pastel.valid?(:funky)).to eq(true)
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Pastel::AliasImporter, '.import' do
|
6
|
+
let(:color) { double(:color, alias_color: true) }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
|
9
|
+
subject(:importer) { described_class.new(color, output) }
|
10
|
+
|
11
|
+
it "imports aliases from environment" do
|
12
|
+
color_aliases = "funky=red,base=bright_yellow"
|
13
|
+
allow(ENV).to receive(:[]).with('PASTEL_COLORS_ALIASES').
|
14
|
+
and_return(color_aliases)
|
15
|
+
importer.import
|
16
|
+
expect(color).to have_received(:alias_color).twice
|
17
|
+
end
|
18
|
+
|
19
|
+
it "fails to import incorrectly formattd colors" do
|
20
|
+
color_aliases = "funky red,base=bright_yellow"
|
21
|
+
allow(ENV).to receive(:[]).with('PASTEL_COLORS_ALIASES').
|
22
|
+
and_return(color_aliases)
|
23
|
+
importer.import
|
24
|
+
output.rewind
|
25
|
+
expect(output.string).to eq("Bad color mapping `funky red`\n")
|
26
|
+
expect(color).to have_received(:alias_color).with(:base, :bright_yellow)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Pastel::Color, '.alias_color' do
|
6
|
+
|
7
|
+
subject(:color) { described_class.new(enabled: true) }
|
8
|
+
|
9
|
+
it 'aliases non existent color' do
|
10
|
+
expect {
|
11
|
+
color.alias_color(:funky, :unknown)
|
12
|
+
}.to raise_error(Pastel::InvalidAttributeNameError)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'aliases color with invalid name' do
|
16
|
+
expect {
|
17
|
+
color.alias_color('some name', :red)
|
18
|
+
}.to raise_error(Pastel::InvalidAliasNameError, /Invalid alias name/)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'aliases standard color' do
|
22
|
+
expect {
|
23
|
+
color.alias_color(:red, :red)
|
24
|
+
}.to raise_error(Pastel::InvalidAliasNameError, /alias standard color/)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'aliases color :red to :funky' do
|
28
|
+
color.alias_color(:funky, :red)
|
29
|
+
expect(color.valid?(:funky)).to eq(true)
|
30
|
+
expect(color.code(:funky)).to eq([31])
|
31
|
+
expect(color.lookup(:funky)).to eq("\e[31m")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "has global aliases" do
|
35
|
+
color_foo = described_class.new(enabled: true)
|
36
|
+
color_bar = described_class.new(enabled: true)
|
37
|
+
color_foo.alias_color(:foo, :red)
|
38
|
+
color_bar.alias_color(:bar, :red)
|
39
|
+
expect(color_foo.valid?(:foo)).to eq(true)
|
40
|
+
expect(color_foo.valid?(:bar)).to eq(true)
|
41
|
+
end
|
42
|
+
end
|
@@ -8,11 +8,11 @@ RSpec.describe Pastel::Color, '.code' do
|
|
8
8
|
subject(:color) { described_class.new(enabled: true) }
|
9
9
|
|
10
10
|
it 'finds single code' do
|
11
|
-
expect(color.code(:black)).to eq([
|
11
|
+
expect(color.code(:black)).to eq([30])
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'finds more than one code' do
|
15
|
-
expect(color.code(:black, :green)).to eq([
|
15
|
+
expect(color.code(:black, :green)).to eq([30, 32])
|
16
16
|
end
|
17
17
|
|
18
18
|
it "doesn't find code" do
|
@@ -20,12 +20,12 @@ RSpec.describe Pastel::Color, '.decorate' do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'applies style and color to string' do
|
23
|
-
expect(color.decorate(string, :bold, :green)).to eq("\e[
|
23
|
+
expect(color.decorate(string, :bold, :green)).to eq("\e[1;32m#{string}\e[0m")
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'applies style, color and background to string' do
|
27
27
|
text = color.decorate(string, :bold, :green, :on_blue)
|
28
|
-
expect(text).to eq("\e[
|
28
|
+
expect(text).to eq("\e[1;32;44m#{string}\e[0m")
|
29
29
|
end
|
30
30
|
|
31
31
|
it "applies styles to nested text" do
|
@@ -3,6 +3,9 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe Pastel::Color, '.supports?' do
|
6
|
+
|
7
|
+
before { allow(ENV).to receive(:[]).with('PASTEL_COLORS_ALIASES') }
|
8
|
+
|
6
9
|
it "isn't enabled for non tty terminal" do
|
7
10
|
allow($stdout).to receive(:tty?).and_return(false)
|
8
11
|
color = described_class.new
|
data/spec/unit/new_spec.rb
CHANGED
@@ -24,14 +24,29 @@ RSpec.describe Pastel do
|
|
24
24
|
to eq("\e[31mUnicorns\e[0m will rule \e[32mthe World!\e[0m")
|
25
25
|
end
|
26
26
|
|
27
|
-
it "composes color strings" do
|
27
|
+
it "composes two color strings " do
|
28
|
+
expect(pastel.red.on_green("unicorn")).to eq("\e[31;42municorn\e[0m")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "composes three color strings" do
|
28
32
|
expect(pastel.red.on_green.underline("unicorn")).
|
29
|
-
to eq("\e[
|
33
|
+
to eq("\e[31;42;4municorn\e[0m")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "combines colored composed strings with regular ones" do
|
37
|
+
expect(pastel.red.on_green("Unicorns") + ' will rule ' +
|
38
|
+
pastel.green.on_red('the World!')).
|
39
|
+
to eq("\e[31;42mUnicorns\e[0m will rule \e[32;41mthe World!\e[0m")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "allows one level nesting" do
|
43
|
+
expect(pastel.red("Unicorn" + pastel.blue("rule!"))).
|
44
|
+
to eq("\e[31mUnicorn\e[34mrule!\e[0m")
|
30
45
|
end
|
31
46
|
|
32
47
|
it "allows to nest mixed styles" do
|
33
48
|
expect(pastel.red("Unicorn" + pastel.green.on_yellow.underline('running') + '!')).
|
34
|
-
to eq("\e[31mUnicorn\e[
|
49
|
+
to eq("\e[31mUnicorn\e[32;43;4mrunning\e[31m!\e[0m")
|
35
50
|
end
|
36
51
|
|
37
52
|
it "allows for deep nesting" do
|
@@ -44,9 +59,15 @@ RSpec.describe Pastel do
|
|
44
59
|
to eq("\e[31mr\e[32mg\e[31mr\e[0m")
|
45
60
|
end
|
46
61
|
|
62
|
+
it "raises error when chained with unrecognized color" do
|
63
|
+
expect {
|
64
|
+
pastel.unknown.on_red('unicorn')
|
65
|
+
}.to raise_error(Pastel::InvalidAttributeNameError)
|
66
|
+
end
|
67
|
+
|
47
68
|
it "raises error when doesn't recognize color" do
|
48
69
|
expect {
|
49
|
-
pastel.
|
70
|
+
pastel.unknown('unicorn')
|
50
71
|
}.to raise_error(Pastel::InvalidAttributeNameError)
|
51
72
|
end
|
52
73
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pastel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.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-
|
11
|
+
date: 2014-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: equatable
|
@@ -56,7 +56,9 @@ files:
|
|
56
56
|
- README.md
|
57
57
|
- Rakefile
|
58
58
|
- assets/screenshot.png
|
59
|
+
- benchmarks/speed.rb
|
59
60
|
- lib/pastel.rb
|
61
|
+
- lib/pastel/alias_importer.rb
|
60
62
|
- lib/pastel/ansi.rb
|
61
63
|
- lib/pastel/color.rb
|
62
64
|
- lib/pastel/color_resolver.rb
|
@@ -65,6 +67,9 @@ files:
|
|
65
67
|
- lib/pastel/version.rb
|
66
68
|
- pastel.gemspec
|
67
69
|
- spec/spec_helper.rb
|
70
|
+
- spec/unit/alias_color_spec.rb
|
71
|
+
- spec/unit/alias_importer_spec.rb
|
72
|
+
- spec/unit/color/alias_color_spec.rb
|
68
73
|
- spec/unit/color/code_spec.rb
|
69
74
|
- spec/unit/color/decorate_spec.rb
|
70
75
|
- spec/unit/color/strip_spec.rb
|
@@ -102,6 +107,9 @@ specification_version: 4
|
|
102
107
|
summary: Terminal strings styling with intuitive and clean API.
|
103
108
|
test_files:
|
104
109
|
- spec/spec_helper.rb
|
110
|
+
- spec/unit/alias_color_spec.rb
|
111
|
+
- spec/unit/alias_importer_spec.rb
|
112
|
+
- spec/unit/color/alias_color_spec.rb
|
105
113
|
- spec/unit/color/code_spec.rb
|
106
114
|
- spec/unit/color/decorate_spec.rb
|
107
115
|
- spec/unit/color/strip_spec.rb
|