mysh 0.2.7 → 0.3.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.
@@ -0,0 +1,11 @@
1
+ # coding: utf-8
2
+
3
+ #* mysh/pre_processor.rb -- The mysh macro/handlebar preprocessor.
4
+ class String
5
+
6
+ #The mysh string pre-processor stack.
7
+ def preprocess(evaluator=$mysh_exec_host)
8
+ self.eval_variables.eval_handlebars(evaluator).eval_quoted_braces
9
+ end
10
+
11
+ end
data/lib/mysh/quick.rb CHANGED
@@ -10,6 +10,7 @@ module Mysh
10
10
  QUICK['='] = lambda {|str| $mysh_exec_host.execute(str) }
11
11
  QUICK['?'] = lambda {|str| HELP_COMMAND.quick_parse_and_call(str) }
12
12
  QUICK['@'] = lambda {|str| SHOW_COMMAND.quick_parse_and_call(str) }
13
+ QUICK['$'] = lambda {|str| VARS_COMMAND.call(str) }
13
14
 
14
15
  #Try to execute the string as a quick command.
15
16
  def self.try_execute_quick_command(str)
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'shell_variables/shell_variable_store'
4
+ require_relative 'shell_variables/shell_variable_keeper'
5
+ require_relative 'shell_variables/globalize'
6
+ require_relative 'shell_variables/evaluate'
7
+
8
+ #* mysh/shell_variables.rb -- Adds support for mysh scripting variables.
9
+ module Mysh
10
+
11
+ #Set up some essential entries.
12
+ MNV['$'.to_sym] = "$"
13
+
14
+ #Set up some default values.
15
+ MNV[:debug] = "false"
16
+ MNV[:prompt] = "mysh"
17
+ MNV[:post_prompt] = "$prompt"
18
+ MNV[:pre_prompt] = "$w"
19
+
20
+ MNV[:d] = "{{ Time.now.strftime(MNV[:date_fmt]) }}"
21
+ MNV[:h] = "{{ ENV['HOME'].decorate }}"
22
+ MNV[:t] = "{{ Time.now.strftime(MNV[:time_fmt]) }}"
23
+ MNV[:u] = "{{ ENV['USER'] }}"
24
+ MNV[:w] = "{{ Dir.pwd.decorate }}"
25
+
26
+ MNV[:date_fmt] = "%Y-%m-%d"
27
+ MNV[:time_fmt] = "%H:%M"
28
+
29
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+
3
+ #Monkey patches for Mysh variables
4
+ class String
5
+
6
+ #Extract common mysh data from this string.
7
+ def extract_mysh_types
8
+ if self =~ /false|no|off/i
9
+ false
10
+ else
11
+ self
12
+ end
13
+ end
14
+
15
+ #Evaluate any variable substitutions in the input.
16
+ def eval_variables
17
+ self.gsub(/(\$\$)|(\$[a-z][a-z0-9_]*)/) do |str|
18
+ sym = str[1..-1].to_sym
19
+ MNV.key?(sym) ? MNV[sym].to_s : str
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,9 @@
1
+ # coding: utf-8
2
+
3
+ #Monkey patches for Mysh variables
4
+ class Object
5
+
6
+ #Make the environment variable store accessible everywhere.
7
+ MNV = Mysh::MNV
8
+
9
+ end
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+
3
+ #* mysh/shell_variables/shell_variable_keeper.rb -- The keeper of mysh values.
4
+ module Mysh
5
+
6
+ #The keeper of mysh variable values.
7
+ class Keeper
8
+
9
+ #Set up this variable
10
+ def initialize(value="")
11
+ @value = value
12
+ end
13
+
14
+ #Get the value of this variable.
15
+ def get_value(loop_check={})
16
+ my_id = self.object_id
17
+ fail "Mysh variable looping error." if loop_check[my_id]
18
+ loop_check[my_id] = self
19
+
20
+ @value.preprocess
21
+ end
22
+
23
+ #Get the source code of this variable.
24
+ def get_source
25
+ @value
26
+ end
27
+
28
+ #Set the value of this variable.
29
+ def set_value(value)
30
+ @value = value
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
@@ -0,0 +1,76 @@
1
+ # coding: utf-8
2
+
3
+ #* mysh/shell_variables/shell_variable_store.rb -- Storage for mysh variables.
4
+ module Mysh
5
+
6
+ #The holder of mysh variables.
7
+ module MNV
8
+ #Set up the storage hash.
9
+ @store = Hash.new { |_hash, _key| Keeper.new }
10
+
11
+ #The shared loop checker for programmatic access.
12
+ @loop_check = nil
13
+
14
+ #Get the value of a variable.
15
+ #<br>Endemic Code Smells
16
+ #* :reek:TooManyStatements
17
+ def self.[](index)
18
+ keeper = get_keeper(index)
19
+
20
+ if @loop_check
21
+ keeper.get_value(@loop_check)
22
+ else
23
+ begin
24
+ keeper.get_value(@loop_check = {})
25
+ ensure
26
+ @loop_check = nil
27
+ end
28
+ end.extract_mysh_types
29
+ end
30
+
31
+ #Set the value of a variable.
32
+ def self.[]=(index, value)
33
+ unless value.empty?
34
+ keeper = get_keeper(index)
35
+ keeper.set_value(value)
36
+ set_keeper(index, keeper)
37
+ else
38
+ delete_keeper(index)
39
+ end
40
+
41
+ value
42
+ end
43
+
44
+ #Get the value keeper of a variable.
45
+ def self.get_keeper(index)
46
+ @store[index]
47
+ end
48
+
49
+ #Set the value keeper of a variable.
50
+ def self.set_keeper(index, keeper)
51
+ @store[index] = keeper
52
+ end
53
+
54
+ #Delete the value keeper of a variable.
55
+ def self.delete_keeper(index)
56
+ @store.delete(index)
57
+ end
58
+
59
+ #Get the source code of a variable.
60
+ def self.get_source(index)
61
+ @store[index].get_source
62
+ end
63
+
64
+ #Does this entry exist?
65
+ def self.key?(index)
66
+ @store.key?(index)
67
+ end
68
+
69
+ #Get all the keys
70
+ def self.keys
71
+ @store.keys
72
+ end
73
+
74
+ end
75
+
76
+ end
@@ -4,7 +4,6 @@ require 'mini_readline'
4
4
 
5
5
  require_relative 'user_input/smart_source'
6
6
  require_relative 'user_input/parse'
7
- require_relative 'user_input/handlebars'
8
7
 
9
8
  #* mysh/user_input.rb -- Get some text from the user.
10
9
  module Mysh
@@ -15,10 +14,14 @@ module Mysh
15
14
  end
16
15
 
17
16
  #Get one command from the user.
18
- def self.get_command(root="")
19
- initial_input = @input.readline(prompt: root + '>')
17
+ #<br>Endemic Code Smells
18
+ #* :reek:TooManyStatements
19
+ def self.get_command
20
+ puts MNV[:pre_prompt] if MNV.key?(:pre_prompt)
21
+
22
+ initial_input = @input.readline(prompt: MNV[:prompt] + '>')
20
23
  @input.instance_options[:initial] = ""
21
- get_command_extra(initial_input, root)
24
+ get_command_extra(initial_input)
22
25
 
23
26
  rescue MiniReadlineEOI
24
27
  @mysh_running = false
@@ -28,10 +31,10 @@ module Mysh
28
31
  private
29
32
 
30
33
  #Get any continuations of the inputs
31
- def self.get_command_extra(str, root)
34
+ def self.get_command_extra(str)
32
35
  if /\\\s*$/ =~ str
33
- parms = {prompt: root + '\\', prefix: str[0] }
34
- get_command_extra($PREMATCH + "\n" + @input.readline(parms), root)
36
+ parms = {prompt: MNV[:post_prompt] + '\\', prefix: str[0] }
37
+ get_command_extra($PREMATCH + "\n" + @input.readline(parms))
35
38
  else
36
39
  str
37
40
  end
data/lib/mysh/version.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Mysh
4
4
  #The version string of MY SHell.
5
- VERSION = "0.2.7"
5
+ VERSION = "0.3.0"
6
6
 
7
7
  #A brief summary of this gem.
8
8
  SUMMARY = "mysh -- a Ruby inspired command line shell."
data/mysh.gemspec CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'minitest_visible', ">= 0.1.2"
31
31
  spec.add_development_dependency 'rdoc', "~> 4.0.1"
32
32
 
33
- spec.add_runtime_dependency 'mini_readline', ">= 0.6.11"
33
+ spec.add_runtime_dependency 'mini_readline', ">= 0.7.2"
34
34
  spec.add_runtime_dependency 'vls', ">= 0.4.1"
35
35
  spec.add_runtime_dependency 'in_array', ">= 0.1.7"
36
36
  end
data/samples/show.txt CHANGED
@@ -1,4 +1,4 @@
1
- This is a sample show file.
1
+ This is a sample show file. $d $t
2
2
 
3
3
  {{ a = 5 #}}a = {{ a.to_s }}
4
4
  Args = {{ args.inspect }}
@@ -24,6 +24,8 @@ class MyShellTester < Minitest::Test
24
24
  assert_equal(Module, Mysh.class)
25
25
  assert_equal(Class, Mysh::Action.class)
26
26
  assert_equal(Class, Mysh::ActionPool.class)
27
+ assert_equal(Module, Mysh::MNV.class)
28
+ assert_equal(Class, Mysh::Keeper.class)
27
29
 
28
30
  assert_equal(Mysh::ActionPool, Mysh::COMMANDS.class)
29
31
  assert_equal(Mysh::ActionPool, Mysh::HELP.class)
@@ -46,14 +48,16 @@ class MyShellTester < Minitest::Test
46
48
  end
47
49
 
48
50
  def test_handlebars
51
+ Mysh.reset_host
52
+
49
53
  assert_equal("ABC 123 DEF",
50
- eval_handlebars("ABC {{ (1..3).to_a.join }} DEF"))
54
+ "ABC {{ (1..3).to_a.join }} DEF".eval_handlebars)
51
55
 
52
- assert_equal("ABC", eval_handlebars("{{ 'ABC' }}"))
53
- assert_equal("", eval_handlebars("{{ 'ABC' #}}"))
56
+ assert_equal("ABC", "{{ 'ABC' }}".eval_handlebars)
57
+ assert_equal("", "{{ 'ABC' #}}".eval_handlebars)
54
58
 
55
- assert_equal("{{ 'ABC' }}", eval_handlebars("\\{\\{ 'ABC' \\}\\}"))
56
- assert_equal("{{A}}", eval_handlebars("{{ '{'+'{A}'+'}' }}"))
59
+ assert_equal("{{ 'ABC' }}", "\\{\\{ 'ABC' \\}\\}".eval_quoted_braces)
60
+ assert_equal("{{A}}", "{{ '{'+'{A}'+'}' }}".eval_handlebars.eval_quoted_braces)
57
61
  end
58
62
 
59
63
  def test_command_parsing
@@ -122,4 +126,73 @@ class MyShellTester < Minitest::Test
122
126
 
123
127
  end
124
128
 
129
+ def test_mysh_variables
130
+ Mysh.reset_host
131
+
132
+ assert_equal("", MNV[:test])
133
+ assert_equal("", MNV.get_source(:test))
134
+ refute(MNV.key?(:test), "MNV[:test] should not exist.")
135
+
136
+ MNV[:test] = "test 1 2 3"
137
+ assert_equal("test 1 2 3", MNV[:test])
138
+ assert_equal("test 1 2 3", MNV.get_source(:test))
139
+ assert(MNV.key?(:test), "MNV[:test] should exist.")
140
+
141
+ MNV[:test] = ""
142
+ assert_equal("", MNV[:test])
143
+ assert_equal("", MNV.get_source(:test))
144
+ refute(MNV.key?(:test), "MNV[:test] should not exist.")
145
+
146
+ Mysh.try_execute_command("$test = new value")
147
+ assert_equal("new value", MNV[:test])
148
+ assert_equal("new value", MNV.get_source(:test))
149
+ assert(MNV.key?(:test), "MNV[:test] should exist.")
150
+
151
+ Mysh.try_execute_command("$test =")
152
+ assert_equal("", MNV[:test])
153
+ assert_equal("", MNV.get_source(:test))
154
+ refute(MNV.key?(:test), "MNV[:test] should not exist.")
155
+
156
+ Mysh.try_execute_command("$test = true")
157
+ assert(MNV[:test])
158
+ assert_equal("true", MNV.get_source(:test))
159
+ assert(MNV.key?(:test), "MNV[:test] should exist.")
160
+
161
+ Mysh.try_execute_command("$test = off")
162
+ assert_equal(false, MNV[:test])
163
+ assert_equal("off", MNV.get_source(:test))
164
+ assert(MNV.key?(:test), "MNV[:test] should exist.")
165
+
166
+ Mysh.try_execute_command("$a = foo")
167
+ Mysh.try_execute_command("$b = bar")
168
+ Mysh.try_execute_command("$test = $a$b")
169
+ assert_equal("foobar", MNV[:test])
170
+ assert_equal("$a$b", MNV.get_source(:test))
171
+
172
+ Mysh.try_execute_command("$test = $$foo")
173
+ assert_equal("$foo", MNV[:test])
174
+ assert_equal("$$foo", MNV.get_source(:test))
175
+
176
+ Mysh.try_execute_command("$bad = $bad")
177
+ assert_raises { MNV[:bad] }
178
+
179
+ MNV[:test] = "{{(1..9).to_a.join}}"
180
+ assert_equal("123456789", MNV[:test])
181
+ assert_equal("{{(1..9).to_a.join}}", MNV.get_source(:test))
182
+
183
+ Mysh.try_execute_command("$test = $whats_all_this")
184
+ assert_equal("$whats_all_this", MNV[:test])
185
+ assert_equal("$whats_all_this", MNV.get_source(:test))
186
+
187
+ Mysh.try_execute_command("$bad = {{ MNV[:bad] }}")
188
+ assert_raises { MNV[:bad] }
189
+ assert_raises { MNV[:bad] } #Yes test this twice!
190
+ assert_raises { Mysh.try_execute_command("=$bad") }
191
+ assert_raises { Mysh.try_execute_command("=$bad") } #And this too!
192
+
193
+ Mysh.try_execute_command("$bad = OK")
194
+ assert_equal("OK", MNV[:bad])
195
+ assert_equal("OK", MNV[:bad]) #And this too!
196
+ end
197
+
125
198
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mysh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Camilleri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-11 00:00:00.000000000 Z
11
+ date: 2016-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: 0.6.11
103
+ version: 0.7.2
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: 0.6.11
110
+ version: 0.7.2
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: vls
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -154,6 +154,8 @@ files:
154
154
  - lib/mysh/expression.rb
155
155
  - lib/mysh/expression/lineage.rb
156
156
  - lib/mysh/external_ruby.rb
157
+ - lib/mysh/handlebars.rb
158
+ - lib/mysh/handlebars/string.rb
157
159
  - lib/mysh/internal.rb
158
160
  - lib/mysh/internal/action.rb
159
161
  - lib/mysh/internal/action_pool.rb
@@ -175,12 +177,14 @@ files:
175
177
  - lib/mysh/internal/actions/help/ruby.txt
176
178
  - lib/mysh/internal/actions/help/show.txt
177
179
  - lib/mysh/internal/actions/help/sub_help.rb
180
+ - lib/mysh/internal/actions/help/vars.txt
178
181
  - lib/mysh/internal/actions/history.rb
179
182
  - lib/mysh/internal/actions/pwd.rb
180
183
  - lib/mysh/internal/actions/show.rb
181
184
  - lib/mysh/internal/actions/show/env.rb
182
185
  - lib/mysh/internal/actions/show/ruby.rb
183
186
  - lib/mysh/internal/actions/type.rb
187
+ - lib/mysh/internal/actions/vars.rb
184
188
  - lib/mysh/internal/actions/vls.rb
185
189
  - lib/mysh/internal/decorate.rb
186
190
  - lib/mysh/internal/format.rb
@@ -191,9 +195,14 @@ files:
191
195
  - lib/mysh/internal/format/object.rb
192
196
  - lib/mysh/internal/format/string.rb
193
197
  - lib/mysh/internal/manage.rb
198
+ - lib/mysh/pre_processor.rb
194
199
  - lib/mysh/quick.rb
200
+ - lib/mysh/shell_variables.rb
201
+ - lib/mysh/shell_variables/evaluate.rb
202
+ - lib/mysh/shell_variables/globalize.rb
203
+ - lib/mysh/shell_variables/shell_variable_keeper.rb
204
+ - lib/mysh/shell_variables/shell_variable_store.rb
195
205
  - lib/mysh/user_input.rb
196
- - lib/mysh/user_input/handlebars.rb
197
206
  - lib/mysh/user_input/parse.rb
198
207
  - lib/mysh/user_input/smart_source.rb
199
208
  - lib/mysh/version.rb