shell_shock 0.0.5 → 0.0.6

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a473df32bae252fade36508e5e0f9d3c33d0ddf54ee9c29470458fbb6c04d0e2
4
+ data.tar.gz: 15050e03f392c29fd8a68c5e06e7f2c55a8338cf71471442a28c3c806df4a088
5
+ SHA512:
6
+ metadata.gz: a417ea53a0345722e9d095b39632f2e12a5a96553a82e35bbf82aeb9a331d232ff27f16dc866aaa7dcf83e28b15c452bac1722a298c75aa5436122ff32b9c5fb
7
+ data.tar.gz: 2a827992f1aa325bb18b62f6cc95fc454072e10603b2dd6e53eb0b9662f2f92966f91185811f104a360b41847cd18cefe10f772c28f2360197c1a6e0fe46ecec
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ .idea
data/.rubocop.yml ADDED
@@ -0,0 +1,48 @@
1
+ require:
2
+ - rubocop-rspec
3
+ - rubocop-rake
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 3.0
7
+ NewCops: enable
8
+
9
+ Style/StringLiterals:
10
+ Enabled: true
11
+ EnforcedStyle: double_quotes
12
+
13
+ Style/StringLiteralsInInterpolation:
14
+ Enabled: true
15
+ EnforcedStyle: double_quotes
16
+
17
+ Layout/LineLength:
18
+ Max: 120
19
+
20
+ Style/Documentation:
21
+ Enabled: false
22
+
23
+ Metrics/MethodLength:
24
+ Enabled: false
25
+
26
+ Metrics/BlockLength:
27
+ Enabled: false
28
+
29
+ Metrics/AbcSize:
30
+ Enabled: false
31
+
32
+ Metrics/PerceivedComplexity:
33
+ Enabled: false
34
+
35
+ Metrics/CyclomaticComplexity:
36
+ Enabled: false
37
+
38
+ RSpec/InstanceVariable:
39
+ Enabled: false
40
+
41
+ RSpec/ExampleLength:
42
+ Enabled: false
43
+
44
+ RSpec/VerifiedDoubles:
45
+ Enabled: false
46
+
47
+ RSpec/MultipleExpectations:
48
+ Enabled: false
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.3.4
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec
6
+
7
+ gem "rake"
8
+ gem "rspec"
9
+ gem "rubocop"
10
+ gem "rubocop-rake"
11
+ gem "rubocop-rspec"
12
+ gem "solargraph"
data/Gemfile.lock ADDED
@@ -0,0 +1,117 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ shell_shock (0.0.6)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ast (2.4.2)
10
+ backport (1.2.0)
11
+ benchmark (0.3.0)
12
+ diff-lcs (1.5.1)
13
+ e2mmap (0.1.0)
14
+ jaro_winkler (1.6.0)
15
+ json (2.7.2)
16
+ kramdown (2.4.0)
17
+ rexml
18
+ kramdown-parser-gfm (1.1.0)
19
+ kramdown (~> 2.0)
20
+ language_server-protocol (3.17.0.3)
21
+ nokogiri (1.16.6-aarch64-linux)
22
+ racc (~> 1.4)
23
+ nokogiri (1.16.6-arm-linux)
24
+ racc (~> 1.4)
25
+ nokogiri (1.16.6-arm64-darwin)
26
+ racc (~> 1.4)
27
+ nokogiri (1.16.6-x86-linux)
28
+ racc (~> 1.4)
29
+ nokogiri (1.16.6-x86_64-darwin)
30
+ racc (~> 1.4)
31
+ nokogiri (1.16.6-x86_64-linux)
32
+ racc (~> 1.4)
33
+ parallel (1.25.1)
34
+ parser (3.3.4.0)
35
+ ast (~> 2.4.1)
36
+ racc
37
+ racc (1.8.0)
38
+ rainbow (3.1.1)
39
+ rake (13.2.1)
40
+ rbs (2.8.4)
41
+ regexp_parser (2.9.2)
42
+ reverse_markdown (2.1.1)
43
+ nokogiri
44
+ rexml (3.3.2)
45
+ strscan
46
+ rspec (3.13.0)
47
+ rspec-core (~> 3.13.0)
48
+ rspec-expectations (~> 3.13.0)
49
+ rspec-mocks (~> 3.13.0)
50
+ rspec-core (3.13.0)
51
+ rspec-support (~> 3.13.0)
52
+ rspec-expectations (3.13.1)
53
+ diff-lcs (>= 1.2.0, < 2.0)
54
+ rspec-support (~> 3.13.0)
55
+ rspec-mocks (3.13.1)
56
+ diff-lcs (>= 1.2.0, < 2.0)
57
+ rspec-support (~> 3.13.0)
58
+ rspec-support (3.13.1)
59
+ rubocop (1.65.0)
60
+ json (~> 2.3)
61
+ language_server-protocol (>= 3.17.0)
62
+ parallel (~> 1.10)
63
+ parser (>= 3.3.0.2)
64
+ rainbow (>= 2.2.2, < 4.0)
65
+ regexp_parser (>= 2.4, < 3.0)
66
+ rexml (>= 3.2.5, < 4.0)
67
+ rubocop-ast (>= 1.31.1, < 2.0)
68
+ ruby-progressbar (~> 1.7)
69
+ unicode-display_width (>= 2.4.0, < 3.0)
70
+ rubocop-ast (1.31.3)
71
+ parser (>= 3.3.1.0)
72
+ rubocop-rake (0.6.0)
73
+ rubocop (~> 1.0)
74
+ rubocop-rspec (3.0.3)
75
+ rubocop (~> 1.61)
76
+ ruby-progressbar (1.13.0)
77
+ solargraph (0.50.0)
78
+ backport (~> 1.2)
79
+ benchmark
80
+ bundler (~> 2.0)
81
+ diff-lcs (~> 1.4)
82
+ e2mmap
83
+ jaro_winkler (~> 1.5)
84
+ kramdown (~> 2.3)
85
+ kramdown-parser-gfm (~> 1.1)
86
+ parser (~> 3.0)
87
+ rbs (~> 2.0)
88
+ reverse_markdown (~> 2.0)
89
+ rubocop (~> 1.38)
90
+ thor (~> 1.0)
91
+ tilt (~> 2.0)
92
+ yard (~> 0.9, >= 0.9.24)
93
+ strscan (3.1.0)
94
+ thor (1.3.1)
95
+ tilt (2.4.0)
96
+ unicode-display_width (2.5.0)
97
+ yard (0.9.36)
98
+
99
+ PLATFORMS
100
+ aarch64-linux
101
+ arm-linux
102
+ arm64-darwin
103
+ x86-linux
104
+ x86_64-darwin
105
+ x86_64-linux
106
+
107
+ DEPENDENCIES
108
+ rake
109
+ rspec
110
+ rubocop
111
+ rubocop-rake
112
+ rubocop-rspec
113
+ shell_shock!
114
+ solargraph
115
+
116
+ BUNDLED WITH
117
+ 2.5.11
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
data/example/adventure.rb CHANGED
@@ -1,21 +1,23 @@
1
- $: << File.dirname(__FILE__)+'/../lib'
1
+ # frozen_string_literal: true
2
2
 
3
- require 'shell_shock/context'
3
+ $LOAD_PATH << "#{File.dirname(__FILE__)}/../lib"
4
+
5
+ require "shell_shock/context"
4
6
 
5
7
  class MoveCommand
6
8
  attr_reader :usage, :help
7
9
 
8
- def initialize room
10
+ def initialize(room)
9
11
  @room = room
10
- @usage = '<direction>'
11
- @help = 'moves to the adjoining room in the specified direction'
12
+ @usage = "<direction>"
13
+ @help = "moves to the adjoining room in the specified direction"
12
14
  end
13
15
 
14
- def completion text
16
+ def completion(text)
15
17
  @room.connections.keys.grep(/^#{text}/).sort
16
18
  end
17
19
 
18
- def execute direction
20
+ def execute(direction)
19
21
  room = @room.connections[direction]
20
22
  if room
21
23
  AdventureContext.new(room).push
@@ -28,52 +30,54 @@ end
28
30
  class AdventureContext
29
31
  include ShellShock::Context
30
32
 
31
- def initialize room
33
+ def initialize(room)
32
34
  puts room.description
33
35
  @prompt = "#{room.name} > "
34
- add_command MoveCommand.new(room), 'go'
36
+ add_command MoveCommand.new(room), "go"
35
37
  end
36
38
  end
37
39
 
38
40
  class Room
39
41
  attr_reader :name, :description, :connections
40
- def initialize name, description
41
- @name, @description = name, description
42
+
43
+ def initialize(name, description)
44
+ @name = name
45
+ @description = description
42
46
  @connections = {}
43
47
  end
44
48
 
45
- def add direction, room
49
+ def add(direction, room)
46
50
  @connections[direction] = room
47
51
  end
48
52
  end
49
53
 
50
- START = Room.new 'clearing', <<EOF
51
- You have entered a clearing.
54
+ START = Room.new "clearing", <<~DESCRIPTION
55
+ You have entered a clearing.
52
56
 
53
- A dead goat lies on the ground in front of you
54
- EOF
57
+ A dead goat lies on the ground in front of you
58
+ DESCRIPTION
55
59
 
56
- CAVE_ENTRANCE = Room.new 'cave entrance', <<EOF
57
- You have arrived at the entrance to a cave.
60
+ CAVE_ENTRANCE = Room.new "cave entrance", <<~DESCRIPTION
61
+ You have arrived at the entrance to a cave.
58
62
 
59
- A foul smell is emitting from the cave. Some smoke
60
- can be seen off off to the east.
61
- EOF
63
+ A foul smell is emitting from the cave. Some smoke
64
+ can be seen off off to the east.
65
+ DESCRIPTION
62
66
 
63
- CAMP_SITE = Room.new 'camp site', <<EOF
64
- You have arrived in a camp site.
67
+ CAMP_SITE = Room.new "camp site", <<~DESCRIPTION
68
+ You have arrived in a camp site.
65
69
 
66
- There is a fire that has been recently put out.
67
- EOF
70
+ There is a fire that has been recently put out.
71
+ DESCRIPTION
68
72
 
69
- CAVE = Room.new 'cave', <<EOF
70
- You have entered a dark cave.
73
+ CAVE = Room.new "cave", <<~DESCRIPTION
74
+ You have entered a dark cave.
71
75
 
72
- A faint growling sound can be heard.
73
- EOF
76
+ A faint growling sound can be heard.
77
+ DESCRIPTION
74
78
 
75
- START.add 'north', CAVE_ENTRANCE
76
- CAVE_ENTRANCE.add 'east', CAMP_SITE
77
- CAVE_ENTRANCE.add 'north', CAVE
79
+ START.add "north", CAVE_ENTRANCE
80
+ CAVE_ENTRANCE.add "east", CAMP_SITE
81
+ CAVE_ENTRANCE.add "north", CAVE
78
82
 
79
- AdventureContext.new(START).push
83
+ AdventureContext.new(START).push
@@ -1,25 +1,27 @@
1
- $: << File.dirname(__FILE__)+'/../lib'
1
+ # frozen_string_literal: true
2
2
 
3
- require 'shell_shock/context'
4
- require 'find'
5
- require 'pathname'
3
+ $LOAD_PATH << "#{File.dirname(__FILE__)}/../lib"
4
+
5
+ require "shell_shock/context"
6
+ require "find"
7
+ require "pathname"
6
8
 
7
9
  class Finder
8
10
  attr_reader :files
9
11
 
10
- def initialize path
12
+ def initialize(path)
11
13
  @path = path
12
14
  end
13
15
 
14
- def refresh pattern
16
+ def refresh(pattern)
15
17
  files = []
16
18
  here = Pathname.new(File.expand_path(@path))
17
19
  Find.find(File.expand_path(@path)) do |p|
18
- if File.basename(p).start_with?('.')
20
+ if File.basename(p).start_with?(".")
19
21
  Find.prune
20
22
  else
21
23
  path = Pathname.new(p).relative_path_from(here).to_s
22
- files << path if path.start_with?(pattern) and yield(p)
24
+ files << path if path.start_with?(pattern) && yield(p)
23
25
  end
24
26
  end
25
27
  files
@@ -29,67 +31,69 @@ end
29
31
  class CatFileCommand
30
32
  include ShellShock::Logger
31
33
 
32
- def initialize path
34
+ def initialize(path)
33
35
  @finder = Finder.new path
34
36
  end
35
37
 
36
38
  def usage
37
- '<file name>'
39
+ "<file name>"
38
40
  end
39
41
 
40
42
  def help
41
- 'displays the content of a file'
43
+ "displays the content of a file"
42
44
  end
43
45
 
44
- def completion text
46
+ def completion(text)
45
47
  log { "cat command completing \"#{text}\"" }
46
- @finder.refresh(text) {|path| File.file? path }
48
+ @finder.refresh(text) { |path| File.file? path }
47
49
  end
48
50
 
49
- def execute path=nil
51
+ def execute(path = nil)
50
52
  return unless path
51
- File.open(path) {|f| f.each_with_index {|l,i| puts "#{i+1}: #{l}" } }
53
+
54
+ File.open(path) { |f| f.each_with_index { |l, i| puts "#{i + 1}: #{l}" } }
52
55
  end
53
56
  end
54
57
 
55
58
  class ChangeDirectoryCommand
56
59
  include ShellShock::Logger
57
60
 
58
- def initialize path
61
+ def initialize(path)
59
62
  @path = path
60
63
  @finder = Finder.new path
61
64
  end
62
65
 
63
66
  def usage
64
- '<directory name>'
67
+ "<directory name>"
65
68
  end
66
69
 
67
70
  def help
68
- 'switches to a new shell context in the specified directory'
71
+ "switches to a new shell context in the specified directory"
69
72
  end
70
73
 
71
- def completion text
74
+ def completion(text)
72
75
  log { "cd command completing \"#{text}\"" }
73
- @finder.refresh(text) {|path| path != '.' and File.directory? path }
76
+ @finder.refresh(text) { |path| path != "." and File.directory? path }
74
77
  end
75
78
 
76
- def execute text=nil
77
- return unless text
79
+ def execute(text = nil)
80
+ return unless text
81
+
78
82
  log { "pushing new shell in \"#{text}\"" }
79
- DirectoryContext.new(@path+'/'+text).push
83
+ DirectoryContext.new("#{@path}/#{text}").push
80
84
  end
81
85
  end
82
86
 
83
87
  class DirectoryContext
84
88
  include ShellShock::Context
85
89
 
86
- def initialize path
90
+ def initialize(path)
87
91
  @prompt_text = "#{path} > "
88
92
  @commands = {
89
- 'cd' => ChangeDirectoryCommand.new(path),
90
- 'cat' => CatFileCommand.new(path)
93
+ "cd" => ChangeDirectoryCommand.new(path),
94
+ "cat" => CatFileCommand.new(path)
91
95
  }
92
96
  end
93
97
  end
94
98
 
95
- DirectoryContext.new('.').push
99
+ DirectoryContext.new(".").push
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ShellShock
2
- module CommandSpec
3
- def with_usage text
4
- it('should display usage') { @command.usage.should == text }
5
- end
4
+ module CommandSpec
5
+ def with_usage(text)
6
+ it("displays usage") { expect(@command.usage).to eq(text) }
7
+ end
6
8
 
7
- def with_help text
8
- it('should display help') { @command.help.should == text }
9
- end
9
+ def with_help(text)
10
+ it("displays help") { expect(@command.help).to eq(text) }
10
11
  end
11
- end
12
+ end
13
+ end
@@ -1,24 +1,26 @@
1
- require 'rubygems'
2
- require 'readline'
3
- require 'shell_shock/exit_command'
4
- require 'shell_shock/help_command'
5
- require 'shell_shock/logger'
1
+ # frozen_string_literal: true
2
+
3
+ require "rubygems"
4
+ require "readline"
5
+ require "shell_shock/exit_command"
6
+ require "shell_shock/help_command"
7
+ require "shell_shock/logger"
6
8
 
7
9
  module ShellShock
8
10
  module Context
9
11
  include Logger
10
12
 
11
- def head_tail string
13
+ def head_tail(string)
12
14
  if string
13
15
  m = /[^ ]+/.match(string.strip)
14
16
  return m[0], m.post_match.strip if m
15
17
  end
16
- return '', ''
18
+ ["", ""]
17
19
  end
18
20
 
19
21
  def refresh
20
22
  refresh_commands if respond_to?(:refresh_commands)
21
- Readline.completer_word_break_characters = ''
23
+ Readline.completer_word_break_characters = ""
22
24
  Readline.completion_proc = lambda do |string|
23
25
  log { "trying completion for \"#{string}\"" }
24
26
  first, rest = head_tail(string)
@@ -28,7 +30,7 @@ module ShellShock
28
30
  if command
29
31
  log { "matched #{first} command" }
30
32
  if command.respond_to?(:completion)
31
- completions = command.completion(rest).map {|c| "#{first} #{c}" }
33
+ completions = command.completion(rest).map { |c| "#{first} #{c}" }
32
34
  else
33
35
  log { "#{first} has no completion proc" }
34
36
  completions = []
@@ -36,7 +38,7 @@ module ShellShock
36
38
  end
37
39
  end
38
40
 
39
- completions ||= @commands.keys.grep( /^#{Regexp.escape(first)}/ ).sort
41
+ completions ||= @commands.keys.grep(/^#{Regexp.escape(first)}/).sort.map { |c| "#{c} " }
40
42
  log { "returning #{completions.inspect} completions" }
41
43
  completions
42
44
  end
@@ -52,13 +54,13 @@ module ShellShock
52
54
 
53
55
  def add_command command, *aliases
54
56
  @commands ||= {}
55
- aliases.each {|a| @commands[a] = command}
57
+ aliases.each { |a| @commands[a] = command }
56
58
  end
57
59
 
58
60
  def push
59
- @prompt ||= ' > '
60
- add_command HelpCommand.new(@commands), '?', 'help'
61
- add_command ExitCommand.new(self), 'exit', 'quit'
61
+ @prompt ||= " > "
62
+ add_command HelpCommand.new(@commands), "help"
63
+ add_command ExitCommand.new(self), "exit"
62
64
  begin
63
65
  until abort?
64
66
  refresh
@@ -76,9 +78,9 @@ module ShellShock
76
78
  end
77
79
  puts
78
80
  end
79
- rescue Interrupt => e
81
+ rescue Interrupt
80
82
  puts
81
83
  end
82
84
  end
83
85
  end
84
- end
86
+ end
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ShellShock
2
4
  class ExitCommand
3
5
  attr_reader :help, :usage
4
6
 
5
- def initialize context
7
+ def initialize(context)
6
8
  @context = context
7
- @usage = ''
8
- @help = 'exits the current context'
9
+ @usage = ""
10
+ @help = "exits the current context"
9
11
  end
10
12
 
11
- def execute ignore
13
+ def execute(_ignore)
12
14
  @context.abort!
13
15
  end
14
- end
15
- end
16
+ end
17
+ end
@@ -1,28 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ShellShock
2
4
  class HelpCommand
3
5
  attr_reader :help, :usage
4
6
 
5
- def initialize commands
7
+ def initialize(commands)
6
8
  @commands = commands
7
- @usage = '<command name>'
8
- @help = 'displays the help information for a command'
9
+ @usage = "<command name>"
10
+ @help = "displays the help information for a command"
9
11
  end
10
12
 
11
- def completion text
13
+ def completion(text)
12
14
  @commands.keys.grep(/^#{Regexp.escape(text)}/).sort
13
15
  end
14
16
 
15
- def execute command
17
+ def execute(command)
16
18
  command.empty? ? display_help_for_commands : display_help_for_command(command)
17
19
  end
18
20
 
19
21
  def display_help_for_commands
20
22
  return if @commands.keys.empty?
21
- puts 'Available commands:'
23
+
24
+ puts "Available commands:"
22
25
  @commands.keys.sort.each { |command| puts command }
23
26
  end
24
27
 
25
- def display_help_for_command command_name
28
+ def display_help_for_command(command_name)
26
29
  command = @commands[command_name]
27
30
  if command
28
31
  puts "Command \"#{command_name}\""
@@ -33,4 +36,4 @@ module ShellShock
33
36
  end
34
37
  end
35
38
  end
36
- end
39
+ end
@@ -1,11 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ShellShock
2
- module Logger
3
- def log message=nil
4
- return unless ENV['LOG_PATH']
5
- File.open(ENV['LOG_PATH'], 'a') do |file|
4
+ module Logger
5
+ def log(message = nil)
6
+ return unless ENV["LOG_PATH"]
7
+
8
+ File.open(ENV.fetch("LOG_PATH", nil), "a") do |file|
6
9
  file.puts message if message
7
10
  file.puts yield if block_given?
8
11
  end
9
12
  end
10
13
  end
11
- end
14
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "shell_shock"
5
+ spec.version = "0.0.6"
6
+ spec.summary = "library for creating simple shell applications using readline"
7
+ spec.description = <<~DESCRIPTION
8
+ This is just some code extracted from a few command line gems i've created (shh and cardigan).
9
+
10
+ I wanted to move the shared functionality (related to creating a shell with readline) to a seperate gem.'
11
+ DESCRIPTION
12
+
13
+ spec.authors << "Mark Ryall"
14
+ spec.email = "mark@ryall.name"
15
+ spec.homepage = "http://github.com/markryall/shell_shock"
16
+ spec.required_ruby_version = Gem::Requirement.new(">= 3.0")
17
+
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+
20
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
22
+ end
23
+ spec.bindir = "exe"
24
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
25
+ spec.require_paths = ["lib"]
26
+ spec.metadata["rubygems_mfa_required"] = "true"
27
+ end
metadata CHANGED
@@ -1,121 +1,62 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: shell_shock
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 5
9
- version: 0.0.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Mark Ryall
13
- autorequire:
14
- bindir: bin
8
+ autorequire:
9
+ bindir: exe
15
10
  cert_chain: []
16
-
17
- date: 2011-01-10 00:00:00 +10:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: rake
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ~>
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- - 8
31
- - 7
32
- version: 0.8.7
33
- type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: gemesis
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ~>
42
- - !ruby/object:Gem::Version
43
- segments:
44
- - 0
45
- - 0
46
- - 4
47
- version: 0.0.4
48
- type: :development
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: rspec
52
- prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
54
- none: false
55
- requirements:
56
- - - ~>
57
- - !ruby/object:Gem::Version
58
- segments:
59
- - 2
60
- - 4
61
- - 0
62
- version: 2.4.0
63
- type: :development
64
- version_requirements: *id003
11
+ date: 2024-07-20 00:00:00.000000000 Z
12
+ dependencies: []
65
13
  description: |
66
14
  This is just some code extracted from a few command line gems i've created (shh and cardigan).
67
-
68
- I wanted to move the shared functionality (related to creating a shell with readline) to a seperate gem.'
69
15
 
16
+ I wanted to move the shared functionality (related to creating a shell with readline) to a seperate gem.'
70
17
  email: mark@ryall.name
71
18
  executables: []
72
-
73
19
  extensions: []
74
-
75
20
  extra_rdoc_files: []
76
-
77
- files:
21
+ files:
22
+ - ".gitignore"
23
+ - ".rubocop.yml"
24
+ - ".tool-versions"
25
+ - Gemfile
26
+ - Gemfile.lock
27
+ - MIT-LICENSE
28
+ - README.rdoc
29
+ - Rakefile
78
30
  - example/adventure.rb
79
- - example/cat.rb
80
31
  - example/file_system.rb
81
32
  - lib/shell_shock/command_spec.rb
82
33
  - lib/shell_shock/context.rb
83
34
  - lib/shell_shock/exit_command.rb
84
35
  - lib/shell_shock/help_command.rb
85
36
  - lib/shell_shock/logger.rb
86
- - README.rdoc
87
- - MIT-LICENSE
88
- has_rdoc: true
37
+ - shell_shock.gemspec
89
38
  homepage: http://github.com/markryall/shell_shock
90
39
  licenses: []
91
-
92
- post_install_message:
40
+ metadata:
41
+ homepage_uri: http://github.com/markryall/shell_shock
42
+ rubygems_mfa_required: 'true'
43
+ post_install_message:
93
44
  rdoc_options: []
94
-
95
- require_paths:
45
+ require_paths:
96
46
  - lib
97
- required_ruby_version: !ruby/object:Gem::Requirement
98
- none: false
99
- requirements:
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
100
49
  - - ">="
101
- - !ruby/object:Gem::Version
102
- segments:
103
- - 0
104
- version: "0"
105
- required_rubygems_version: !ruby/object:Gem::Requirement
106
- none: false
107
- requirements:
50
+ - !ruby/object:Gem::Version
51
+ version: '3.0'
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
108
54
  - - ">="
109
- - !ruby/object:Gem::Version
110
- segments:
111
- - 0
112
- version: "0"
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
113
57
  requirements: []
114
-
115
- rubyforge_project:
116
- rubygems_version: 1.3.7
117
- signing_key:
118
- specification_version: 3
58
+ rubygems_version: 3.5.11
59
+ signing_key:
60
+ specification_version: 4
119
61
  summary: library for creating simple shell applications using readline
120
62
  test_files: []
121
-
data/example/cat.rb DELETED
@@ -1,66 +0,0 @@
1
- require 'shell_shock/context'
2
-
3
- class Prompt
4
- def say text=nil
5
- puts text ? text : ''
6
- end
7
- end
8
-
9
- class CatFileCommand
10
- def initialize path
11
- @path = path
12
- end
13
-
14
- def usage
15
- '<file name>'
16
- end
17
-
18
- def help
19
- 'displays the content of a file'
20
- end
21
-
22
- def completion text
23
- Dir.glob("#{@path}/#{text}*").select {|f| File.file?(f) }
24
- end
25
-
26
- def execute path
27
- File.open(path) {|f| f.each_with_index {|l,i| puts "#{i+1}: #{l}" } }
28
- end
29
- end
30
-
31
- class ChangeDirectoryCommand
32
- def initialize path
33
- @path = path
34
- end
35
-
36
- def usage
37
- '<directory name>'
38
- end
39
-
40
- def help
41
- 'switches to a new shell context in the specified directory'
42
- end
43
-
44
- def completion text
45
- Dir.glob("#{@path}/#{text}*").select {|f| File.directory?(f) }
46
- end
47
-
48
- def execute text
49
- DirectoryContext.new(text).push
50
- end
51
- end
52
-
53
- class DirectoryContext
54
- include ShellShock::Context
55
-
56
- def initialize path
57
- @io = Prompt.new
58
- @prompt_text = "#{path} > "
59
- @commands = {
60
- 'cd' => ChangeDirectoryCommand.new(path),
61
- 'cat' => CatFileCommand.new(path)
62
- }
63
- end
64
- end
65
-
66
- DirectoryContext.new('.').push