rash-command-shell 0.4.0 → 0.4.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 45f54bfa6b60f6a2a35a32d087ad1a722fb88f36fcd46933ae7145ee9dfc944d
4
- data.tar.gz: 4dd605ed6fcbfb8a5fbacbd4ff11075933e3e6829785f7605442822f4e5fd508
3
+ metadata.gz: f799801cf8b57a584f090320cbd63d7b2e54dbc0e7c66fbac9943d7b75e35417
4
+ data.tar.gz: 34b945f7da8b07813f405417c99d091466215b087fb709e71394ad3b551044a0
5
5
  SHA512:
6
- metadata.gz: 55dde4dead963ce469de63b5c7490224d3d29ca406aafb3ef1d1fd0c2813d3433ba258ed433629fc7983cbe9a399560cf7dee912df871e86cf8c491f3ad83a3b
7
- data.tar.gz: 5fe62b4dcc77acb7774f8b06360d4a4768b6b7bd63633886c40fbdbc7e0af41bd4240cbb1c867912ee11eec287e61f19f468ab9b354ac842346e5b46f6a9caea
6
+ metadata.gz: baa2bc0af9d01199949370a1fbea1b4682962842bab8618cdbc2c0fe4a3f30352daa3c7661da1989a21ee82b589f937ddd702b5a7ab139ecd791827e8192bdd7
7
+ data.tar.gz: b05cc5985f22f293f5574057217c33641db8b409b50ecfb13861b332653c4d67e617ed19980abc50af0467934f41cb8e05d50ea51aa0ba1f9f806fb028645d6e
data/bin/rash CHANGED
@@ -4,7 +4,7 @@ if ARGV.empty?
4
4
  exec("irb", "-r", "rash", *ARGV)
5
5
  elsif ARGV[0] =~ /(-)?-v(ersion)?/
6
6
  puts "Rash (c) 2020 Kellen Watt"
7
- puts "Version 0.4.0" # I may forget to update this
7
+ puts "Version 0.4.1" # I may forget to update this
8
8
  elsif File.exists?(ARGV[0]) && !File.directory?(ARGV[0])
9
9
  require "rash"
10
10
  file = ARGV.shift
@@ -12,6 +12,7 @@ class Environment
12
12
  Dir.chdir(dir.nil? ? "~" : dir.to_s)
13
13
  @working_directory = Dir.pwd
14
14
  ENV["OLDPWD"] = old.to_s
15
+ ENV["PWD"] = Dir.pwd
15
16
  Dir.pwd
16
17
  end
17
18
 
@@ -78,6 +79,10 @@ class Environment
78
79
  end
79
80
  end
80
81
 
82
+ def name?(v)
83
+ v.kind_of?(String) || v.kind_of?(Symbol)
84
+ end
85
+
81
86
  private
82
87
 
83
88
  def common_init
@@ -192,6 +197,11 @@ def which(command)
192
197
  nil
193
198
  end
194
199
 
200
+ # This breaks some default IRB functionality
201
+ # def self.respond_to_missing?(m, *args)
202
+ #
203
+ # which(m.to_s) || ($env.alias?(m) && !$env.aliasing_disabled) || $env.local_method?(m) || super
204
+ # end
195
205
 
196
206
  # Note that I defy convention and don't define `respond_to_missing?`. This
197
207
  # is because doing so screws with irb.
@@ -6,13 +6,13 @@ class Environment
6
6
  def initialize
7
7
  common_init
8
8
  @working_directory = Directory.root("/")
9
- traverse_filetree("/", Dir.pwd)
10
9
  end
11
10
 
12
11
  def chdir(dir = nil)
13
12
  old = @working_directory
14
- traverse_filetree(Dir.pwd, (dir.nil? ? "~" : dir.to_s))
13
+ traverse_filetree(@working_directory.to_s, (dir.nil? ? "~" : dir.to_s))
15
14
  ENV["OLDPWD"] = old.to_s
15
+ ENV["PWD"] = Dir.pwd
16
16
  Dir.pwd
17
17
  end
18
18
 
@@ -38,6 +38,26 @@ class Environment
38
38
  @working_directory.local_method(name).call(*args, &block)
39
39
  end
40
40
 
41
+ def local_var(name, v = nil, locked: false)
42
+ res = nil
43
+ if v.nil?
44
+ res = @working_directory.local_variable(name)
45
+ else
46
+ @working_directory.set_local_variable(name, v)
47
+ res = v
48
+ end
49
+ @working_directory.lock_variable(name) if locked
50
+ res
51
+ end
52
+
53
+ def local_var?(name)
54
+ @working_directory.local_variable?(name)
55
+ end
56
+
57
+ def local_vars
58
+ @working_directory.local_variables
59
+ end
60
+
41
61
  private
42
62
 
43
63
  # from and to are strings
@@ -83,6 +103,8 @@ class Environment
83
103
  @children = []
84
104
  @local_methods = parent&.unlocked_local_methods || {}
85
105
  @locked_methods = []
106
+ @local_variables = {}
107
+ @locked_variables = []
86
108
  end
87
109
 
88
110
  def local_method(name)
@@ -107,6 +129,55 @@ class Environment
107
129
  def local_method?(name)
108
130
  @local_methods.key?(name.to_sym)
109
131
  end
132
+
133
+ def local_variable(name)
134
+ name = name.to_sym
135
+ @local_variables[name] || @parent&.unlocked_local_variable(name)
136
+ end
137
+
138
+ def local_variable?(name)
139
+ @local_variables.include?(name.to_sym) || !!@parent&.unlocked_local_variable?(name.to_sym)
140
+ end
141
+
142
+ def local_variables
143
+ @local_variables.keys + (@parent&.unlocked_local_variables).to_a
144
+ end
145
+
146
+ def set_local_variable(name, value)
147
+ name = name.to_sym
148
+ if !@local_variables.key?(name) && @parent&.unlocked_local_variable?(name)
149
+ @parent&.set_local_variable(name, value)
150
+ else
151
+ @local_variables[name] = value
152
+ end
153
+ end
154
+
155
+ def unlocked_local_variables
156
+ @local_variables.keys.filter{|k| !@locked_variables.include?(k)} + (@parent&.unlocked_local_variables).to_a
157
+ end
158
+
159
+ def unlocked_local_variable(name)
160
+ name = name.to_sym
161
+ @local_variables.filter{|k| !@locked_variables.include?(k)}[name] || @parent&.unlocked_local_variable(name)
162
+ end
163
+
164
+ def unlocked_local_variable?(name)
165
+ name = name.to_sym
166
+ @local_variables.filter{|k,_v| !@locked_variables.include?(k)}.key?(name) ||
167
+ !!@parent&.unlocked_local_variable?(name)
168
+ end
169
+
170
+ def lock_variable(name)
171
+ n = name.to_sym
172
+ raise NameError.new("#{name} is not a local variable", n) unless @local_variables.key?(n)
173
+ @locked_variables << n unless @locked_variables.include?(n)
174
+ n
175
+ end
176
+
177
+ def clear_local_variable(name)
178
+ @local_variables.delete(name.to_sym)
179
+ name.to_sym
180
+ end
110
181
 
111
182
  def root?
112
183
  parent.nil?
@@ -161,3 +232,4 @@ def self.method_missing(m, *args, &block)
161
232
  end
162
233
 
163
234
  $env = Environment.new
235
+ $env.chdir(Dir.pwd)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rash-command-shell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kellen Watt