optio 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c821cc770e1e3748a1e1d9e2c296415fbc32d22
4
- data.tar.gz: 46799e0daacbf210a995adc4fa1a14cd7d33bbcd
3
+ metadata.gz: ab15e38b8250f34d485d2d561565cc0073293e1c
4
+ data.tar.gz: 4548155ad36f70ff96c2865736414a96d13a5221
5
5
  SHA512:
6
- metadata.gz: 39408c3c69ab03a324693ff17fe3375c49acaf9cdb53477a28d7cbe301602a7af2297e381ffbfb4911fc70439959f4102dab21b58ed19bb210b5f62ecd16e8df
7
- data.tar.gz: f8ad86453a62dca500e2ee8aca62be913674fd8c7884d7ba59dc10ec25e7e1d1df1fa539661f70eef75db7b8e94a700660a8b399155bb7889262ef33ac2daf2c
6
+ metadata.gz: c19b466a2d5c34f4ba42111784ad4b2f65d0cc18c03b238e7171c7d95e79233e57b98b4a1241fb139d0c2a9a22e96300362ac539e8c27381940151a3adccf332
7
+ data.tar.gz: 9afefd10c6c4e6c13f4887799fba6b021d58bc19a52de479905a119b876355231fee261b73b0b53438798e037ca071234f6382a827f0e6a744c1f9d7f9b27ba7
data/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/optio`. To experiment with that code, run `bin/console` for an interactive prompt.
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
6
5
 
7
6
  ## Installation
8
7
 
@@ -22,7 +21,7 @@ Or install it yourself as:
22
21
 
23
22
  ## Usage
24
23
 
25
- TODO: Write usage instructions here
24
+ Write usage instructions here
26
25
 
27
26
  ## Development
28
27
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -1,6 +1,13 @@
1
1
  module Optio
2
2
  module Exceptions
3
- class SwitchAlreadyExistsError
3
+ # Raised when the same switched is registered more
4
+ # than once
5
+ class SwitchAlreadyExistsError < RuntimeError
6
+ end
7
+
8
+ # Raised when trying to register more than one
9
+ # switch with the same short switch name
10
+ class ShortSwitchAlreadyExistsError < RuntimeError
4
11
  end
5
12
  end
6
13
  end
@@ -1,4 +1,5 @@
1
1
  require 'optparse'
2
+ require 'optio/switch'
2
3
 
3
4
  module Optio
4
5
  # A wrapper class for Ruby's {OptionParser}[https://ruby-doc.org/stdlib-2.4.1/libdoc/optparse/rdoc/OptionParser.html]
@@ -17,6 +18,8 @@ module Optio
17
18
  # Optio::Parser.new do |parser|
18
19
  # parser.subcommand :dance
19
20
  # end
21
+ #
22
+ # TODO expose the option to auto assign short switch
20
23
  class Parser
21
24
  def initialize(&block)
22
25
  @switches = {}
@@ -40,7 +43,8 @@ module Optio
40
43
  # * +:type+ - Expected argument type, {see OptionParser for details}[https://ruby-doc.org/stdlib-2.4.1/libdoc/optparse/rdoc/OptionParser.html#class-OptionParser-label-Type+Coercion]
41
44
  # * +:short:+ - The short switch, i,e +-h+ for +--help+
42
45
  def switch(switch_name, opts = {})
43
- store_parameter(switch_name, opts, @switches)
46
+ switch_obj = Switch.new(switch_name, opts)
47
+ store_parameter(switch_name, switch_obj, @switches)
44
48
  end
45
49
 
46
50
  # TODO support sub commands
@@ -74,9 +78,10 @@ module Optio
74
78
 
75
79
  def rb_parser(parsed_params)
76
80
  OptionParser.new do |rb_parser|
77
- @switches.each do |switch, opts|
78
- rb_parser.on("#{switch.to_s.chars.first} IKO", "--#{switch} IKO", opts[:type], opts[:desc]) do |param|
79
- parsed_params[switch] = param
81
+ @switches.each do |switch_name, switch_obj|
82
+ rb_parser.banner = @banner if @banner
83
+ rb_parser.on(*(switch_obj.rb_parser_args)) do |param|
84
+ parsed_params[switch_name] = param
80
85
  end
81
86
  end
82
87
  end
@@ -0,0 +1,41 @@
1
+ require 'optio/exceptions'
2
+
3
+ module Optio
4
+ class ShortSwitchRegistry
5
+ attr_reader :registered
6
+ attr_reader :pool
7
+
8
+ def initialize
9
+ @registered = {}
10
+ @pool = ('a'..'z').to_a
11
+ end
12
+
13
+ def register(switch_name, short_name)
14
+ if !@pool.include?(short_name)
15
+ raise Exceptions::ShortSwitchAlreadyExistsError,
16
+ "#{short_name} already registered with #{switch_name}"
17
+ end
18
+ @pool.delete(short_name)
19
+ @registered[switch_name] = short_name
20
+ end
21
+
22
+ def get(switch_name)
23
+ switch_list = switch_name.to_s.chars.to_a.uniq
24
+ chosen_switch = switch_list.find do |short_switch|
25
+ @pool.include?(short_switch)
26
+ end
27
+ if !chosen_switch
28
+ chosen_switch = random_short_switch
29
+ end
30
+ @pool.delete(chosen_switch)
31
+ @registered[switch_name] = chosen_switch
32
+ chosen_switch
33
+ end
34
+
35
+ private
36
+
37
+ def random_short_switch
38
+ @pool.shuffle.first
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,23 @@
1
+
2
+ module Optio
3
+ class Switch
4
+ # TODO mandatory switch
5
+ def initialize(name, opts)
6
+ @name = name
7
+ @opts = opts
8
+ end
9
+
10
+ def rb_parser_args
11
+ args = ["--#{@name} #{@name.upcase}"]
12
+ if @opts[:short]
13
+ args.unshift("-#{@opts[:short]} #{@name.upcase}")
14
+ end
15
+ [:type, :desc].each do |key|
16
+ if @opts[key]
17
+ args << @opts[key]
18
+ end
19
+ end
20
+ args
21
+ end
22
+ end
23
+ end
@@ -9,9 +9,9 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Amit Goldberg"]
10
10
  spec.email = ["amit.goldberg@gmail.com"]
11
11
 
12
- spec.summary = %q{}
13
- spec.description = %q{}
14
- spec.homepage = "https://github.com/amitizle/optio"
12
+ spec.summary = %q{A wrapper for Ruby's OptionParser library}
13
+ spec.description = File.read('README.md')
14
+ spec.homepage = "https://rubygems.org/gems/optio"
15
15
  spec.license = "MIT"
16
16
 
17
17
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: optio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amit Goldberg
@@ -52,7 +52,49 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5.0'
55
- description: ''
55
+ description: |
56
+ # Optio
57
+
58
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/optio`. To experiment with that code, run `bin/console` for an interactive prompt.
59
+
60
+
61
+ ## Installation
62
+
63
+ Add this line to your application's Gemfile:
64
+
65
+ ```ruby
66
+ gem 'optio'
67
+ ```
68
+
69
+ And then execute:
70
+
71
+ $ bundle
72
+
73
+ Or install it yourself as:
74
+
75
+ $ gem install optio
76
+
77
+ ## Usage
78
+
79
+ Write usage instructions here
80
+
81
+ ## Development
82
+
83
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
84
+
85
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
86
+
87
+ ## Contributing
88
+
89
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/optio. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
90
+
91
+ ## License
92
+
93
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
94
+
95
+ ## Code of Conduct
96
+
97
+ Everyone interacting in the Optio project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/optio/blob/master/CODE_OF_CONDUCT.md).
56
98
  email:
57
99
  - amit.goldberg@gmail.com
58
100
  executables:
@@ -124,9 +166,11 @@ files:
124
166
  - lib/optio.rb
125
167
  - lib/optio/exceptions.rb
126
168
  - lib/optio/parser.rb
169
+ - lib/optio/short_switch_registry.rb
170
+ - lib/optio/switch.rb
127
171
  - lib/optio/version.rb
128
172
  - optio.gemspec
129
- homepage: https://github.com/amitizle/optio
173
+ homepage: https://rubygems.org/gems/optio
130
174
  licenses:
131
175
  - MIT
132
176
  metadata: {}
@@ -149,5 +193,5 @@ rubyforge_project:
149
193
  rubygems_version: 2.6.11
150
194
  signing_key:
151
195
  specification_version: 4
152
- summary: ''
196
+ summary: A wrapper for Ruby's OptionParser library
153
197
  test_files: []