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
@@ -9,12 +9,12 @@ module Gloo
9
9
  class OpMinus < Gloo::Core::Op
10
10
 
11
11
  # Perform the operation and return the result.
12
- def perform left, right
13
- if left.is_a? Integer
14
- return left - right.to_i
15
- end
12
+ def perform( left, right )
13
+ return left - right.to_i if left.is_a? Integer
14
+
15
+ return left - right.to_f if left.is_a? Numeric
16
16
  end
17
-
17
+
18
18
  end
19
19
  end
20
20
  end
@@ -9,12 +9,12 @@ module Gloo
9
9
  class OpMult < Gloo::Core::Op
10
10
 
11
11
  # Perform the operation and return the result.
12
- def perform left, right
13
- if left.is_a? Integer
14
- return left * right.to_i
15
- end
12
+ def perform( left, right )
13
+ return left * right.to_i if left.is_a? Integer
14
+
15
+ return left * right.to_f if left.is_a? Numeric
16
16
  end
17
-
17
+
18
18
  end
19
19
  end
20
20
  end
@@ -9,14 +9,14 @@ module Gloo
9
9
  class OpPlus < Gloo::Core::Op
10
10
 
11
11
  # Perform the operation and return the result.
12
- def perform left, right
13
- if left.is_a? String
14
- return left + right.to_s
15
- elsif left.is_a? Integer
16
- return left + right.to_i
17
- end
12
+ def perform( left, right )
13
+ return left + right.to_s if left.is_a? String
14
+
15
+ return left + right.to_i if left.is_a? Integer
16
+
17
+ return left + right.to_f if left.is_a? Numeric
18
18
  end
19
-
19
+
20
20
  end
21
21
  end
22
22
  end
@@ -0,0 +1,111 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
+ #
4
+ # A String.
5
+ #
6
+
7
+ module Gloo
8
+ module Objs
9
+ class Alias < Gloo::Core::Obj
10
+
11
+ KEYWORD = 'alias'.freeze
12
+ KEYWORD_SHORT = 'ln'.freeze
13
+ ALIAS_REFERENCE = '*'.freeze
14
+
15
+ #
16
+ # The name of the object type.
17
+ #
18
+ def self.typename
19
+ return KEYWORD
20
+ end
21
+
22
+ #
23
+ # The short name of the object type.
24
+ #
25
+ def self.short_typename
26
+ return KEYWORD_SHORT
27
+ end
28
+
29
+ #
30
+ # Set the value with any necessary type conversions.
31
+ #
32
+ def set_value( new_value )
33
+ self.value = new_value.to_s
34
+ end
35
+
36
+ # ---------------------------------------------------------------------
37
+ # Messages
38
+ # ---------------------------------------------------------------------
39
+
40
+ #
41
+ # Get a list of message names that this object receives.
42
+ #
43
+ def self.messages
44
+ return super + %w[resolve]
45
+ end
46
+
47
+ #
48
+ # Check to see if the referenced object exists.
49
+ #
50
+ def msg_resolve
51
+ pn = Gloo::Core::Pn.new( self.value )
52
+ s = pn.exists?
53
+ $engine.heap.it.set_to s
54
+ return s
55
+ end
56
+
57
+ # ---------------------------------------------------------------------
58
+ # Resolve
59
+ # ---------------------------------------------------------------------
60
+
61
+ #
62
+ # Is the object an alias If so, then resolve it.
63
+ # The ref_name is the name used to refer to the object.
64
+ # If it ends with the * then we won't resolve the alias since
65
+ # we are trying to refer to the alias itself.
66
+ #
67
+ def self.resolve_alias( obj, ref_name = nil )
68
+ return nil unless obj
69
+ return obj unless obj.type_display == Gloo::Objs::Alias.typename
70
+ return obj if ref_name&.end_with?( ALIAS_REFERENCE )
71
+
72
+ ln = Gloo::Core::Pn.new( obj.value )
73
+ return ln.resolve
74
+ end
75
+
76
+ # ---------------------------------------------------------------------
77
+ # Help
78
+ # ---------------------------------------------------------------------
79
+
80
+ #
81
+ # Get help for this object type.
82
+ #
83
+ def self.help
84
+ return <<~TEXT
85
+ ALIAS OBJECT TYPE
86
+ NAME: alias
87
+ SHORTCUT: ln
88
+
89
+ DESCRIPTION
90
+ A pointer to another object.
91
+ Normal path-name references will refere to the aliased object.
92
+ To refer to the alias itself, add an * at the end of the path-name.
93
+ This is neeed, for example, to set the value of the alias.
94
+ The value of the alias is merely the path-name of the
95
+ referenced object.
96
+
97
+ CHILDREN
98
+ None
99
+
100
+ MESSAGES
101
+ The alias will reflect the mesages of the object to which
102
+ it points.
103
+ The alias itself can receive the following message:
104
+ resolve - Check to see if the object referenced exists.
105
+ Sets it to true or false.
106
+ TEXT
107
+ end
108
+
109
+ end
110
+ end
111
+ end
@@ -7,88 +7,86 @@
7
7
  module Gloo
8
8
  module Objs
9
9
  class Boolean < Gloo::Core::Obj
10
-
11
- KEYWORD = 'boolean'
12
- KEYWORD_SHORT = 'bool'
13
- TRUE = 'true'
14
- FALSE = 'false'
15
10
 
16
- #
11
+ KEYWORD = 'boolean'.freeze
12
+ KEYWORD_SHORT = 'bool'.freeze
13
+ TRUE = 'true'.freeze
14
+ FALSE = 'false'.freeze
15
+
16
+ #
17
17
  # The name of the object type.
18
- #
18
+ #
19
19
  def self.typename
20
20
  return KEYWORD
21
21
  end
22
22
 
23
- #
23
+ #
24
24
  # The short name of the object type.
25
- #
25
+ #
26
26
  def self.short_typename
27
27
  return KEYWORD_SHORT
28
28
  end
29
29
 
30
- #
30
+ #
31
31
  # Set the value with any necessary type conversions.
32
- #
33
- def set_value new_value
32
+ #
33
+ def set_value( new_value )
34
34
  self.value = Gloo::Objs::Boolean.coerse_to_bool( new_value )
35
35
  end
36
-
37
- #
36
+
37
+ #
38
38
  # Coerse the new value to a boolean value.
39
- #
40
- def self.coerse_to_bool new_value
41
- if new_value.nil?
42
- return false
43
- elsif new_value.class.name == "String"
39
+ #
40
+ def self.coerse_to_bool( new_value )
41
+ return false if new_value.nil?
42
+
43
+ if new_value.class.name == 'String'
44
44
  return true if new_value.strip.downcase == TRUE
45
45
  return false if new_value.strip.downcase == FALSE
46
46
  return true if new_value.strip.downcase == 't'
47
47
  return false if new_value.strip.downcase == 'f'
48
- elsif new_value.class.name == "Integer"
49
- return false if new_value == 0
50
- return true
51
- else
52
- return new_value == true
48
+ elsif new_value.class.name == 'Integer'
49
+ return new_value.zero? ? false : true
53
50
  end
51
+
52
+ return new_value == true
54
53
  end
55
-
56
- #
54
+
55
+ #
57
56
  # Is the given token a boolean?
58
- #
59
- def self.is_boolean? token
57
+ #
58
+ def self.boolean?( token )
60
59
  return true if token == true
61
60
  return true if token == false
62
- if token.class.name == "String"
61
+
62
+ if token.class.name == 'String'
63
63
  return true if token.strip.downcase == TRUE
64
64
  return true if token.strip.downcase == FALSE
65
65
  end
66
66
  return false
67
67
  end
68
68
 
69
-
70
- #
69
+ #
71
70
  # Get the value for display purposes.
72
- #
71
+ #
73
72
  def value_display
74
73
  return value ? TRUE : FALSE
75
74
  end
76
75
 
77
-
78
76
  # ---------------------------------------------------------------------
79
77
  # Messages
80
78
  # ---------------------------------------------------------------------
81
79
 
82
- #
80
+ #
83
81
  # Get a list of message names that this object receives.
84
- #
82
+ #
85
83
  def self.messages
86
- return super + [ "not", "true", "false" ]
84
+ return super + %w[not true false]
87
85
  end
88
-
86
+
89
87
  # Set the value to the opposite of what it is.
90
88
  def msg_not
91
- v = ! value
89
+ v = !value
92
90
  set_value v
93
91
  $engine.heap.it.set_to v
94
92
  return v
@@ -108,6 +106,33 @@ module Gloo
108
106
  return false
109
107
  end
110
108
 
109
+ # ---------------------------------------------------------------------
110
+ # Help
111
+ # ---------------------------------------------------------------------
112
+
113
+ #
114
+ # Get help for this object type.
115
+ #
116
+ def self.help
117
+ return <<~TEXT
118
+ BOOLEAN OBJECT TYPE
119
+ NAME: boolean
120
+ SHORTCUT: bool
121
+
122
+ DESCRIPTION
123
+ A boolean value.
124
+ Value will be either true or false.
125
+
126
+ CHILDREN
127
+ None
128
+
129
+ MESSAGES
130
+ not - Set the boolean to the opposite of what it is now.
131
+ true - Set the boolean to true.
132
+ false - Set the boolean to false.
133
+ TEXT
134
+ end
135
+
111
136
  end
112
137
  end
113
138
  end
@@ -3,47 +3,106 @@
3
3
  #
4
4
  # An object that contains a collection of other objects.
5
5
  #
6
+ require 'tty-table'
7
+ require 'pastel'
6
8
 
7
9
  module Gloo
8
10
  module Objs
9
11
  class Container < Gloo::Core::Obj
10
-
11
- KEYWORD = 'container'
12
- KEYWORD_SHORT = 'can'
13
12
 
14
- #
13
+ KEYWORD = 'container'.freeze
14
+ KEYWORD_SHORT = 'can'.freeze
15
+
16
+ #
15
17
  # The name of the object type.
16
- #
18
+ #
17
19
  def self.typename
18
20
  return KEYWORD
19
21
  end
20
22
 
21
- #
23
+ #
22
24
  # The short name of the object type.
23
- #
25
+ #
24
26
  def self.short_typename
25
27
  return KEYWORD_SHORT
26
28
  end
27
29
 
28
-
29
30
  # ---------------------------------------------------------------------
30
31
  # Messages
31
32
  # ---------------------------------------------------------------------
32
33
 
33
- #
34
+ #
34
35
  # Get a list of message names that this object receives.
35
- #
36
+ #
36
37
  def self.messages
37
- return super + [ "count" ]
38
+ return super + %w[count delete_children show_key_value_table]
38
39
  end
39
-
40
+
41
+ #
40
42
  # Count the number of children in the container.
43
+ #
41
44
  def msg_count
42
45
  i = child_count
43
46
  $engine.heap.it.set_to i
44
47
  return i
45
48
  end
46
49
 
50
+ #
51
+ # Delete all children in the container.
52
+ #
53
+ def msg_delete_children
54
+ self.delete_children
55
+ end
56
+
57
+ #
58
+ # Show the given table data.
59
+ #
60
+ def msg_show_key_value_table
61
+ data = self.children.map { |o| [ o.name, o.value ] }
62
+ pastel = ::Pastel.new
63
+ table = TTY::Table.new rows: data
64
+ pad = [ 0, 1, 0, 1 ]
65
+ rendered = table.render( :ascii, indent: 2, padding: pad ) do |r|
66
+ r.border.style = :blue
67
+ r.filter = proc do |val, _row_index, col_index|
68
+ col_index.zero? ? pastel.blue( val ) : pastel.white( val )
69
+ end
70
+ end
71
+ puts "\n #{rendered}\n\n"
72
+ end
73
+
74
+ # ---------------------------------------------------------------------
75
+ # Help
76
+ # ---------------------------------------------------------------------
77
+
78
+ #
79
+ # Get help for this object type.
80
+ #
81
+ def self.help
82
+ return <<~TEXT
83
+ CONTAINER OBJECT TYPE
84
+ NAME: container
85
+ SHORTCUT: can
86
+
87
+ DESCRIPTION
88
+ A container of other objects.
89
+ A container is similar to a folder in a file system.
90
+ It can contain any number of objects including other containers.
91
+ The container structure provides direct access to any object
92
+ within it through the object.object.object path-name structure.
93
+
94
+ CHILDREN
95
+ None by default. But any container can have any number of
96
+ objects added to it.
97
+
98
+ MESSAGES
99
+ count - Count the number of children objects in the container.
100
+ The result is put in <it>.
101
+ delete_children - Delete all children objects from the container.
102
+ show_key_value_tbl - Show a table with key (name) and values
103
+ for all children in the container.
104
+ TEXT
105
+ end
47
106
 
48
107
  end
49
108
  end
@@ -0,0 +1,96 @@
1
+ # Author:: Eric Crane (mailto:eric.crane@mac.com)
2
+ # Copyright:: Copyright (c) 2020 Eric Crane. All rights reserved.
3
+ #
4
+ # An object with a decimal value.
5
+ #
6
+
7
+ module Gloo
8
+ module Objs
9
+ class Decimal < Gloo::Core::Obj
10
+
11
+ KEYWORD = 'decimal'.freeze
12
+ KEYWORD_SHORT = 'num'.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
+ if new_value.nil?
33
+ self.value = 0.0
34
+ return
35
+ end
36
+
37
+ unless new_value.is_a? Numeric
38
+ self.value = $engine.convert( new_value, 'Decimal', 0.0 )
39
+ return
40
+ end
41
+
42
+ self.value = new_value.to_f
43
+ end
44
+
45
+ # ---------------------------------------------------------------------
46
+ # Messages
47
+ # ---------------------------------------------------------------------
48
+
49
+ #
50
+ # Get a list of message names that this object receives.
51
+ #
52
+ def self.messages
53
+ return super + %w[round]
54
+ end
55
+
56
+ #
57
+ # Round the value to a whole value.
58
+ # If a parameter is included in the message,
59
+ # round to the precision given.
60
+ #
61
+ def msg_round
62
+ i = value + 1
63
+ set_value i
64
+ $engine.heap.it.set_to i
65
+ return i
66
+ end
67
+
68
+ # ---------------------------------------------------------------------
69
+ # Help
70
+ # ---------------------------------------------------------------------
71
+
72
+ #
73
+ # Get help for this object type.
74
+ #
75
+ def self.help
76
+ return <<~TEXT
77
+ DECIMAL OBJECT TYPE
78
+ NAME: decimal
79
+ SHORTCUT: num
80
+
81
+ DESCRIPTION
82
+ A decimal (numeric) value.
83
+
84
+ CHILDREN
85
+ None
86
+
87
+ MESSAGES
88
+ round - Round to the nearest whole value.
89
+ If an optional parameter is included, round to the
90
+ precision specified.
91
+ TEXT
92
+ end
93
+
94
+ end
95
+ end
96
+ end