gloo 0.3.0 → 0.5.3

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.rubocop.yml +73 -0
  4. data/Gemfile +2 -2
  5. data/Gemfile.lock +86 -83
  6. data/Rakefile +7 -6
  7. data/bin/console +4 -4
  8. data/gloo.gemspec +22 -18
  9. data/lib/gloo.rb +6 -6
  10. data/lib/gloo/app/args.rb +30 -31
  11. data/lib/gloo/app/engine.rb +80 -30
  12. data/lib/gloo/app/help.rb +17 -11
  13. data/lib/gloo/app/info.rb +3 -3
  14. data/lib/gloo/app/log.rb +17 -17
  15. data/lib/gloo/app/mode.rb +4 -4
  16. data/lib/gloo/app/settings.rb +51 -41
  17. data/lib/gloo/convert/string_to_datetime.rb +21 -0
  18. data/lib/gloo/convert/string_to_decimal.rb +20 -0
  19. data/lib/gloo/convert/string_to_integer.rb +20 -0
  20. data/lib/gloo/core/baseo.rb +7 -7
  21. data/lib/gloo/core/dictionary.rb +30 -27
  22. data/lib/gloo/core/error.rb +50 -0
  23. data/lib/gloo/core/event_manager.rb +17 -23
  24. data/lib/gloo/core/factory.rb +149 -39
  25. data/lib/gloo/core/gloo_system.rb +121 -54
  26. data/lib/gloo/core/heap.rb +15 -13
  27. data/lib/gloo/core/it.rb +5 -5
  28. data/lib/gloo/core/literal.rb +7 -7
  29. data/lib/gloo/core/obj.rb +138 -79
  30. data/lib/gloo/core/obj_finder.rb +9 -14
  31. data/lib/gloo/core/op.rb +8 -8
  32. data/lib/gloo/core/parser.rb +27 -26
  33. data/lib/gloo/core/pn.rb +68 -52
  34. data/lib/gloo/core/script.rb +7 -7
  35. data/lib/gloo/core/tokens.rb +39 -41
  36. data/lib/gloo/core/verb.rb +30 -19
  37. data/lib/gloo/exec/dispatch.rb +30 -0
  38. data/lib/gloo/exec/runner.rb +43 -0
  39. data/lib/gloo/expr/expression.rb +36 -43
  40. data/lib/gloo/expr/l_boolean.rb +7 -6
  41. data/lib/gloo/expr/l_decimal.rb +34 -0
  42. data/lib/gloo/expr/l_integer.rb +5 -4
  43. data/lib/gloo/expr/l_string.rb +13 -15
  44. data/lib/gloo/expr/op_div.rb +5 -5
  45. data/lib/gloo/expr/op_minus.rb +5 -5
  46. data/lib/gloo/expr/op_mult.rb +5 -5
  47. data/lib/gloo/expr/op_plus.rb +7 -7
  48. data/lib/gloo/objs/basic/alias.rb +111 -0
  49. data/lib/gloo/objs/basic/boolean.rb +63 -38
  50. data/lib/gloo/objs/basic/container.rb +71 -12
  51. data/lib/gloo/objs/basic/decimal.rb +96 -0
  52. data/lib/gloo/objs/basic/integer.rb +45 -16
  53. data/lib/gloo/objs/basic/script.rb +62 -38
  54. data/lib/gloo/objs/basic/string.rb +47 -15
  55. data/lib/gloo/objs/basic/text.rb +69 -21
  56. data/lib/gloo/objs/basic/untyped.rb +35 -10
  57. data/lib/gloo/objs/cli/banner.rb +137 -0
  58. data/lib/gloo/objs/cli/bar.rb +141 -0
  59. data/lib/gloo/objs/cli/colorize.rb +54 -24
  60. data/lib/gloo/objs/cli/confirm.rb +63 -29
  61. data/lib/gloo/objs/cli/menu.rb +236 -0
  62. data/lib/gloo/objs/cli/menu_item.rb +128 -0
  63. data/lib/gloo/objs/cli/pastel.rb +120 -0
  64. data/lib/gloo/objs/cli/prompt.rb +73 -31
  65. data/lib/gloo/objs/cli/select.rb +153 -0
  66. data/lib/gloo/objs/ctrl/each.rb +128 -61
  67. data/lib/gloo/objs/ctrl/repeat.rb +129 -0
  68. data/lib/gloo/objs/data/markdown.rb +109 -0
  69. data/lib/gloo/objs/data/table.rb +168 -0
  70. data/lib/gloo/objs/dev/git.rb +98 -64
  71. data/lib/gloo/objs/dt/date.rb +72 -0
  72. data/lib/gloo/objs/dt/datetime.rb +84 -0
  73. data/lib/gloo/objs/dt/time.rb +72 -0
  74. data/lib/gloo/objs/ror/erb.rb +82 -41
  75. data/lib/gloo/objs/ror/eval.rb +73 -31
  76. data/lib/gloo/objs/snd/play.rb +71 -0
  77. data/lib/gloo/objs/snd/say.rb +120 -0
  78. data/lib/gloo/objs/system/file_handle.rb +129 -48
  79. data/lib/gloo/objs/system/system.rb +84 -38
  80. data/lib/gloo/objs/web/http_get.rb +103 -46
  81. data/lib/gloo/objs/web/http_post.rb +70 -44
  82. data/lib/gloo/objs/web/json.rb +155 -0
  83. data/lib/gloo/objs/web/slack.rb +89 -58
  84. data/lib/gloo/objs/web/teams.rb +88 -53
  85. data/lib/gloo/objs/web/uri.rb +160 -0
  86. data/lib/gloo/persist/file_loader.rb +95 -85
  87. data/lib/gloo/persist/file_saver.rb +12 -12
  88. data/lib/gloo/persist/file_storage.rb +15 -15
  89. data/lib/gloo/persist/line_splitter.rb +79 -0
  90. data/lib/gloo/persist/persist_man.rb +63 -39
  91. data/lib/gloo/utils/words.rb +2 -2
  92. data/lib/gloo/verbs/alert.rb +67 -16
  93. data/lib/gloo/verbs/beep.rb +70 -0
  94. data/lib/gloo/verbs/cls.rb +67 -0
  95. data/lib/gloo/verbs/context.rb +61 -21
  96. data/lib/gloo/verbs/create.rb +52 -21
  97. data/lib/gloo/verbs/help.rb +186 -27
  98. data/lib/gloo/verbs/if.rb +55 -21
  99. data/lib/gloo/verbs/list.rb +55 -24
  100. data/lib/gloo/verbs/load.rb +47 -12
  101. data/lib/gloo/verbs/move.rb +128 -0
  102. data/lib/gloo/verbs/put.rb +90 -34
  103. data/lib/gloo/verbs/quit.rb +43 -12
  104. data/lib/gloo/verbs/run.rb +63 -18
  105. data/lib/gloo/verbs/save.rb +45 -10
  106. data/lib/gloo/verbs/show.rb +56 -22
  107. data/lib/gloo/verbs/tell.rb +45 -13
  108. data/lib/gloo/verbs/unless.rb +56 -21
  109. data/lib/gloo/verbs/version.rb +42 -12
  110. data/lib/gloo/verbs/wait.rb +73 -0
  111. data/lib/run.rb +5 -5
  112. metadata +90 -12
@@ -7,43 +7,47 @@
7
7
  module Gloo
8
8
  module Objs
9
9
  class Integer < Gloo::Core::Obj
10
-
11
- KEYWORD = 'integer'
12
- KEYWORD_SHORT = 'int'
13
10
 
14
- #
11
+ KEYWORD = 'integer'.freeze
12
+ KEYWORD_SHORT = 'int'.freeze
13
+
14
+ #
15
15
  # The name of the object type.
16
- #
16
+ #
17
17
  def self.typename
18
18
  return KEYWORD
19
19
  end
20
20
 
21
- #
21
+ #
22
22
  # The short name of the object type.
23
- #
23
+ #
24
24
  def self.short_typename
25
25
  return KEYWORD_SHORT
26
26
  end
27
27
 
28
- #
28
+ #
29
29
  # Set the value with any necessary type conversions.
30
- #
31
- def set_value new_value
30
+ #
31
+ def set_value( new_value )
32
+ unless new_value.is_a? Numeric
33
+ self.value = $engine.convert( new_value, 'Integer', 0 )
34
+ return
35
+ end
36
+
32
37
  self.value = new_value.to_i
33
38
  end
34
-
35
-
39
+
36
40
  # ---------------------------------------------------------------------
37
41
  # Messages
38
42
  # ---------------------------------------------------------------------
39
43
 
40
- #
44
+ #
41
45
  # Get a list of message names that this object receives.
42
- #
46
+ #
43
47
  def self.messages
44
- return super + [ "inc", "dec" ]
48
+ return super + %w[inc dec]
45
49
  end
46
-
50
+
47
51
  # Increment the integer
48
52
  def msg_inc
49
53
  i = value + 1
@@ -60,6 +64,31 @@ module Gloo
60
64
  return i
61
65
  end
62
66
 
67
+ # ---------------------------------------------------------------------
68
+ # Help
69
+ # ---------------------------------------------------------------------
70
+
71
+ #
72
+ # Get help for this object type.
73
+ #
74
+ def self.help
75
+ return <<~TEXT
76
+ INTEGER OBJECT TYPE
77
+ NAME: integer
78
+ SHORTCUT: int
79
+
80
+ DESCRIPTION
81
+ An integer (numeric) value.
82
+
83
+ CHILDREN
84
+ None
85
+
86
+ MESSAGES
87
+ inc - Increment the integer value by 1.
88
+ dec - Decrement the integer value by 1.
89
+ TEXT
90
+ end
91
+
63
92
  end
64
93
  end
65
94
  end
@@ -8,43 +8,43 @@
8
8
  module Gloo
9
9
  module Objs
10
10
  class Script < Gloo::Core::Obj
11
-
12
- KEYWORD = 'script'
13
- KEYWORD_SHORT = 'cmd'
14
11
 
15
- #
12
+ KEYWORD = 'script'.freeze
13
+ KEYWORD_SHORT = 'cmd'.freeze
14
+
15
+ #
16
16
  # The name of the object type.
17
- #
17
+ #
18
18
  def self.typename
19
19
  return KEYWORD
20
20
  end
21
21
 
22
- #
22
+ #
23
23
  # The short name of the object type.
24
- #
24
+ #
25
25
  def self.short_typename
26
26
  return KEYWORD_SHORT
27
27
  end
28
28
 
29
- #
29
+ #
30
30
  # Set the value with any necessary type conversions.
31
- #
32
- def set_value new_value
31
+ #
32
+ def set_value( new_value )
33
33
  self.value = new_value.to_s
34
34
  end
35
-
36
- #
35
+
36
+ #
37
37
  # Set the value as an array.
38
- #
39
- def set_array_value arr
38
+ #
39
+ def set_array_value( arr )
40
40
  self.value = arr
41
41
  end
42
-
43
- #
42
+
43
+ #
44
44
  # Add a line (cmd) to the script.
45
- #
46
- def add_line line
47
- if self.value_is_string?
45
+ #
46
+ def add_line( line )
47
+ if self.value_string?
48
48
  first = self.value
49
49
  self.set_array_value []
50
50
  self.value << first unless first.empty?
@@ -54,48 +54,72 @@ module Gloo
54
54
  self.value << line.strip
55
55
  end
56
56
 
57
- #
57
+ #
58
58
  # Does this object support multi-line values?
59
59
  # Initially only true for scripts.
60
- #
61
- def has_multiline_value?
60
+ #
61
+ def multiline_value?
62
62
  return true
63
63
  end
64
-
65
- #
64
+
65
+ #
66
66
  # Get the number of lines in this script.
67
- #
67
+ #
68
68
  def line_count
69
- if self.value_is_array?
70
- return self.value.count
71
- elsif self.value_is_string?
72
- return 0 if ( self.value.strip.empty? )
73
- return 1
74
- else
75
- return 0
69
+ return self.value.count if self.value_is_array?
70
+
71
+ if self.value_string?
72
+ return self.value.strip.empty? ? 0 : 1
76
73
  end
74
+
75
+ return 0
77
76
  end
78
77
 
79
-
80
78
  # ---------------------------------------------------------------------
81
79
  # Messages
82
80
  # ---------------------------------------------------------------------
83
81
 
84
- #
82
+ #
85
83
  # Get a list of message names that this object receives.
86
- #
84
+ #
87
85
  def self.messages
88
- return super + [ "run" ]
86
+ return super + [ 'run' ]
89
87
  end
90
88
 
91
- #
89
+ #
92
90
  # Send the object the unload message.
93
- #
91
+ #
94
92
  def msg_run
95
93
  s = Gloo::Core::Script.new self
96
94
  s.run
97
95
  end
98
96
 
97
+ # ---------------------------------------------------------------------
98
+ # Help
99
+ # ---------------------------------------------------------------------
100
+
101
+ #
102
+ # Get help for this object type.
103
+ #
104
+ def self.help
105
+ return <<~TEXT
106
+ SCRIPT OBJECT TYPE
107
+ NAME: script
108
+ SHORTCUT: cmd
109
+
110
+ DESCRIPTION
111
+ An exectutable script.
112
+
113
+ CHILDREN
114
+ None
115
+
116
+ MESSAGES
117
+ run - Run the script.
118
+ The script can be run by telling the object or run.
119
+ It can all be executed with the run verb.
120
+ TEXT
121
+ end
122
+
99
123
  end
100
124
  end
101
125
  end
@@ -7,43 +7,49 @@
7
7
  module Gloo
8
8
  module Objs
9
9
  class String < Gloo::Core::Obj
10
-
11
- KEYWORD = 'string'
12
- KEYWORD_SHORT = 'str'
13
10
 
14
- #
11
+ KEYWORD = 'string'.freeze
12
+ KEYWORD_SHORT = 'str'.freeze
13
+
14
+ #
15
15
  # The name of the object type.
16
- #
16
+ #
17
17
  def self.typename
18
18
  return KEYWORD
19
19
  end
20
20
 
21
- #
21
+ #
22
22
  # The short name of the object type.
23
- #
23
+ #
24
24
  def self.short_typename
25
25
  return KEYWORD_SHORT
26
26
  end
27
27
 
28
- #
28
+ #
29
29
  # Set the value with any necessary type conversions.
30
- #
31
- def set_value new_value
30
+ #
31
+ def set_value( new_value )
32
32
  self.value = new_value.to_s
33
33
  end
34
34
 
35
-
36
35
  # ---------------------------------------------------------------------
37
36
  # Messages
38
37
  # ---------------------------------------------------------------------
39
38
 
40
- #
39
+ #
41
40
  # Get a list of message names that this object receives.
42
- #
41
+ #
43
42
  def self.messages
44
- return super + [ "up", "down" ]
43
+ return super + %w[up down size]
45
44
  end
46
-
45
+
46
+ # Get the size of the string.
47
+ def msg_size
48
+ s = value.size
49
+ $engine.heap.it.set_to s
50
+ return s
51
+ end
52
+
47
53
  # Convert string to upper case
48
54
  def msg_up
49
55
  s = value.upcase
@@ -60,6 +66,32 @@ module Gloo
60
66
  return s
61
67
  end
62
68
 
69
+ # ---------------------------------------------------------------------
70
+ # Help
71
+ # ---------------------------------------------------------------------
72
+
73
+ #
74
+ # Get help for this object type.
75
+ #
76
+ def self.help
77
+ return <<~TEXT
78
+ STRING OBJECT TYPE
79
+ NAME: string
80
+ SHORTCUT: str
81
+
82
+ DESCRIPTION
83
+ A string value.
84
+
85
+ CHILDREN
86
+ None
87
+
88
+ MESSAGES
89
+ up - Convert the string to uppercase.
90
+ down - Convert the string to lowercase.
91
+ size - Get the size of the string.
92
+ TEXT
93
+ end
94
+
63
95
  end
64
96
  end
65
97
  end
@@ -3,60 +3,108 @@
3
3
  #
4
4
  # A [multiline] block of text.
5
5
  #
6
+ require 'tty-editor'
7
+ require 'tty-pager'
6
8
 
7
9
  module Gloo
8
10
  module Objs
9
11
  class Text < Gloo::Core::Obj
10
-
11
- KEYWORD = 'text'
12
- KEYWORD_SHORT = 'txt'
13
12
 
14
- #
13
+ KEYWORD = 'text'.freeze
14
+ KEYWORD_SHORT = 'txt'.freeze
15
+ DEFAULT_TMP_FILE = 'tmp.txt'.freeze
16
+
17
+ #
15
18
  # The name of the object type.
16
- #
19
+ #
17
20
  def self.typename
18
21
  return KEYWORD
19
22
  end
20
23
 
21
- #
24
+ #
22
25
  # The short name of the object type.
23
- #
26
+ #
24
27
  def self.short_typename
25
28
  return KEYWORD_SHORT
26
29
  end
27
30
 
28
- #
31
+ #
29
32
  # Set the value with any necessary type conversions.
30
- #
31
- def set_value new_value
33
+ #
34
+ def set_value( new_value )
32
35
  self.value = new_value.to_s
33
36
  end
34
37
 
35
- #
38
+ #
36
39
  # Does this object support multi-line values?
37
40
  # Initially only true for scripts.
38
- #
39
- def has_multiline_value?
41
+ #
42
+ def multiline_value?
40
43
  return false
41
44
  end
42
-
43
- #
45
+
46
+ #
44
47
  # Get the number of lines of text.
45
- #
48
+ #
46
49
  def line_count
47
50
  return value.split( "\n" ).count
48
51
  end
49
-
50
-
52
+
51
53
  # ---------------------------------------------------------------------
52
54
  # Messages
53
55
  # ---------------------------------------------------------------------
54
56
 
55
- #
57
+ #
56
58
  # Get a list of message names that this object receives.
57
- #
59
+ #
58
60
  def self.messages
59
- return super
61
+ return super + %w[edit page]
62
+ end
63
+
64
+ #
65
+ # Show the contents of the file, paginated.
66
+ #
67
+ def msg_page
68
+ return unless value
69
+
70
+ # pager = TTY::Pager::SystemPager.new command: 'less -R'
71
+ pager = TTY::Pager.new
72
+ pager.page( value )
73
+ end
74
+
75
+ #
76
+ # Edit the text in the default editor.
77
+ #
78
+ def msg_edit
79
+ tmp = File.join( $settings.tmp_path, DEFAULT_TMP_FILE )
80
+ File.open( tmp, 'w' ) { |file| file.write( self.value ) }
81
+ TTY::Editor.open( tmp )
82
+ set_value File.read( tmp )
83
+ end
84
+
85
+ # ---------------------------------------------------------------------
86
+ # Help
87
+ # ---------------------------------------------------------------------
88
+
89
+ #
90
+ # Get help for this object type.
91
+ #
92
+ def self.help
93
+ return <<~TEXT
94
+ TEXT OBJECT TYPE
95
+ NAME: text
96
+ SHORTCUT: txt
97
+
98
+ DESCRIPTION
99
+ A longer, multi-line text string.
100
+
101
+ CHILDREN
102
+ None
103
+
104
+ MESSAGES
105
+ edit - Edit the text field in the default editor.
106
+ page - Show the text, paginated.
107
+ TEXT
60
108
  end
61
109
 
62
110
  end