gloo 0.8.0 → 1.0.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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/Gemfile.lock +32 -28
  4. data/LICENSE.txt +1 -1
  5. data/gloo.gemspec +11 -6
  6. data/lib/VERSION +1 -1
  7. data/lib/dependencies.rb +4 -4
  8. data/lib/gloo/app/info.rb +3 -1
  9. data/lib/gloo/app/log.rb +1 -29
  10. data/lib/gloo/app/platform.rb +142 -0
  11. data/lib/gloo/objs/cli/banner.rb +2 -2
  12. data/lib/gloo/objs/cli/bar.rb +4 -4
  13. data/lib/gloo/objs/cli/colorize.rb +3 -3
  14. data/lib/gloo/objs/cli/confirm.rb +3 -3
  15. data/lib/gloo/objs/cli/menu.rb +9 -9
  16. data/lib/gloo/objs/cli/menu_item.rb +2 -2
  17. data/lib/gloo/objs/cli/pastel.rb +2 -2
  18. data/lib/gloo/objs/cli/prompt.rb +4 -4
  19. data/lib/gloo/objs/cli/select.rb +4 -4
  20. data/lib/gloo/objs/dev/git.rb +7 -7
  21. data/lib/gloo/objs/dev/stats.rb +8 -5
  22. data/lib/gloo/objs/snd/play.rb +1 -1
  23. data/lib/gloo/objs/snd/say.rb +2 -2
  24. data/lib/gloo/objs/system/file_handle.rb +9 -9
  25. data/lib/gloo/objs/system/ssh_exec.rb +3 -3
  26. data/lib/gloo/objs/system/system.rb +2 -2
  27. data/lib/gloo/verbs/alert.rb +7 -7
  28. data/lib/gloo/verbs/beep.rb +1 -1
  29. data/lib/gloo/verbs/cls.rb +2 -2
  30. data/lib/gloo.rb +5 -1
  31. data/lib/run.rb +5 -1
  32. metadata +39 -145
  33. data/lib/gloo/app/args.rb +0 -112
  34. data/lib/gloo/app/engine.rb +0 -230
  35. data/lib/gloo/app/help.rb +0 -156
  36. data/lib/gloo/app/mode.rb +0 -27
  37. data/lib/gloo/app/settings.rb +0 -186
  38. data/lib/gloo/convert/converter.rb +0 -35
  39. data/lib/gloo/convert/string_to_datetime.rb +0 -21
  40. data/lib/gloo/convert/string_to_decimal.rb +0 -20
  41. data/lib/gloo/convert/string_to_integer.rb +0 -20
  42. data/lib/gloo/core/baseo.rb +0 -30
  43. data/lib/gloo/core/dictionary.rb +0 -181
  44. data/lib/gloo/core/error.rb +0 -61
  45. data/lib/gloo/core/event_manager.rb +0 -44
  46. data/lib/gloo/core/factory.rb +0 -210
  47. data/lib/gloo/core/gloo_system.rb +0 -266
  48. data/lib/gloo/core/heap.rb +0 -52
  49. data/lib/gloo/core/here.rb +0 -36
  50. data/lib/gloo/core/it.rb +0 -36
  51. data/lib/gloo/core/literal.rb +0 -30
  52. data/lib/gloo/core/obj.rb +0 -303
  53. data/lib/gloo/core/obj_finder.rb +0 -30
  54. data/lib/gloo/core/op.rb +0 -40
  55. data/lib/gloo/core/parser.rb +0 -59
  56. data/lib/gloo/core/pn.rb +0 -188
  57. data/lib/gloo/core/tokens.rb +0 -165
  58. data/lib/gloo/core/verb.rb +0 -86
  59. data/lib/gloo/exec/action.rb +0 -48
  60. data/lib/gloo/exec/dispatch.rb +0 -40
  61. data/lib/gloo/exec/exec_env.rb +0 -74
  62. data/lib/gloo/exec/runner.rb +0 -45
  63. data/lib/gloo/exec/script.rb +0 -49
  64. data/lib/gloo/exec/stack.rb +0 -78
  65. data/lib/gloo/expr/expression.rb +0 -118
  66. data/lib/gloo/expr/l_boolean.rb +0 -36
  67. data/lib/gloo/expr/l_decimal.rb +0 -39
  68. data/lib/gloo/expr/l_integer.rb +0 -37
  69. data/lib/gloo/expr/l_string.rb +0 -58
  70. data/lib/gloo/expr/op_div.rb +0 -22
  71. data/lib/gloo/expr/op_minus.rb +0 -22
  72. data/lib/gloo/expr/op_mult.rb +0 -22
  73. data/lib/gloo/expr/op_plus.rb +0 -24
  74. data/lib/gloo/objs/basic/alias.rb +0 -78
  75. data/lib/gloo/objs/basic/boolean.rb +0 -120
  76. data/lib/gloo/objs/basic/container.rb +0 -76
  77. data/lib/gloo/objs/basic/decimal.rb +0 -76
  78. data/lib/gloo/objs/basic/integer.rb +0 -73
  79. data/lib/gloo/objs/basic/script.rb +0 -99
  80. data/lib/gloo/objs/basic/string.rb +0 -77
  81. data/lib/gloo/objs/basic/text.rb +0 -87
  82. data/lib/gloo/objs/basic/untyped.rb +0 -41
  83. data/lib/gloo/objs/ctrl/each.rb +0 -279
  84. data/lib/gloo/objs/ctrl/repeat.rb +0 -108
  85. data/lib/gloo/objs/data/markdown.rb +0 -84
  86. data/lib/gloo/objs/data/mysql.rb +0 -192
  87. data/lib/gloo/objs/data/query.rb +0 -176
  88. data/lib/gloo/objs/data/sqlite.rb +0 -159
  89. data/lib/gloo/objs/data/table.rb +0 -140
  90. data/lib/gloo/objs/dt/date.rb +0 -50
  91. data/lib/gloo/objs/dt/datetime.rb +0 -62
  92. data/lib/gloo/objs/dt/time.rb +0 -50
  93. data/lib/gloo/objs/ror/erb.rb +0 -116
  94. data/lib/gloo/objs/ror/eval.rb +0 -107
  95. data/lib/gloo/objs/web/http_get.rb +0 -159
  96. data/lib/gloo/objs/web/http_post.rb +0 -183
  97. data/lib/gloo/objs/web/json.rb +0 -135
  98. data/lib/gloo/objs/web/slack.rb +0 -130
  99. data/lib/gloo/objs/web/teams.rb +0 -117
  100. data/lib/gloo/objs/web/uri.rb +0 -148
  101. data/lib/gloo/persist/file_loader.rb +0 -191
  102. data/lib/gloo/persist/file_saver.rb +0 -49
  103. data/lib/gloo/persist/file_storage.rb +0 -45
  104. data/lib/gloo/persist/line_splitter.rb +0 -81
  105. data/lib/gloo/persist/persist_man.rb +0 -120
  106. data/lib/gloo/utils/format.rb +0 -21
  107. data/lib/gloo/utils/stats.rb +0 -205
  108. data/lib/gloo/utils/words.rb +0 -19
  109. data/lib/gloo/verbs/context.rb +0 -62
  110. data/lib/gloo/verbs/create.rb +0 -68
  111. data/lib/gloo/verbs/execute.rb +0 -56
  112. data/lib/gloo/verbs/help.rb +0 -264
  113. data/lib/gloo/verbs/if.rb +0 -92
  114. data/lib/gloo/verbs/list.rb +0 -98
  115. data/lib/gloo/verbs/load.rb +0 -45
  116. data/lib/gloo/verbs/move.rb +0 -89
  117. data/lib/gloo/verbs/put.rb +0 -94
  118. data/lib/gloo/verbs/quit.rb +0 -40
  119. data/lib/gloo/verbs/run.rb +0 -75
  120. data/lib/gloo/verbs/save.rb +0 -39
  121. data/lib/gloo/verbs/show.rb +0 -64
  122. data/lib/gloo/verbs/tell.rb +0 -79
  123. data/lib/gloo/verbs/unless.rb +0 -92
  124. data/lib/gloo/verbs/version.rb +0 -37
  125. data/lib/gloo/verbs/wait.rb +0 -42
@@ -1,176 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # A SQL database query.
5
- # Relies on a database connection object.
6
- #
7
-
8
- module Gloo
9
- module Objs
10
- class Query < Gloo::Core::Obj
11
-
12
- KEYWORD = 'query'.freeze
13
- KEYWORD_SHORT = 'sql'.freeze
14
-
15
- DB = 'database'.freeze
16
- SQL = 'sql'.freeze
17
- RESULT = 'result'.freeze
18
- PARAMS = 'params'.freeze
19
-
20
- DB_MISSING_ERR = 'The database connection is missing!'.freeze
21
-
22
- #
23
- # The name of the object type.
24
- #
25
- def self.typename
26
- return KEYWORD
27
- end
28
-
29
- #
30
- # The short name of the object type.
31
- #
32
- def self.short_typename
33
- return KEYWORD_SHORT
34
- end
35
-
36
- # ---------------------------------------------------------------------
37
- # Children
38
- # ---------------------------------------------------------------------
39
-
40
- #
41
- # Does this object have children to add when an object
42
- # is created in interactive mode?
43
- # This does not apply during obj load, etc.
44
- #
45
- def add_children_on_create?
46
- return true
47
- end
48
-
49
- #
50
- # Add children to this object.
51
- # This is used by containers to add children needed
52
- # for default configurations.
53
- #
54
- def add_default_children
55
- fac = $engine.factory
56
- fac.create_alias DB, nil, self
57
- fac.create_string SQL, nil, self
58
- fac.create_can RESULT, self
59
- end
60
-
61
- # ---------------------------------------------------------------------
62
- # Messages
63
- # ---------------------------------------------------------------------
64
-
65
- #
66
- # Get a list of message names that this object receives.
67
- #
68
- def self.messages
69
- return super + [ 'run' ]
70
- end
71
-
72
- #
73
- # SSH to the host and execute the command, then update result.
74
- #
75
- def msg_run
76
- db = db_obj
77
- unless db
78
- $engine.err DB_MISSING_ERR
79
- return
80
- end
81
-
82
- result = db.query( sql_value, param_array )
83
- process_result result
84
- end
85
-
86
- # ---------------------------------------------------------------------
87
- # Private functions
88
- # ---------------------------------------------------------------------
89
-
90
- private
91
-
92
- #
93
- # Get the database connection.
94
- #
95
- def db_obj
96
- o = find_child DB
97
- return Gloo::Objs::Alias.resolve_alias( o )
98
- end
99
-
100
- #
101
- # Get the SQL from the child object.
102
- # Returns nil if there is none.
103
- #
104
- def sql_value
105
- o = find_child SQL
106
- return nil unless o
107
-
108
- return o.value
109
- end
110
-
111
- #
112
- # Do something with the result of the SQL Query call.
113
- # If there's a result container, we'll create objects in it.
114
- # If not, we'll just show the output in the console.
115
- #
116
- def process_result( data )
117
- r = find_child RESULT
118
- if r
119
- update_result_contaier data
120
- else
121
- show_result data
122
- end
123
- end
124
-
125
- #
126
- # Get the arrya of parameters.
127
- # If there is no PARAM container of if it is empty,
128
- # we'll return a nil value.
129
- #
130
- def param_array
131
- o = find_child PARAMS
132
- return nil unless o
133
-
134
- return nil if o.child_count.zero?
135
-
136
- params = []
137
- o.children.each do |p|
138
- params << p.value
139
- end
140
-
141
- return params
142
- end
143
-
144
- #
145
- # Show the result of the query in the console.
146
- #
147
- def show_result( data )
148
- return if data.nil?
149
-
150
- data.each_with_index do |row, i|
151
- # Show header for the first row
152
- puts row.map { |k, _| k }.join( " \t " ).white if i.zero?
153
-
154
- # Show the row data
155
- puts row.map { |_, v| v }.join( " \t " )
156
- end
157
- end
158
-
159
- #
160
- # Update the result container with the data from the query.
161
- #
162
- def update_result_contaier( data )
163
- r = find_child RESULT
164
- r = Gloo::Objs::Alias.resolve_alias( r )
165
- data.each_with_index do |row, i|
166
- can = r.find_add_child( i.to_s, 'can' )
167
- row.each do |k, v|
168
- o = can.find_add_child( k, 'untyped' )
169
- o.set_value v
170
- end
171
- end
172
- end
173
-
174
- end
175
- end
176
- end
@@ -1,159 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # A Sqlite3 database connection.
5
- #
6
- # https://www.rubydoc.info/gems/sqlite3/1.3.11
7
- # https://www.devdungeon.com/content/ruby-sqlite-tutorial
8
- #
9
- # db.results_as_hash = true
10
- # Set results to return as Hash object.
11
- # This is slower but offers a huge convenience.
12
- # Consider turning it off for high performance situations.
13
- # Each row will have the column name as the hash key.
14
- #
15
- # # Alternatively, to only get one row and discard the rest,
16
- # replace `db.query()` with `db.get_first_value()`.
17
- #
18
- require 'sqlite3'
19
-
20
- module Gloo
21
- module Objs
22
- class Sqlite < Gloo::Core::Obj
23
-
24
- KEYWORD = 'sqlite'.freeze
25
- KEYWORD_SHORT = 'sqlite'.freeze
26
-
27
- DB = 'database'.freeze
28
- DEFAULT_DB = 'test.db'.freeze
29
-
30
- DB_REQUIRED_ERR = 'The database name is required!'.freeze
31
- DB_NOT_FOUND_ERR = 'The database file was not found!'.freeze
32
-
33
- #
34
- # The name of the object type.
35
- #
36
- def self.typename
37
- return KEYWORD
38
- end
39
-
40
- #
41
- # The short name of the object type.
42
- #
43
- def self.short_typename
44
- return KEYWORD_SHORT
45
- end
46
-
47
- # ---------------------------------------------------------------------
48
- # Children
49
- # ---------------------------------------------------------------------
50
-
51
- #
52
- # Does this object have children to add when an object
53
- # is created in interactive mode?
54
- # This does not apply during obj load, etc.
55
- #
56
- def add_children_on_create?
57
- return true
58
- end
59
-
60
- #
61
- # Add children to this object.
62
- # This is used by containers to add children needed
63
- # for default configurations.
64
- #
65
- def add_default_children
66
- fac = $engine.factory
67
- fac.create_string DB, DEFAULT_DB, self
68
- end
69
-
70
- # ---------------------------------------------------------------------
71
- # Messages
72
- # ---------------------------------------------------------------------
73
-
74
- #
75
- # Get a list of message names that this object receives.
76
- #
77
- def self.messages
78
- return super + [ 'verify' ]
79
- end
80
-
81
- #
82
- # Verify access to the Sqlite database specified.
83
- #
84
- def msg_verify
85
- name = db_value
86
- if name.empty?
87
- $engine.err DB_REQUIRED_ERR
88
- $engine.heap.it.set_to false
89
- return
90
- end
91
-
92
- unless File.exist? name
93
- $engine.err DB_NOT_FOUND_ERR
94
- $engine.heap.it.set_to false
95
- return
96
- end
97
-
98
- return unless connects?
99
-
100
- $engine.heap.it.set_to true
101
- end
102
-
103
- # ---------------------------------------------------------------------
104
- # DB functions (all database connections)
105
- # ---------------------------------------------------------------------
106
-
107
- #
108
- # Open a connection and execute the SQL statement.
109
- # Return the resulting data.
110
- #
111
- def query( sql, params = nil )
112
- name = db_value
113
- unless name
114
- $engine.err DB_REQUIRED_ERR
115
- return
116
- end
117
-
118
- db = SQLite3::Database.open name
119
- db.results_as_hash = true
120
- return db.query( sql, params )
121
- end
122
-
123
- # ---------------------------------------------------------------------
124
- # Private functions
125
- # ---------------------------------------------------------------------
126
-
127
- private
128
-
129
- #
130
- # Get the Database file from the child object.
131
- # Returns nil if there is none.
132
- #
133
- def db_value
134
- o = find_child DB
135
- return nil unless o
136
-
137
- return o.value
138
- end
139
-
140
- #
141
- # Try the connection and make sure it works.
142
- # Returns true if we can connect and do a query.
143
- #
144
- def connects?
145
- begin
146
- db = SQLite3::Database.open db_value
147
- sql = "SELECT COUNT(name) FROM sqlite_master WHERE type='table'"
148
- db.get_first_value sql
149
- rescue => e
150
- $engine.err e.message
151
- $engine.heap.it.set_to false
152
- return false
153
- end
154
- return true
155
- end
156
-
157
- end
158
- end
159
- end
@@ -1,140 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # A data table.
5
- # The table container headers and data.
6
- #
7
- require 'tty-table'
8
- require 'pastel'
9
-
10
- module Gloo
11
- module Objs
12
- class Table < Gloo::Core::Obj
13
-
14
- KEYWORD = 'table'.freeze
15
- KEYWORD_SHORT = 'tbl'.freeze
16
- HEADERS = 'headers'.freeze
17
- DATA = 'data'.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 list of headers.
35
- # Returns nil if there is none.
36
- #
37
- def headers
38
- o = find_child HEADERS
39
- return [] unless o
40
-
41
- return o.children.map( &:value )
42
- end
43
-
44
- #
45
- # Get the list of column names.
46
- # Returns nil if there is none.
47
- #
48
- def columns
49
- o = find_child HEADERS
50
- return [] unless o
51
-
52
- return o.children.map( &:name )
53
- end
54
-
55
- #
56
- # Get the list of data elements.
57
- #
58
- def data
59
- o = find_child DATA
60
- return [] unless o
61
-
62
- o = Gloo::Objs::Alias.resolve_alias( o )
63
- cols = self.columns
64
- return o.children.map do |e|
65
- cols.map { |h| e.find_child( h ).value }
66
- end
67
- end
68
-
69
- # ---------------------------------------------------------------------
70
- # Children
71
- # ---------------------------------------------------------------------
72
-
73
- #
74
- # Does this object have children to add when an object
75
- # is created in interactive mode?
76
- # This does not apply during obj load, etc.
77
- #
78
- def add_children_on_create?
79
- return true
80
- end
81
-
82
- #
83
- # Add children to this object.
84
- # This is used by containers to add children needed
85
- # for default configurations.
86
- #
87
- def add_default_children
88
- fac = $engine.factory
89
- fac.create_can HEADERS, self
90
- fac.create_can DATA, self
91
- end
92
-
93
- # ---------------------------------------------------------------------
94
- # Messages
95
- # ---------------------------------------------------------------------
96
-
97
- #
98
- # Get a list of message names that this object receives.
99
- #
100
- def self.messages
101
- return super + %w[show]
102
- end
103
-
104
- #
105
- # Show the table in the CLI.
106
- #
107
- def msg_show
108
- title = self.value
109
- Gloo::Objs::Table.show headers, data, title
110
- end
111
-
112
- # ---------------------------------------------------------------------
113
- # Static table helper
114
- # ---------------------------------------------------------------------
115
-
116
- #
117
- # Show the given table data.
118
- #
119
- def self.show( headers, data, title = nil )
120
- pastel = ::Pastel.new
121
- table = TTY::Table.new headers, data
122
- pad = [ 0, 1, 0, 1 ]
123
- rendered = table.render( :ascii, indent: 2, padding: pad ) do |r|
124
- r.border.style = :blue
125
- r.filter = proc do |val, row_index, _col_index|
126
- # col_index % 2 == 1 ? pastel.red.on_green(val) : val
127
- if row_index.zero?
128
- pastel.blue( val )
129
- else
130
- row_index.odd? ? pastel.white( val ) : pastel.yellow( val )
131
- end
132
- end
133
- end
134
- puts "\n#{title.white}"
135
- puts "#{rendered}\n\n"
136
- end
137
-
138
- end
139
- end
140
- end
@@ -1,50 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # A Date object (does not include a time).
5
- #
6
-
7
- module Gloo
8
- module Objs
9
- class Date < Gloo::Core::Obj
10
-
11
- KEYWORD = 'date'.freeze
12
- KEYWORD_SHORT = 'date'.freeze
13
-
14
- #
15
- # The name of the object type.
16
- #
17
- def self.typename
18
- return KEYWORD
19
- end
20
-
21
- #
22
- # The short name of the object type.
23
- #
24
- def self.short_typename
25
- return KEYWORD_SHORT
26
- end
27
-
28
- # ---------------------------------------------------------------------
29
- # Messages
30
- # ---------------------------------------------------------------------
31
-
32
- #
33
- # Get a list of message names that this object receives.
34
- #
35
- def self.messages
36
- return super + %w[now]
37
- end
38
-
39
- #
40
- # Set to the current date.
41
- #
42
- def msg_now
43
- t = DateTime.now.strftime( '%Y.%m.%d' )
44
- self.value = t
45
- $engine.heap.it.set_to t
46
- end
47
-
48
- end
49
- end
50
- end
@@ -1,62 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # A Date and Time object.
5
- #
6
-
7
- module Gloo
8
- module Objs
9
- class Datetime < Gloo::Core::Obj
10
-
11
- KEYWORD = 'datetime'.freeze
12
- KEYWORD_SHORT = 'dt'.freeze
13
-
14
- #
15
- # The name of the object type.
16
- #
17
- def self.typename
18
- return KEYWORD
19
- end
20
-
21
- #
22
- # The short name of the object type.
23
- #
24
- def self.short_typename
25
- return KEYWORD_SHORT
26
- end
27
-
28
- #
29
- # Set the value with any necessary type conversions.
30
- #
31
- def set_value( new_value )
32
- unless new_value.is_a? DateTime
33
- self.value = $engine.converter.convert( new_value, 'DateTime', nil )
34
- return
35
- end
36
-
37
- self.value = new_value
38
- end
39
-
40
- # ---------------------------------------------------------------------
41
- # Messages
42
- # ---------------------------------------------------------------------
43
-
44
- #
45
- # Get a list of message names that this object receives.
46
- #
47
- def self.messages
48
- return super + %w[now]
49
- end
50
-
51
- #
52
- # Set to the current date and time.
53
- #
54
- def msg_now
55
- t = DateTime.now.strftime( '%Y.%m.%d %I:%M:%S %P' )
56
- self.value = t
57
- $engine.heap.it.set_to t
58
- end
59
-
60
- end
61
- end
62
- end
@@ -1,50 +0,0 @@
1
- # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
- # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
- #
4
- # A Time object (does not include a date).
5
- #
6
-
7
- module Gloo
8
- module Objs
9
- class Time < Gloo::Core::Obj
10
-
11
- KEYWORD = 'time'.freeze
12
- KEYWORD_SHORT = 'time'.freeze
13
-
14
- #
15
- # The name of the object type.
16
- #
17
- def self.typename
18
- return KEYWORD
19
- end
20
-
21
- #
22
- # The short name of the object type.
23
- #
24
- def self.short_typename
25
- return KEYWORD_SHORT
26
- end
27
-
28
- # ---------------------------------------------------------------------
29
- # Messages
30
- # ---------------------------------------------------------------------
31
-
32
- #
33
- # Get a list of message names that this object receives.
34
- #
35
- def self.messages
36
- return super + %w[now]
37
- end
38
-
39
- #
40
- # Set to the current time.
41
- #
42
- def msg_now
43
- t = DateTime.now.strftime( '%I:%M:%S %P' )
44
- self.value = t
45
- $engine.heap.it.set_to t
46
- end
47
-
48
- end
49
- end
50
- end