gloo 3.3.0 → 3.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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/gloo.gemspec +8 -3
  4. data/lib/VERSION +1 -1
  5. data/lib/VERSION_NOTES +7 -0
  6. data/lib/gloo/app/engine.rb +1 -1
  7. data/lib/gloo/app/log.rb +15 -16
  8. data/lib/gloo/app/platform.rb +11 -90
  9. data/lib/gloo/app/prompt.rb +90 -0
  10. data/lib/gloo/app/table.rb +51 -0
  11. data/lib/gloo/core/gloo_system.rb +7 -14
  12. data/lib/gloo/objs/basic/container.rb +1 -2
  13. data/lib/gloo/objs/basic/integer.rb +23 -1
  14. data/lib/gloo/objs/basic/string.rb +116 -1
  15. data/lib/gloo/objs/basic/string_generator.rb +49 -0
  16. data/lib/gloo/objs/basic/text.rb +1 -17
  17. data/lib/gloo/objs/cli/menu.rb +5 -4
  18. data/lib/gloo/objs/cli/select.rb +3 -2
  19. data/lib/gloo/objs/data/markdown.rb +25 -30
  20. data/lib/gloo/objs/data/mysql.rb +39 -27
  21. data/lib/gloo/objs/data/pg.rb +1 -1
  22. data/lib/gloo/objs/data/query_result.rb +4 -9
  23. data/lib/gloo/objs/data/table.rb +1 -1
  24. data/lib/gloo/objs/security/cipher.rb +193 -0
  25. data/lib/gloo/objs/security/password.rb +167 -0
  26. data/lib/gloo/objs/system/file_handle.rb +1 -3
  27. data/lib/gloo/objs/web/json.rb +3 -0
  28. data/lib/gloo/objs/web_svr/page.rb +24 -8
  29. data/lib/gloo/objs/web_svr/partial.rb +7 -6
  30. data/lib/gloo/objs/web_svr/svr.rb +267 -14
  31. data/lib/gloo/verbs/version.rb +1 -1
  32. data/lib/gloo/web_svr/asset.rb +34 -13
  33. data/lib/gloo/web_svr/config.rb +1 -1
  34. data/lib/gloo/web_svr/embedded_renderer.rb +1 -1
  35. data/lib/gloo/web_svr/handler.rb +6 -4
  36. data/lib/gloo/web_svr/request.rb +34 -8
  37. data/lib/gloo/web_svr/response.rb +14 -2
  38. data/lib/gloo/web_svr/response_code.rb +1 -1
  39. data/lib/gloo/web_svr/routing/router.rb +1 -2
  40. data/lib/gloo/web_svr/routing/show_routes.rb +4 -7
  41. data/lib/gloo/web_svr/server.rb +1 -1
  42. data/lib/gloo/web_svr/session.rb +161 -0
  43. data/lib/gloo/web_svr/table_renderer.rb +1 -1
  44. metadata +58 -25
  45. data/lib/gloo/objs/cli/banner.rb +0 -118
  46. data/lib/gloo/objs/cli/bar.rb +0 -133
  47. data/lib/gloo/objs/cli/pastel.rb +0 -104
@@ -0,0 +1,161 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2024 Eric Crane. All rights reserved.
3
+ #
4
+ # Helpers for getting and setting session data.
5
+ #
6
+ # Resources:
7
+ # https://www.rubydoc.info/gems/rack/1.5.5/Rack/Request#cookies-instance_method
8
+ # https://rubydoc.info/github/rack/rack/Rack/Utils#set_cookie_header-class_method
9
+ # https://en.wikipedia.org/wiki/HTTP_cookie
10
+ #
11
+ require 'base64'
12
+
13
+ module Gloo
14
+ module WebSvr
15
+ class Session
16
+
17
+ SESSION_CONTAINER = 'session'.freeze
18
+
19
+
20
+ # ---------------------------------------------------------------------
21
+ # Initialization
22
+ # ---------------------------------------------------------------------
23
+
24
+ #
25
+ # Set up the web server.
26
+ #
27
+ def initialize( engine, server_obj )
28
+ @engine = engine
29
+ @log = @engine.log
30
+
31
+ @server_obj = server_obj
32
+ end
33
+
34
+
35
+ # ---------------------------------------------------------------------
36
+ # Set Session Data for Request
37
+ # ---------------------------------------------------------------------
38
+
39
+ #
40
+ # Get the session data from the encrypted cookie.
41
+ # Add it to the session container.
42
+ #
43
+ def set_session_data_for_request( env )
44
+ cookie_hash = Rack::Utils.parse_cookies( env )
45
+
46
+ # Are we using sessions?
47
+ if @server_obj.use_session?
48
+ data = cookie_hash[ session_name ]
49
+
50
+ if data
51
+ data = decode_decrypt( data )
52
+
53
+ data.each do |key, value|
54
+ @server_obj.set_session_var( key, value )
55
+ end
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+
62
+ # ---------------------------------------------------------------------
63
+ # Get Session Data for Response
64
+ # ---------------------------------------------------------------------
65
+
66
+ #
67
+ # If there is session data, encrypt and add it to the response.
68
+ # Once done, clear out the session data.
69
+ #
70
+ def add_session_for_response( headers )
71
+ # Are we using sessions?
72
+ if @server_obj.use_session?
73
+ # Build and add encrypted session data
74
+ data = @server_obj.get_session_data
75
+ unless data.empty?
76
+ data = encrypt_encode( data )
77
+ session_hash = {
78
+ value: data,
79
+ path: cookie_path,
80
+ expires: cookie_expires,
81
+ http_only: true }
82
+
83
+ if secure_cookie?
84
+ session_hash[ :secure ] = true
85
+ end
86
+
87
+ Rack::Utils.set_cookie_header!( headers, session_name, session_hash )
88
+ end
89
+
90
+ # Clear out session data
91
+ @server_obj.clear_session_data
92
+ end
93
+
94
+ return headers
95
+ end
96
+
97
+
98
+ # ---------------------------------------------------------------------
99
+ # Helper functions
100
+ # ---------------------------------------------------------------------
101
+
102
+ #
103
+ # Encrypt and encode the session data.
104
+ #
105
+ def encrypt_encode( data )
106
+ return Gloo::Objs::Cipher.encrypt( data.to_json, key, iv )
107
+ end
108
+
109
+ #
110
+ # Decode and decrypt the session data.
111
+ #
112
+ def decode_decrypt( data )
113
+ data = Gloo::Objs::Cipher.decrypt( data, key, iv )
114
+ return JSON.parse( data )
115
+ end
116
+
117
+ #
118
+ # Get the session cookie name.
119
+ #
120
+ def session_name
121
+ return @server_obj.session_name
122
+ end
123
+
124
+ #
125
+ # Get the key for the encryption cipher.
126
+ #
127
+ def key
128
+ return @server_obj.encryption_key
129
+ end
130
+
131
+ #
132
+ # Get the initialization vector for the cipher.
133
+ #
134
+ def iv
135
+ return @server_obj.encryption_iv
136
+ end
137
+
138
+ #
139
+ # Get the path for the session cookie.
140
+ #
141
+ def cookie_path
142
+ return @server_obj.session_cookie_path
143
+ end
144
+
145
+ #
146
+ # Get the expiration time for the session cookie.
147
+ #
148
+ def cookie_expires
149
+ return @server_obj.session_cookie_expires
150
+ end
151
+
152
+ #
153
+ # Should the session cookie be secure?
154
+ #
155
+ def secure_cookie?
156
+ return @server_obj.session_cookie_secure
157
+ end
158
+
159
+ end
160
+ end
161
+ end
@@ -1,5 +1,5 @@
1
1
  # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 20124 Eric Crane. All rights reserved.
2
+ # Copyright:: Copyright (c) 2024 Eric Crane. All rights reserved.
3
3
  #
4
4
  # A helper class used to render HTML tables.
5
5
  #
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gloo
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Crane
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-16 00:00:00.000000000 Z
11
+ date: 2024-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -110,40 +110,62 @@ dependencies:
110
110
  requirements:
111
111
  - - "~>"
112
112
  - !ruby/object:Gem::Version
113
- version: '0.8'
113
+ version: 1.1.0
114
114
  - - ">="
115
115
  - !ruby/object:Gem::Version
116
- version: 0.8.1
116
+ version: 1.1.0
117
117
  type: :runtime
118
118
  prerelease: false
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - "~>"
122
122
  - !ruby/object:Gem::Version
123
- version: '0.8'
123
+ version: 1.1.0
124
124
  - - ">="
125
125
  - !ruby/object:Gem::Version
126
- version: 0.8.1
126
+ version: 1.1.0
127
127
  - !ruby/object:Gem::Dependency
128
- name: tty
128
+ name: inquirer
129
129
  requirement: !ruby/object:Gem::Requirement
130
130
  requirements:
131
- - - "~>"
131
+ - - ">="
132
132
  - !ruby/object:Gem::Version
133
- version: '0.10'
133
+ version: '0'
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ - !ruby/object:Gem::Dependency
142
+ name: reline
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
134
145
  - - ">="
135
146
  - !ruby/object:Gem::Version
136
- version: 0.10.0
147
+ version: '0'
137
148
  type: :runtime
138
149
  prerelease: false
139
150
  version_requirements: !ruby/object:Gem::Requirement
140
151
  requirements:
141
- - - "~>"
152
+ - - ">="
142
153
  - !ruby/object:Gem::Version
143
- version: '0.10'
154
+ version: '0'
155
+ - !ruby/object:Gem::Dependency
156
+ name: terminal-table
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
144
159
  - - ">="
145
160
  - !ruby/object:Gem::Version
146
- version: 0.10.0
161
+ version: '0'
162
+ type: :runtime
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
147
169
  - !ruby/object:Gem::Dependency
148
170
  name: json
149
171
  requirement: !ruby/object:Gem::Requirement
@@ -168,22 +190,16 @@ dependencies:
168
190
  name: openssl
169
191
  requirement: !ruby/object:Gem::Requirement
170
192
  requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: '2.1'
174
193
  - - ">="
175
194
  - !ruby/object:Gem::Version
176
- version: 2.1.0
195
+ version: '0'
177
196
  type: :runtime
178
197
  prerelease: false
179
198
  version_requirements: !ruby/object:Gem::Requirement
180
199
  requirements:
181
- - - "~>"
182
- - !ruby/object:Gem::Version
183
- version: '2.1'
184
200
  - - ">="
185
201
  - !ruby/object:Gem::Version
186
- version: 2.1.0
202
+ version: '0'
187
203
  - !ruby/object:Gem::Dependency
188
204
  name: net-ssh
189
205
  requirement: !ruby/object:Gem::Requirement
@@ -306,6 +322,20 @@ dependencies:
306
322
  - - "~>"
307
323
  - !ruby/object:Gem::Version
308
324
  version: 3.6.0
325
+ - !ruby/object:Gem::Dependency
326
+ name: bcrypt
327
+ requirement: !ruby/object:Gem::Requirement
328
+ requirements:
329
+ - - "~>"
330
+ - !ruby/object:Gem::Version
331
+ version: 3.1.20
332
+ type: :runtime
333
+ prerelease: false
334
+ version_requirements: !ruby/object:Gem::Requirement
335
+ requirements:
336
+ - - "~>"
337
+ - !ruby/object:Gem::Version
338
+ version: 3.1.20
309
339
  description: A scripting languge to keep it all together.
310
340
  email:
311
341
  - eric.crane@mac.com
@@ -343,8 +373,10 @@ files:
343
373
  - lib/gloo/app/log.rb
344
374
  - lib/gloo/app/mode.rb
345
375
  - lib/gloo/app/platform.rb
376
+ - lib/gloo/app/prompt.rb
346
377
  - lib/gloo/app/running_app.rb
347
378
  - lib/gloo/app/settings.rb
379
+ - lib/gloo/app/table.rb
348
380
  - lib/gloo/convert/converter.rb
349
381
  - lib/gloo/convert/falseclass_to_integer.rb
350
382
  - lib/gloo/convert/nilclass_to_date.rb
@@ -397,15 +429,13 @@ files:
397
429
  - lib/gloo/objs/basic/integer.rb
398
430
  - lib/gloo/objs/basic/script.rb
399
431
  - lib/gloo/objs/basic/string.rb
432
+ - lib/gloo/objs/basic/string_generator.rb
400
433
  - lib/gloo/objs/basic/text.rb
401
434
  - lib/gloo/objs/basic/untyped.rb
402
- - lib/gloo/objs/cli/banner.rb
403
- - lib/gloo/objs/cli/bar.rb
404
435
  - lib/gloo/objs/cli/colorize.rb
405
436
  - lib/gloo/objs/cli/confirm.rb
406
437
  - lib/gloo/objs/cli/menu.rb
407
438
  - lib/gloo/objs/cli/menu_item.rb
408
- - lib/gloo/objs/cli/pastel.rb
409
439
  - lib/gloo/objs/cli/prompt.rb
410
440
  - lib/gloo/objs/cli/select.rb
411
441
  - lib/gloo/objs/ctrl/each.rb
@@ -426,6 +456,8 @@ files:
426
456
  - lib/gloo/objs/dt/time.rb
427
457
  - lib/gloo/objs/ror/erb.rb
428
458
  - lib/gloo/objs/ror/eval.rb
459
+ - lib/gloo/objs/security/cipher.rb
460
+ - lib/gloo/objs/security/password.rb
429
461
  - lib/gloo/objs/snd/play.rb
430
462
  - lib/gloo/objs/snd/say.rb
431
463
  - lib/gloo/objs/system/file_handle.rb
@@ -488,6 +520,7 @@ files:
488
520
  - lib/gloo/web_svr/routing/router.rb
489
521
  - lib/gloo/web_svr/routing/show_routes.rb
490
522
  - lib/gloo/web_svr/server.rb
523
+ - lib/gloo/web_svr/session.rb
491
524
  - lib/gloo/web_svr/table_renderer.rb
492
525
  - lib/gloo/web_svr/web_method.rb
493
526
  - lib/run.rb
@@ -510,7 +543,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
510
543
  - !ruby/object:Gem::Version
511
544
  version: '0'
512
545
  requirements: []
513
- rubygems_version: 3.2.22
546
+ rubygems_version: 3.4.19
514
547
  signing_key:
515
548
  specification_version: 4
516
549
  summary: Gloo scripting language. A scripting language built on ruby.
@@ -1,118 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # Show a large-text banner.
5
- #
6
- require 'tty-font'
7
- require 'pastel'
8
-
9
- module Gloo
10
- module Objs
11
- class Banner < Gloo::Core::Obj
12
-
13
- KEYWORD = 'banner'.freeze
14
- KEYWORD_SHORT = 'ban'.freeze
15
- TEXT = 'text'.freeze
16
- STYLE = 'style'.freeze
17
- COLOR = 'color'.freeze
18
-
19
- #
20
- # The name of the object type.
21
- #
22
- def self.typename
23
- return KEYWORD
24
- end
25
-
26
- #
27
- # The short name of the object type.
28
- #
29
- def self.short_typename
30
- return KEYWORD_SHORT
31
- end
32
-
33
- #
34
- # Get the banner text from the child object.
35
- #
36
- def text_value
37
- o = find_child TEXT
38
- return '' unless o
39
-
40
- return o.value
41
- end
42
-
43
- #
44
- # Get the banner style from the child object.
45
- #
46
- def style_value
47
- o = find_child STYLE
48
- return '' unless o
49
-
50
- return o.value
51
- end
52
-
53
- #
54
- # Get the banner color from the child object.
55
- #
56
- def color_value
57
- o = find_child COLOR
58
- return '' unless o
59
-
60
- return o.value
61
- end
62
-
63
- # ---------------------------------------------------------------------
64
- # Children
65
- # ---------------------------------------------------------------------
66
-
67
- # Does this object have children to add when an object
68
- # is created in interactive mode?
69
- # This does not apply during obj load, etc.
70
- def add_children_on_create?
71
- return true
72
- end
73
-
74
- # Add children to this object.
75
- # This is used by containers to add children needed
76
- # for default configurations.
77
- def add_default_children
78
- fac = @engine.factory
79
- fac.create_string TEXT, '', self
80
- fac.create_string STYLE, '', self
81
- fac.create_string COLOR, '', self
82
- end
83
-
84
- # ---------------------------------------------------------------------
85
- # Messages
86
- # ---------------------------------------------------------------------
87
-
88
- #
89
- # Get a list of message names that this object receives.
90
- #
91
- def self.messages
92
- return super + %w[show]
93
- end
94
-
95
- #
96
- # Show the banner bar
97
- #
98
- def msg_show
99
- Banner.show_banner( self.text_value, self.style_value, self.color_value )
100
- end
101
-
102
- #
103
- # Show the banner bar.
104
- # text - the text of the banner
105
- # style - the style of the banner
106
- # color - the color of the banner
107
- #
108
- def self.show_banner( text, style, color )
109
- font = TTY::Font.new style
110
- t = font.write( text )
111
- pastel = ::Pastel.new
112
- c = color.split( ' ' ).map( &:to_sym )
113
- puts pastel.decorate( t, *c )
114
- end
115
-
116
- end
117
- end
118
- end
@@ -1,133 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # Show a CLI progress bar.
5
- #
6
- require 'tty-progressbar'
7
-
8
- module Gloo
9
- module Objs
10
- class Bar < Gloo::Core::Obj
11
-
12
- KEYWORD = 'bar'.freeze
13
- KEYWORD_SHORT = 'bar'.freeze
14
- NAME = 'name'.freeze
15
- TOTAL = 'total'.freeze
16
-
17
- #
18
- # The name of the object type.
19
- #
20
- def self.typename
21
- return KEYWORD
22
- end
23
-
24
- #
25
- # The short name of the object type.
26
- #
27
- def self.short_typename
28
- return KEYWORD_SHORT
29
- end
30
-
31
- #
32
- # Get the bar's name from the child object.
33
- #
34
- def name_value
35
- o = find_child NAME
36
- return '' unless o
37
-
38
- return o.value
39
- end
40
-
41
- #
42
- # Get the bar's total from the child object.
43
- #
44
- def total_value
45
- o = find_child TOTAL
46
- return 100 unless o
47
-
48
- return o.value
49
- end
50
-
51
- # ---------------------------------------------------------------------
52
- # Children
53
- # ---------------------------------------------------------------------
54
-
55
- # Does this object have children to add when an object
56
- # is created in interactive mode?
57
- # This does not apply during obj load, etc.
58
- def add_children_on_create?
59
- return true
60
- end
61
-
62
- # Add children to this object.
63
- # This is used by containers to add children needed
64
- # for default configurations.
65
- def add_default_children
66
- fac = @engine.factory
67
- fac.create_string NAME, '', self
68
- fac.create_int TOTAL, 100, self
69
- end
70
-
71
- # ---------------------------------------------------------------------
72
- # Messages
73
- # ---------------------------------------------------------------------
74
-
75
- #
76
- # Get a list of message names that this object receives.
77
- #
78
- def self.messages
79
- return super + %w[start advance stop run]
80
- end
81
-
82
- #
83
- # Start the progress bar.
84
- #
85
- def msg_start
86
- msg = "#{name_value} [:bar] :percent"
87
- @bar = TTY::ProgressBar.new( msg, total: total_value )
88
- end
89
-
90
- #
91
- # Finish the progress bar.
92
- #
93
- def msg_stop
94
- @bar.finish
95
- end
96
-
97
- #
98
- # Advance the progress bar.
99
- #
100
- def msg_advance
101
- x = 1
102
- if @params&.token_count&.positive?
103
- expr = Gloo::Expr::Expression.new( @engine, @params.tokens )
104
- x = expr.evaluate.to_i
105
- end
106
-
107
- @bar.advance x
108
- end
109
-
110
- #
111
- # Run for the given number of seconds advancing
112
- # the bar to the end.
113
- #
114
- def msg_run
115
- msg_start
116
-
117
- x = 1
118
- if @params&.token_count&.positive?
119
- expr = Gloo::Expr::Expression.new( @engine, @params.tokens )
120
- x = expr.evaluate.to_i
121
- end
122
-
123
- 100.times do
124
- sleep ( 0.0 + x ) / 100.0
125
- @bar.advance 1
126
- end
127
-
128
- msg_stop
129
- end
130
-
131
- end
132
- end
133
- end
@@ -1,104 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # Show colorized output with the pastel gem.
5
- #
6
- require 'pastel'
7
-
8
- module Gloo
9
- module Objs
10
- class Pastel < Gloo::Core::Obj
11
-
12
- KEYWORD = 'pastel'.freeze
13
- KEYWORD_SHORT = 'pastel'.freeze
14
- TEXT = 'text'.freeze
15
- COLOR = 'color'.freeze
16
-
17
- #
18
- # The name of the object type.
19
- #
20
- def self.typename
21
- return KEYWORD
22
- end
23
-
24
- #
25
- # The short name of the object type.
26
- #
27
- def self.short_typename
28
- return KEYWORD_SHORT
29
- end
30
-
31
- #
32
- # Get the text from the child object.
33
- #
34
- def text_value
35
- o = find_child TEXT
36
- return '' unless o
37
-
38
- return o.value
39
- end
40
-
41
- #
42
- # Get the color from the child object.
43
- #
44
- def color_value
45
- o = find_child COLOR
46
- return '' unless o
47
-
48
- return o.value
49
- end
50
-
51
- # ---------------------------------------------------------------------
52
- # Children
53
- # ---------------------------------------------------------------------
54
-
55
- #
56
- # Does this object have children to add when an object
57
- # is created in interactive mode?
58
- # This does not apply during obj load, etc.
59
- #
60
- def add_children_on_create?
61
- return true
62
- end
63
-
64
- #
65
- # Add children to this object.
66
- # This is used by containers to add children needed
67
- # for default configurations.
68
- #
69
- def add_default_children
70
- fac = @engine.factory
71
- fac.create_string TEXT, '', self
72
- fac.create_string COLOR, '', self
73
- end
74
-
75
- # ---------------------------------------------------------------------
76
- # Messages
77
- # ---------------------------------------------------------------------
78
-
79
- #
80
- # Get a list of message names that this object receives.
81
- #
82
- def self.messages
83
- return super + %w[run show]
84
- end
85
-
86
- #
87
- # Alias to show the banner bar
88
- #
89
- def msg_run
90
- msg_show
91
- end
92
-
93
- #
94
- # Show the banner bar
95
- #
96
- def msg_show
97
- pastel = ::Pastel.new
98
- c = self.color_value.split( ' ' ).map( &:to_sym )
99
- puts pastel.decorate( self.text_value, *c )
100
- end
101
-
102
- end
103
- end
104
- end