sai 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -1
- data/README.md +2 -2
- data/docs/USAGE.md +14 -0
- data/lib/sai/decorator/delegation.rb +1 -0
- data/lib/sai/decorator/named_colors.rb +18 -6
- data/lib/sai/named_colors.rb +110 -25
- data/lib/sai.rb +22 -0
- data/sig/sai/decorator/named_colors.rbs +13 -0
- data/sig/sai/named_colors.rbs +62 -0
- data/sig/sai.rbs +20 -0
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '091a65a91b7e31cfea072bfad910f4af966edf3370301aa1bfbad8e6292d8e25'
|
4
|
+
data.tar.gz: 2296a5bb8b8b8d4c713b91afdbd777d7e69b16dd3550683d8a799dc6ac9c434d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 548ca06d57fe14768900f6d04191b52d876c38a9c5cca96b26da9d2c8afc3b7dffdd44b9d075b92bda97d1d80e2b6b75d3d8782c3e592d1a4547dfc72dceba1f
|
7
|
+
data.tar.gz: 48d9f58551111cd95a61c7c11ba2e83506239bf7e4805c93a3c38c653f28dfb94680637f35cf4a0325702ad4fe320f32060d794b26be2c308dd0b216f9cfbf64
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,13 @@ The format is based on [Keep a Changelog], and this project adheres to [Break Ve
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.3.2] - 2025-01-22
|
10
|
+
|
11
|
+
### Added
|
12
|
+
|
13
|
+
* [#15](https://github.com/aaronmallen/sai/pull/15) - Add support for registering custom named colors by
|
14
|
+
[@aaronmallen](https://github.com/aaronmallen)
|
15
|
+
|
9
16
|
## [0.3.1] - 2025-01-22
|
10
17
|
|
11
18
|
### Added
|
@@ -64,7 +71,8 @@ The format is based on [Keep a Changelog], and this project adheres to [Break Ve
|
|
64
71
|
|
65
72
|
<!-- versions -->
|
66
73
|
|
67
|
-
[Unreleased]: https://github.com/aaronmallen/sai/compare/0.3.
|
74
|
+
[Unreleased]: https://github.com/aaronmallen/sai/compare/0.3.2..HEAD
|
75
|
+
[0.3.2]: https://github.com/aaronmallen/sai/compare/0.3.1..0.3.2
|
68
76
|
[0.3.1]: https://github.com/aaronmallen/sai/compare/0.3.0..0.3.1
|
69
77
|
[0.3.0]: https://github.com/aaronmallen/sai/compare/0.2.0..0.3.0
|
70
78
|
[0.2.0]: https://github.com/aaronmallen/sai/compare/0.1.0..0.2.0
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
[](https://app.codacy.com/gh/aaronmallen/sai)
|
5
5
|
[](https://app.codacy.com/gh/aaronmallen/sai/coverage)
|
6
6
|
[](./LICENSE)
|
7
|
-
[](https://rubydoc.info/gems/sai/0.3.
|
7
|
+
[](https://rubydoc.info/gems/sai/0.3.2)
|
8
8
|
[](https://github.com/aaronmallen/sai/issues?q=state%3Aopen%20)
|
9
9
|
|
10
10
|
An elegant color management system for crafting sophisticated CLI applications
|
@@ -88,7 +88,7 @@ puts text.stripped # Get plain text
|
|
88
88
|
## Documentation
|
89
89
|
|
90
90
|
* [Complete Usage Guide](docs/USAGE.md) - Comprehensive documentation of all features
|
91
|
-
* [API Documentation](https://rubydoc.info/gems/sai/0.3.
|
91
|
+
* [API Documentation](https://rubydoc.info/gems/sai/0.3.2) - Detailed API reference
|
92
92
|
|
93
93
|
## Contributing
|
94
94
|
|
data/docs/USAGE.md
CHANGED
@@ -107,6 +107,20 @@ For a complete list of available colors, see:
|
|
107
107
|
* [Online Color Reference](https://github.com/aaronmallen/sai/blob/main/docs/AVAILABLE_NAMED_COLORS.md)
|
108
108
|
* `Sai::NamedColors.names` in your code
|
109
109
|
|
110
|
+
#### Registering Custom Named Colors
|
111
|
+
|
112
|
+
Sai allows you to register custom named colors for easy reuse with `Sai.register`:
|
113
|
+
|
114
|
+
```ruby
|
115
|
+
# Register custom colors
|
116
|
+
Sai.register(:my_color, '#CF4C5F')
|
117
|
+
|
118
|
+
# or alternatively
|
119
|
+
Sai.register(:my_color, [207, 76, 95])
|
120
|
+
|
121
|
+
Sai.my_color.decorate('Hello, world!')
|
122
|
+
```
|
123
|
+
|
110
124
|
### Color Manipulation
|
111
125
|
|
112
126
|
Adjust the brightness of colors:
|
@@ -52,6 +52,7 @@ module Sai
|
|
52
52
|
methods = collect_delegatable_methods.reject { |m| ignored_methods.include?(m) }
|
53
53
|
|
54
54
|
methods.each do |method|
|
55
|
+
klass.undef_method(method) if klass.method_defined?(method)
|
55
56
|
klass.define_method(method) do |*args, **kwargs|
|
56
57
|
Decorator.new(mode: Sai.mode.auto).public_send(method, *args, **kwargs)
|
57
58
|
end
|
@@ -749,15 +749,27 @@ module Sai
|
|
749
749
|
# def yellow_green: () -> Decorator
|
750
750
|
# def yellow_system: () -> Decorator
|
751
751
|
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
752
|
+
# Install a color method on the {Decorator} class
|
753
|
+
#
|
754
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
755
|
+
# @since 0.3.2
|
756
|
+
#
|
757
|
+
# @api private
|
758
|
+
#
|
759
|
+
# @param color_name [Symbol] the name of the color to install
|
760
|
+
#
|
761
|
+
# @return [void]
|
762
|
+
# @rbs (Symbol color_name) -> void
|
763
|
+
def self.install(color_name)
|
764
|
+
{ color_name => :foreground, :"on_#{color_name}" => :background }.each do |method_name, style_type|
|
765
|
+
# @type var style_type: Sai::Conversion::ColorSequence::style_type
|
766
|
+
Sai::Decorator.undef_method(method_name) if Sai::Decorator.method_defined?(method_name)
|
767
|
+
Sai::Decorator.define_method(method_name) { apply_named_color(style_type, color_name) }
|
758
768
|
end
|
759
769
|
end
|
760
770
|
|
771
|
+
Sai::NamedColors.names.each { |color| Sai::Decorator::NamedColors.install(color) }
|
772
|
+
|
761
773
|
private
|
762
774
|
|
763
775
|
# Apply a named color to the specified style type
|
data/lib/sai/named_colors.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'sai/conversion/rgb'
|
4
|
+
|
3
5
|
module Sai
|
4
6
|
# A collection of named colors and their RGB values
|
5
7
|
#
|
@@ -406,32 +408,115 @@ module Sai
|
|
406
408
|
}.freeze #: Hash[Symbol, Array[Integer]]
|
407
409
|
# rubocop:enable Naming/VariableNumber
|
408
410
|
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
411
|
+
class << self
|
412
|
+
# Look up an RGB value by color name
|
413
|
+
#
|
414
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
415
|
+
# @since 0.3.1
|
416
|
+
#
|
417
|
+
# @api private
|
418
|
+
#
|
419
|
+
# @param name [String, Symbol] the color name
|
420
|
+
#
|
421
|
+
# @return [Array<Integer>] the RGB value
|
422
|
+
# @rbs (String | Symbol name) -> Array[Integer]?
|
423
|
+
def [](name)
|
424
|
+
registry[name.to_sym]
|
425
|
+
end
|
424
426
|
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
427
|
+
# Get a list of all color names
|
428
|
+
#
|
429
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
430
|
+
# @since 0.3.1
|
431
|
+
#
|
432
|
+
# @api private
|
433
|
+
#
|
434
|
+
# @return [Array<Symbol>] the color names
|
435
|
+
def names
|
436
|
+
@names ||= registry.keys.uniq.sort
|
437
|
+
end
|
438
|
+
|
439
|
+
# Register a named color with an RGB or Hexadecimal value
|
440
|
+
#
|
441
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
442
|
+
# @since 0.3.2
|
443
|
+
#
|
444
|
+
# @api private
|
445
|
+
#
|
446
|
+
# @param name [String, Symbol] the name of the color being registered
|
447
|
+
# @param rgb_or_hex [Array<Integer>, String] the RGB or Hexadecimal value of the color
|
448
|
+
#
|
449
|
+
# @return [Boolean] `true` if the color was registered
|
450
|
+
# @rbs (String | Symbol name, Array[Integer] | String rgb_or_hex) -> void
|
451
|
+
def register(name, rgb_or_hex)
|
452
|
+
key = name.to_s.downcase.to_sym
|
453
|
+
provision_color(key, rgb_or_hex)
|
454
|
+
install_color(key)
|
455
|
+
true
|
456
|
+
end
|
457
|
+
|
458
|
+
private
|
459
|
+
|
460
|
+
# Install the color methods onto {Sai} and {Sai::Decorator}
|
461
|
+
#
|
462
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
463
|
+
# @since 0.3.2
|
464
|
+
#
|
465
|
+
# @api private
|
466
|
+
#
|
467
|
+
# @param name [Symbol] the name of the color to install
|
468
|
+
#
|
469
|
+
# @return [void]
|
470
|
+
# @rbs (Symbol name) -> void
|
471
|
+
def install_color(name)
|
472
|
+
Sai::Decorator::NamedColors.install(name)
|
473
|
+
Sai::Decorator::Delegation.install(Sai)
|
474
|
+
end
|
475
|
+
|
476
|
+
# Provision a color for the registry
|
477
|
+
#
|
478
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
479
|
+
# @since 0.3.2
|
480
|
+
#
|
481
|
+
# @api private
|
482
|
+
#
|
483
|
+
# @param name [Symbol] the name of the color to register
|
484
|
+
# @param rgb_or_hex [Array<Integer>, String] the RGB or Hexadecimal value of the color
|
485
|
+
#
|
486
|
+
# @return [void]
|
487
|
+
# @rbs (Symbol name, Array[Integer] | String rgb_or_hex) -> void
|
488
|
+
def provision_color(name, rgb_or_hex)
|
489
|
+
rgb = Conversion::RGB.resolve(rgb_or_hex)
|
490
|
+
registry[name] = rgb
|
491
|
+
@names = nil
|
492
|
+
end
|
493
|
+
|
494
|
+
# The Sai named colors registry
|
495
|
+
#
|
496
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
497
|
+
# @since 0.3.2
|
498
|
+
#
|
499
|
+
# @api private
|
500
|
+
#
|
501
|
+
# @return [Hash{Symbol => Array<Integer>}] the named colors registry
|
502
|
+
def registry
|
503
|
+
thread_lock.synchronize do
|
504
|
+
@registry ||= CSS.merge(XTERM).merge(ANSI)
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
508
|
+
# A Mutex for thread safety
|
509
|
+
#
|
510
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
511
|
+
# @since 0.3.2
|
512
|
+
#
|
513
|
+
# @api private
|
514
|
+
#
|
515
|
+
# @return [Mutex] the thread lock
|
516
|
+
# @rbs () -> Mutex
|
517
|
+
def thread_lock
|
518
|
+
@thread_lock ||= Mutex.new
|
519
|
+
end
|
435
520
|
end
|
436
521
|
end
|
437
522
|
end
|
data/lib/sai.rb
CHANGED
@@ -833,6 +833,28 @@ module Sai
|
|
833
833
|
ModeSelector
|
834
834
|
end
|
835
835
|
|
836
|
+
# Register a custom name and color
|
837
|
+
#
|
838
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
839
|
+
# @since 0.3.2
|
840
|
+
#
|
841
|
+
# @api public
|
842
|
+
#
|
843
|
+
# @example Register a color
|
844
|
+
# Sai.register(:my_color, '#CF4C5F')
|
845
|
+
# Sai.register(:my_color, [207, 76, 95])
|
846
|
+
#
|
847
|
+
# Sai.my_color.decorate('Hello, world!').to_s #=> "\e[38;2;207;76;95mHello, world!\e[0m"
|
848
|
+
#
|
849
|
+
# @param name [String, Symbol] the name of the color to register
|
850
|
+
# @param rgb_or_hex [Array<Integer>, String] the RGB values or hex code to register
|
851
|
+
#
|
852
|
+
# @return [void]
|
853
|
+
# @rbs (String | Symbol name, Array[Integer] | String rgb_or_hex) -> void
|
854
|
+
def register(name, rgb_or_hex)
|
855
|
+
NamedColors.register(name, rgb_or_hex)
|
856
|
+
end
|
857
|
+
|
836
858
|
# Sequence a string with ANSI escape codes
|
837
859
|
#
|
838
860
|
# @author {https://aaronmallen.me Aaron Allen}
|
@@ -1471,6 +1471,19 @@ module Sai
|
|
1471
1471
|
|
1472
1472
|
def yellow_system: () -> Decorator
|
1473
1473
|
|
1474
|
+
# Install a color method on the {Decorator} class
|
1475
|
+
#
|
1476
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
1477
|
+
# @since 0.3.2
|
1478
|
+
#
|
1479
|
+
# @api private
|
1480
|
+
#
|
1481
|
+
# @param color_name [Symbol] the name of the color to install
|
1482
|
+
#
|
1483
|
+
# @return [void]
|
1484
|
+
# @rbs (Symbol color_name) -> void
|
1485
|
+
def self.install: (Symbol color_name) -> void
|
1486
|
+
|
1474
1487
|
private
|
1475
1488
|
|
1476
1489
|
# Apply a named color to the specified style type
|
data/sig/sai/named_colors.rbs
CHANGED
@@ -61,5 +61,67 @@ module Sai
|
|
61
61
|
#
|
62
62
|
# @return [Array<Symbol>] the color names
|
63
63
|
def self.names: () -> untyped
|
64
|
+
|
65
|
+
# Register a named color with an RGB or Hexadecimal value
|
66
|
+
#
|
67
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
68
|
+
# @since 0.3.2
|
69
|
+
#
|
70
|
+
# @api private
|
71
|
+
#
|
72
|
+
# @param name [String, Symbol] the name of the color being registered
|
73
|
+
# @param rgb_or_hex [Array<Integer>, String] the RGB or Hexadecimal value of the color
|
74
|
+
#
|
75
|
+
# @return [Boolean] `true` if the color was registered
|
76
|
+
# @rbs (String | Symbol name, Array[Integer] | String rgb_or_hex) -> void
|
77
|
+
def self.register: (String | Symbol name, Array[Integer] | String rgb_or_hex) -> void
|
78
|
+
|
79
|
+
# Install the color methods onto {Sai} and {Sai::Decorator}
|
80
|
+
#
|
81
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
82
|
+
# @since 0.3.2
|
83
|
+
#
|
84
|
+
# @api private
|
85
|
+
#
|
86
|
+
# @param name [Symbol] the name of the color to install
|
87
|
+
#
|
88
|
+
# @return [void]
|
89
|
+
# @rbs (Symbol name) -> void
|
90
|
+
private def self.install_color: (Symbol name) -> void
|
91
|
+
|
92
|
+
# Provision a color for the registry
|
93
|
+
#
|
94
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
95
|
+
# @since 0.3.2
|
96
|
+
#
|
97
|
+
# @api private
|
98
|
+
#
|
99
|
+
# @param name [Symbol] the name of the color to register
|
100
|
+
# @param rgb_or_hex [Array<Integer>, String] the RGB or Hexadecimal value of the color
|
101
|
+
#
|
102
|
+
# @return [void]
|
103
|
+
# @rbs (Symbol name, Array[Integer] | String rgb_or_hex) -> void
|
104
|
+
private def self.provision_color: (Symbol name, Array[Integer] | String rgb_or_hex) -> void
|
105
|
+
|
106
|
+
# The Sai named colors registry
|
107
|
+
#
|
108
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
109
|
+
# @since 0.3.2
|
110
|
+
#
|
111
|
+
# @api private
|
112
|
+
#
|
113
|
+
# @return [Hash{Symbol => Array<Integer>}] the named colors registry
|
114
|
+
private def self.registry: () -> untyped
|
115
|
+
|
116
|
+
# A Mutex for thread safety
|
117
|
+
#
|
118
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
119
|
+
# @since 0.3.2
|
120
|
+
#
|
121
|
+
# @api private
|
122
|
+
#
|
123
|
+
# @return [Mutex] the thread lock
|
124
|
+
# @rbs () -> Mutex
|
125
|
+
private def self.thread_lock: () -> Mutex
|
64
126
|
end
|
65
127
|
end
|
data/sig/sai.rbs
CHANGED
@@ -1574,6 +1574,26 @@ module Sai
|
|
1574
1574
|
# @rbs () -> singleton(ModeSelector)
|
1575
1575
|
def self.mode: () -> singleton(ModeSelector)
|
1576
1576
|
|
1577
|
+
# Register a custom name and color
|
1578
|
+
#
|
1579
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
1580
|
+
# @since 0.3.2
|
1581
|
+
#
|
1582
|
+
# @api public
|
1583
|
+
#
|
1584
|
+
# @example Register a color
|
1585
|
+
# Sai.register(:my_color, '#CF4C5F')
|
1586
|
+
# Sai.register(:my_color, [207, 76, 95])
|
1587
|
+
#
|
1588
|
+
# Sai.my_color.decorate('Hello, world!').to_s #=> "\e[38;2;207;76;95mHello, world!\e[0m"
|
1589
|
+
#
|
1590
|
+
# @param name [String, Symbol] the name of the color to register
|
1591
|
+
# @param rgb_or_hex [Array<Integer>, String] the RGB values or hex code to register
|
1592
|
+
#
|
1593
|
+
# @return [void]
|
1594
|
+
# @rbs (String | Symbol name, Array[Integer] | String rgb_or_hex) -> void
|
1595
|
+
def self.register: (String | Symbol name, Array[Integer] | String rgb_or_hex) -> void
|
1596
|
+
|
1577
1597
|
# Sequence a string with ANSI escape codes
|
1578
1598
|
#
|
1579
1599
|
# @author {https://aaronmallen.me Aaron Allen}
|
metadata
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Allen
|
8
|
+
autorequire:
|
8
9
|
bindir: bin
|
9
10
|
cert_chain: []
|
10
11
|
date: 2025-01-22 00:00:00.000000000 Z
|
@@ -79,10 +80,11 @@ licenses:
|
|
79
80
|
- MIT
|
80
81
|
metadata:
|
81
82
|
bug_tracker_uri: https://github.com/aaronmallen/sai/issues
|
82
|
-
changelog_uri: https://github.com/aaronmallen/sai/releases/tag/0.3.
|
83
|
+
changelog_uri: https://github.com/aaronmallen/sai/releases/tag/0.3.2
|
83
84
|
homepage_uri: https://github.com/aaronmallen/sai
|
84
85
|
rubygems_mfa_required: 'true'
|
85
|
-
source_code_uri: https://github.com/aaronmallen/sai/tree/0.3.
|
86
|
+
source_code_uri: https://github.com/aaronmallen/sai/tree/0.3.2
|
87
|
+
post_install_message:
|
86
88
|
rdoc_options: []
|
87
89
|
require_paths:
|
88
90
|
- lib
|
@@ -97,7 +99,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
99
|
- !ruby/object:Gem::Version
|
98
100
|
version: '0'
|
99
101
|
requirements: []
|
100
|
-
rubygems_version: 3.
|
102
|
+
rubygems_version: 3.3.27
|
103
|
+
signing_key:
|
101
104
|
specification_version: 4
|
102
105
|
summary: An elegant color management system for crafting sophisticated CLI applications
|
103
106
|
test_files: []
|