optio 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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: []