simple-command-parser 1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ff2103f8c893eedfe024caec1c2a7af520cf36fbff06a9eab200c84b0c281941
4
+ data.tar.gz: 1f215bccf6ce68216112926a0acb986ebde70f0f2bca56062d7b073f82622e58
5
+ SHA512:
6
+ metadata.gz: 33f2987956cbc688cb663913cf1d684f889974f3bb1efda5844c3f7bf39565b199b986ff8d8f6316363535b6d8ffa13277316b12997898dd2e5f3e0bcd0a208c
7
+ data.tar.gz: 05c27c24e72139def6a2c3074f964b8788fb985e4d590b8ee8c2ac42297ced1195a08635f21dc38201147ff63f4cd5eef63956cef65cd7adb131de1912c918f9
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .DS_Store
2
+ Gemfile.lock
3
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1 @@
1
+ FIXME
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ Bundler.require
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.test_files = FileList['test/*test.rb']
7
+ end
8
+
9
+ task :default => :test
@@ -0,0 +1,54 @@
1
+ require 'simple_option_parser'
2
+
3
+ module Simple
4
+
5
+ class CommandParser
6
+
7
+ class UsageError < StandardError; end
8
+
9
+ def self.run(*args)
10
+ new.run(*args)
11
+ end
12
+
13
+ def run(args=ARGV, **defaults)
14
+ cmd_name = args.shift or raise UsageError, "No command given"
15
+ cmd_class = Command.find_command(cmd_name) or raise UsageError, "Unknown command: #{cmd_name.inspect}"
16
+ options = defaults.merge(cmd_class.defaults.merge(SimpleOptionParser.parse(args)))
17
+ cmd_class.new(options).tap { |cmd| cmd.run(args) }
18
+ end
19
+
20
+ class Command
21
+
22
+ def self.inherited(klass)
23
+ @@command_classes ||= []
24
+ @@command_classes << klass
25
+ end
26
+
27
+ def self.find_command(name)
28
+ map = @@command_classes.select { |k| k.subclasses.empty? }.map { |k| [k.command_name, k] }.to_h
29
+ map[name]
30
+ end
31
+
32
+ def self.command_name
33
+ name.to_s.
34
+ split('::').last.
35
+ gsub(/([a-z])([A-Z])/, '\1-\2').
36
+ downcase
37
+ end
38
+
39
+ def self.defaults
40
+ {}
41
+ end
42
+
43
+ def initialize(options={})
44
+ options.each do |key, value|
45
+ raise CommandParser::UsageError, "Unknown option: #{key.inspect}" unless respond_to?(key)
46
+ send("#{key}=", value)
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,23 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'simple-command-parser'
3
+ s.version = '1.0'
4
+ s.summary = 'A simple command parser.'
5
+ s.author = 'John Labovitz'
6
+ s.email = 'johnl@johnlabovitz.com'
7
+ s.description = %q{
8
+ Simple::CommandParser is a simple command parser.
9
+ }.strip
10
+ s.license = 'MIT'
11
+ s.homepage = 'http://github.com/jslabovitz/simple-command-parser'
12
+ s.files = `git ls-files`.split("\n")
13
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
15
+ s.require_path = 'lib'
16
+
17
+ s.add_dependency 'simple_option_parser', '~> 0.8'
18
+
19
+ s.add_development_dependency 'bundler', '~> 2.5'
20
+ s.add_development_dependency 'minitest', '~> 5.22'
21
+ s.add_development_dependency 'minitest-power_assert', '~> 0.3'
22
+ s.add_development_dependency 'rake', '~> 13.2'
23
+ end
@@ -0,0 +1,72 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/power_assert'
3
+
4
+ require 'simple-command-parser'
5
+
6
+ class Test < Minitest::Test
7
+
8
+ class Command < Simple::CommandParser::Command
9
+
10
+ attr_accessor :scale
11
+ attr_accessor :result
12
+
13
+ def self.defaults
14
+ super.merge(
15
+ scale: 1,
16
+ )
17
+ end
18
+
19
+ end
20
+
21
+ class Add < Command
22
+
23
+ attr_accessor :format
24
+ attr_accessor :offset
25
+
26
+ def self.defaults
27
+ super.merge(
28
+ format: 'd',
29
+ offset: 0,
30
+ )
31
+ end
32
+
33
+ def run(args)
34
+ @result = "%#{@format}" % ((@offset + args.map(&:to_i).inject(&:+)) * @scale)
35
+ end
36
+
37
+ end
38
+
39
+ def setup
40
+ @parser = Simple::CommandParser.new
41
+ end
42
+
43
+ def test_simple
44
+ result = @parser.run(%w{add 1 2 3}).result
45
+ assert { result == '6' }
46
+ end
47
+
48
+ def test_offset
49
+ result = @parser.run(%w{add --offset=10 1 2 3}).result
50
+ assert { result == '16' }
51
+ end
52
+
53
+ def test_format
54
+ result = @parser.run(%w{add --offset=10 --format=x 1 2 3}).result
55
+ assert { result == '10' }
56
+ end
57
+
58
+ def test_global
59
+ result = @parser.run(%w{add --scale=2 1 2 3}).result
60
+ assert { result == '12' }
61
+ end
62
+
63
+ def test_usage
64
+ begin
65
+ result = @parser.run(%w{bad})&.result
66
+ rescue Simple::CommandParser::UsageError
67
+ nil
68
+ end
69
+ assert { result == nil }
70
+ end
71
+
72
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple-command-parser
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - John Labovitz
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-05-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: simple_option_parser
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.22'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.22'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-power_assert
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '13.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '13.2'
83
+ description: Simple::CommandParser is a simple command parser.
84
+ email: johnl@johnlabovitz.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - ".gitignore"
90
+ - Gemfile
91
+ - README.md
92
+ - Rakefile
93
+ - lib/simple-command-parser.rb
94
+ - simple-command-parser.gemspec
95
+ - test/command_test.rb
96
+ homepage: http://github.com/jslabovitz/simple-command-parser
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubygems_version: 3.5.10
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: A simple command parser.
119
+ test_files:
120
+ - test/command_test.rb