sai 0.3.1 → 0.4.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.
data/lib/sai/decorator.rb CHANGED
@@ -23,11 +23,10 @@ module Sai
23
23
  # @note For each named color, two methods are dynamically generated:
24
24
  # * color_name - Applies the color to the foreground
25
25
  # * on_color_name - Applies the color to the backgroundAll color methods return {Decorator}
26
- # @see Sai::NamedColors Sai::NamedColors for available color names
27
26
  #
28
27
  # @example Using a named color
29
- # decorator.azure.decorate('Hello') #=> "\e[38;2;0;127;255mHello\e[0m"
30
- # decorator.on_azure.decorate('Hello') #=> "\e[48;2;0;127;255mHello\e[0m"
28
+ # decorator.blue.decorate('Hello').to_s #=> "\e[38;2;0;0;238mHello\e[0m"
29
+ # decorator.on_blue.decorate('Hello').to_s #=> "\e[48;2;0;0;238mHello\e[0m"
31
30
  class Decorator
32
31
  include ColorManipulations
33
32
  include Gradients
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sai
4
+ # The named color registry
5
+ #
6
+ # @author {https://aaronmallen.me Aaron Allen}
7
+ # @since 0.4.0
8
+ #
9
+ # @api private
10
+ module Registry
11
+ class << self
12
+ # Look up an RGB value by color name
13
+ #
14
+ # @author {https://aaronmallen.me Aaron Allen}
15
+ # @since 0.3.1
16
+ #
17
+ # @api private
18
+ #
19
+ # @param name [String, Symbol] the color name
20
+ #
21
+ # @return [Array<Integer>] the RGB value
22
+ # @rbs (String | Symbol name) -> Array[Integer]?
23
+ def [](name)
24
+ lookup[name.to_sym]
25
+ end
26
+
27
+ # Get a list of all color names
28
+ #
29
+ # @author {https://aaronmallen.me Aaron Allen}
30
+ # @since 0.3.1
31
+ #
32
+ # @api private
33
+ #
34
+ # @return [Array<Symbol>] the color names
35
+ def names
36
+ @names ||= lookup.keys.uniq.sort
37
+ end
38
+
39
+ # Register a named color with an RGB or Hexadecimal value
40
+ #
41
+ # @author {https://aaronmallen.me Aaron Allen}
42
+ # @since 0.4.0
43
+ #
44
+ # @api private
45
+ #
46
+ # @param name [String, Symbol] the name of the color being registered
47
+ # @param rgb_or_hex [Array<Integer>, String] the RGB or Hexadecimal value of the color
48
+ #
49
+ # @return [Boolean] `true` if the color was registered
50
+ # @rbs (String | Symbol name, Array[Integer] | String rgb_or_hex) -> void
51
+ def register(name, rgb_or_hex)
52
+ key = name.to_s.downcase.to_sym
53
+ rgb = Conversion::RGB.resolve(rgb_or_hex)
54
+ thread_lock.synchronize { lookup[key] = rgb }
55
+ broadcast_registration(key)
56
+ true
57
+ end
58
+
59
+ # Subscribe to registry changes
60
+ #
61
+ # @author {https://aaronmallen.me Aaron Allen}
62
+ # @since 0.4.0
63
+ #
64
+ # @api private
65
+ #
66
+ # @param subscriber [Object] the subscriber
67
+ #
68
+ # @return [void]
69
+ # @rbs (Object subscriber) -> void
70
+ def subscribe(subscriber)
71
+ thread_lock.synchronize { subscribers << subscriber }
72
+ end
73
+
74
+ private
75
+
76
+ # Broadcast a color registration to all subscribers
77
+ #
78
+ # @author {https://aaronmallen.me Aaron Allen}
79
+ # @since 0.4.0
80
+ #
81
+ # @api private
82
+ #
83
+ # @param color_name [Symbol] the color name
84
+ #
85
+ # @return [void]
86
+ # @rbs (Symbol name) -> void
87
+ def broadcast_registration(color_name)
88
+ subscribers.each do |subscriber|
89
+ next unless subscriber.respond_to?(:on_color_registration, true)
90
+
91
+ subscriber.send(:on_color_registration, color_name)
92
+ end
93
+ end
94
+
95
+ # The Sai named colors lookup
96
+ #
97
+ # @author {https://aaronmallen.me Aaron Allen}
98
+ # @since 0.4.0
99
+ #
100
+ # @api private
101
+ #
102
+ # @return [Hash{Symbol => Array<Integer>}] the named colors lookup
103
+ def lookup
104
+ @lookup ||= {}
105
+ end
106
+
107
+ # The registry subscribers
108
+ #
109
+ # @author {https://aaronmallen.me Aaron Allen}
110
+ # @since 0.4.0
111
+ #
112
+ # @api private
113
+ #
114
+ # @return [Array<Class, Module, Object>] the subscribers
115
+ # @rbs () -> Array[Class | Module | Object]
116
+ def subscribers
117
+ @subscribers ||= []
118
+ end
119
+
120
+ # A Mutex for thread safety
121
+ #
122
+ # @author {https://aaronmallen.me Aaron Allen}
123
+ # @since 0.4.0
124
+ #
125
+ # @api private
126
+ #
127
+ # @return [Mutex] the thread lock
128
+ # @rbs () -> Mutex
129
+ def thread_lock
130
+ @thread_lock ||= Mutex.new
131
+ end
132
+ end
133
+ end
134
+ end