yap-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 +4 -4
- data/.gitignore +2 -0
- data/addons/history/history.rb +2 -0
- data/addons/keyboard_macros/keyboard_macros.rb +60 -2
- data/addons/tab_completion/tab_completion.rb +13 -0
- data/bin/yap-dev +0 -4
- data/lib/tasks/gem.rake +1 -1
- data/lib/yap.rb +3 -0
- data/lib/yap/shell.rb +12 -0
- data/lib/yap/shell/aliases.rb +18 -4
- data/lib/yap/shell/builtins/alias.rb +1 -1
- data/lib/yap/shell/commands.rb +12 -0
- data/lib/yap/shell/evaluation.rb +77 -10
- data/lib/yap/shell/evaluation/shell_expansions.rb +22 -8
- data/lib/yap/shell/execution/builtin_command_execution.rb +5 -1
- data/lib/yap/shell/execution/context.rb +8 -0
- data/lib/yap/shell/execution/file_system_command_execution.rb +20 -7
- data/lib/yap/shell/execution/ruby_command_execution.rb +60 -65
- data/lib/yap/shell/execution/shell_command_execution.rb +3 -0
- data/lib/yap/shell/repl.rb +14 -5
- data/lib/yap/shell/version.rb +1 -1
- data/lib/yap/world.rb +4 -0
- data/lib/yap/world/addons.rb +56 -13
- data/rcfiles/.yaprc +7 -1
- data/yap-shell.gemspec +2 -1
- metadata +18 -4
data/lib/yap/world/addons.rb
CHANGED
@@ -16,7 +16,12 @@ module Yap
|
|
16
16
|
@addon_name ||= self.name.split(/::/).last.scan(/[A-Z][^A-Z]+/).map(&:downcase).reject{ |f| f == "addon" }.join("_").to_sym
|
17
17
|
end
|
18
18
|
|
19
|
+
def debug_log(msg)
|
20
|
+
Treefell['addons'].puts "addon=#{addon_name} #{msg}"
|
21
|
+
end
|
22
|
+
|
19
23
|
def require(name)
|
24
|
+
Treefell['shell'].puts "addon is requiring: #{name}"
|
20
25
|
directory = File.dirname caller[0].split(':').first
|
21
26
|
lib_path = File.join directory, "lib"
|
22
27
|
support_file = File.join lib_path, "#{name}.rb"
|
@@ -26,8 +31,10 @@ module Yap
|
|
26
31
|
o
|
27
32
|
end
|
28
33
|
if File.exists?(support_file) && namespace
|
34
|
+
Treefell['shell'].puts "#{name} is found in addon, loading #{support_file} in context of #{namespace}"
|
29
35
|
namespace.module_eval IO.read(support_file), support_file, lineno=1
|
30
36
|
else
|
37
|
+
Treefell['shell'].puts "#{name} not found in addon, falling back to super"
|
31
38
|
super(name)
|
32
39
|
end
|
33
40
|
end
|
@@ -37,6 +44,10 @@ module Yap
|
|
37
44
|
def addon_name
|
38
45
|
@addon_name ||= self.class.addon_name
|
39
46
|
end
|
47
|
+
|
48
|
+
def debug_log(msg)
|
49
|
+
self.class.debug_log(msg)
|
50
|
+
end
|
40
51
|
end
|
41
52
|
end
|
42
53
|
|
@@ -51,33 +62,51 @@ module Yap
|
|
51
62
|
module Addons
|
52
63
|
def self.syntax_ok?(file)
|
53
64
|
`ruby -c #{file}`
|
54
|
-
$?.exitstatus == 0
|
65
|
+
($?.exitstatus == 0).tap do |result|
|
66
|
+
Treefell['shell'].puts "is syntax ok?(#{file.inspect}) #{result}"
|
67
|
+
end
|
55
68
|
end
|
56
69
|
|
57
70
|
def self.load_rcfiles(files)
|
71
|
+
Treefell['shell'].puts "loading rcfiles #{files.inspect}"
|
58
72
|
files.map do |file|
|
59
|
-
|
60
|
-
|
73
|
+
if File.exists?(file)
|
74
|
+
RcFile.new file
|
75
|
+
else
|
76
|
+
Treefell['shell'].puts "skipping non-existent rcfile #{file.inspect} "
|
77
|
+
end
|
78
|
+
end.flatten.compact
|
61
79
|
end
|
62
80
|
|
63
81
|
def self.load_directories(directories)
|
82
|
+
Treefell['shell'].puts "loading addon directories: #{directories.inspect}"
|
64
83
|
directories.map do |d|
|
65
|
-
|
66
|
-
|
67
|
-
|
84
|
+
if File.directory?(d)
|
85
|
+
load_directory(d).map(&:new)
|
86
|
+
else
|
87
|
+
Treefell['shell'].puts "skipping addon directory #{d.inspect}, does not exist or is not a directory"
|
88
|
+
end
|
89
|
+
end.flatten.compact.tap do |results|
|
90
|
+
Treefell['shell'].puts "loaded addons: #{results.inspect}"
|
91
|
+
end
|
68
92
|
end
|
69
93
|
|
70
94
|
class RcFile < Addon
|
71
|
-
|
72
|
-
|
95
|
+
attr_reader :file
|
96
|
+
|
97
|
+
def initialize(file)
|
98
|
+
@file = file
|
73
99
|
end
|
74
100
|
|
75
101
|
def initialize_world(world)
|
76
|
-
|
102
|
+
Treefell['shell'].puts "initializing rcfile: #{file}"
|
103
|
+
world.instance_eval File.read(@file)
|
77
104
|
end
|
78
105
|
end
|
79
106
|
|
80
107
|
def self.load_directory(directory)
|
108
|
+
directory = File.expand_path(directory)
|
109
|
+
Treefell['shell'].puts "loading addon from directory: #{directory}"
|
81
110
|
namespace = File.basename(directory).
|
82
111
|
split(/[_-]/).
|
83
112
|
map(&:capitalize).join
|
@@ -96,23 +125,35 @@ module Yap
|
|
96
125
|
end
|
97
126
|
|
98
127
|
Yap::World::UserAddons.const_set namespace, addon_module
|
128
|
+
Treefell['shell'].puts "creating addon namespace: Yap::World::UserAddons::#{namespace}"
|
99
129
|
|
100
130
|
lib_path = File.join directory, "lib"
|
131
|
+
Treefell['shell'].puts "prepending addon path to $LOAD_PATH: #{lib_path}"
|
101
132
|
$LOAD_PATH.unshift lib_path
|
102
133
|
|
103
|
-
gemfiles =
|
104
|
-
|
105
|
-
|
134
|
+
gemfiles = Dir["#{directory}/Gemfile"]
|
135
|
+
Treefell['shell'].puts "looking for Gemfile in #{namespace} addon directory: #{directory}"
|
136
|
+
if gemfiles.any?
|
137
|
+
gemfiles.each do |gemfile|
|
138
|
+
Treefell['shell'].puts "loading #{gemfile} for addon"
|
139
|
+
eval File.read(gemfile)
|
140
|
+
end
|
141
|
+
else
|
142
|
+
Treefell['shell'].puts "No Gemfile found for #{namespace} addon"
|
106
143
|
end
|
107
144
|
|
108
145
|
Dir["#{directory}/*.rb"].map do |addon_file|
|
109
146
|
load_file(addon_file, namespace:namespace, dir:directory, addon_module:addon_module)
|
110
147
|
end
|
111
148
|
ensure
|
112
|
-
|
149
|
+
if lib_path
|
150
|
+
Treefell['shell'].puts "Removing addon #{lib_path} path from $LOAD_PATH"
|
151
|
+
$LOAD_PATH.delete(lib_path)
|
152
|
+
end
|
113
153
|
end
|
114
154
|
|
115
155
|
def self.load_file(file, dir:, namespace:, addon_module:)
|
156
|
+
Treefell['shell'].puts "loading #{namespace} addon file: #{file}"
|
116
157
|
klass_name = file.sub(dir, "").
|
117
158
|
sub(/^#{Regexp.escape(File::Separator)}/, "").
|
118
159
|
sub(File.extname(file.to_s), "").
|
@@ -128,6 +169,8 @@ module Yap
|
|
128
169
|
else
|
129
170
|
raise("Did not find #{klass_name} in #{file}")
|
130
171
|
end
|
172
|
+
end.tap do |loaded_addon|
|
173
|
+
Treefell['shell'].puts "loaded #{File.dirname(file)} as #{loaded_addon.inspect}"
|
131
174
|
end
|
132
175
|
end
|
133
176
|
end
|
data/rcfiles/.yaprc
CHANGED
@@ -259,7 +259,13 @@ end
|
|
259
259
|
|
260
260
|
func :'run-modified-specs' do |stdin:, stdout:|
|
261
261
|
str = `git status`
|
262
|
-
|
262
|
+
files = str.scan(/\S+.rb/)
|
263
|
+
specs, non_specs = files.partition { |file| file.match(/\S+_spec.rb/) }
|
264
|
+
non_specs.each do |non_spec|
|
265
|
+
filename_without_extension = non_spec.gsub(/^[^\/]+\//, '').gsub(/\.rb$/, '')
|
266
|
+
specs.concat Dir["spec/**/*#{filename_without_extension}_spec.rb"]
|
267
|
+
end
|
268
|
+
|
263
269
|
cmd = "bundle exec rspec #{specs.join(' ')}"
|
264
270
|
stdout.puts cmd
|
265
271
|
shell cmd
|
data/yap-shell.gemspec
CHANGED
@@ -60,11 +60,12 @@ Gem::Specification.new do |spec|
|
|
60
60
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
61
61
|
spec.require_paths = ["lib"]
|
62
62
|
|
63
|
-
spec.add_dependency "yap-shell-parser", "~> 0.
|
63
|
+
spec.add_dependency "yap-shell-parser", "~> 0.6.1"
|
64
64
|
spec.add_dependency "term-ansicolor", "~> 1.3"
|
65
65
|
spec.add_dependency "ruby-termios", "~> 0.9.6"
|
66
66
|
spec.add_dependency "ruby-terminfo", "~> 0.1.1"
|
67
67
|
spec.add_dependency "yap-rawline", "~> 0.3.1"
|
68
|
+
spec.add_dependency "treefell", "~> 0.2.3"
|
68
69
|
|
69
70
|
spec.add_development_dependency "bundler", "~> 1.6"
|
70
71
|
spec.add_development_dependency "rake", "~> 10"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yap-shell
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zach Dennis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yap-shell-parser
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.6.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.6.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: term-ansicolor
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.3.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: treefell
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.2.3
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.2.3
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: bundler
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|