simple-command-parser 1.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.
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