argos 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.
Files changed (7) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +22 -0
  3. data/README.md +97 -0
  4. data/Rakefile +64 -0
  5. data/example/args.rb +39 -0
  6. data/lib/argos.rb +98 -0
  7. metadata +59 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: db10ec4b4ba706521829ff94256f6aeeb535583d
4
+ data.tar.gz: 9a05741bec97fcbe78f1a895ece95f82722c7cb9
5
+ SHA512:
6
+ metadata.gz: 2de75d97e7d47de815118087efd18b254c6e763be3825a7beb70aa3c4521cca54ff0334911bf3b14955f6152699f75195c23197f2fb1fb0af0807019b5a041f6
7
+ data.tar.gz: a3ae1af737afd333e7d8a8f14f15cce213ee94f9d41e8c573d748fe78bad76df77e74c008881852f69a1c6ed76877a6285b523893120556ceccc434756fe5a98
data/COPYING ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2006-2014, Joel VanderWerf, vjoel@users.sourceforge.net
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+
13
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
17
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,97 @@
1
+ argos
2
+ ====
3
+
4
+ A slim command-line parser that does one thing well: turn an array of
5
+ strings, such as ARGV, into a hash of recognized options and their
6
+ arguments, leaving unrecognized strings in the original array.
7
+
8
+ Argos was Odysseus' faithful dog, who was good at recognizing ;)
9
+
10
+ Installation
11
+ ------------
12
+
13
+ Install as gem:
14
+
15
+ gem install 'argos'
16
+
17
+ or simply copy argos.rb into your project's lib dir.
18
+
19
+ Synopsis
20
+ --------
21
+
22
+ require 'argos'
23
+
24
+ optdef = {
25
+ "v" => true,
26
+ "n" => proc {|arg| Integer(arg)}
27
+ }
28
+
29
+ argv = %w{-v -n10 filename}
30
+ opts = Argos.parse_options(argv, optdef)
31
+ p opts # ==> {"v"=>true, "n"=>10}
32
+ p argv # ==> ["filename"]
33
+
34
+ See also [example dir](example/).
35
+
36
+ Features
37
+ --------
38
+
39
+ - Operates on ARGV or any given array of strings.
40
+
41
+ - Output is a hash of {option => value, ...}.
42
+
43
+ - You can merge this hash on top of a hash of defaults if you want.
44
+
45
+ - Supports both long ("--foo") and short ("-f") options.
46
+
47
+ - A long option with an argument is --foo=bar or --foo bar.
48
+
49
+ - A short option with an argument is -fbar or -f bar.
50
+
51
+ - The options -x and --x are synonymous.
52
+
53
+ - Short options with no args can be combined as -xyz in place of -x -y -z.
54
+
55
+ - If -z takes an argument, then -xyz foo is same as -x -y -z foo.
56
+
57
+ - The string "--" terminates option parsing, leaving the rest untouched.
58
+
59
+ - The string "-" is not considered an option.
60
+
61
+ - ARGV (or other given array) is modified: it has all parsed options
62
+ and arguments removed, so you can use ARGF to treat the rest as input files.
63
+
64
+ - Unrecognized arguments are left in the argument array. You can catch them
65
+ with grep(/^-./), in case you want to pass them on to another program or
66
+ warn the user.
67
+
68
+ - Argument validation and conversion are in terms of an option definition
69
+ hash, which specifies which options are allowed, the number of arguments
70
+ for each (0 or 1), and how to generate the value from the argument, if any.
71
+
72
+ - Repetition of args ("-v -v", or "-vv") can be handled by closures. See
73
+ the example below.
74
+
75
+ - Everything is ducky. For example, handlers only need an #arity method
76
+ and a #[] method to be recognized as callable. Otherwise they are treated
77
+ as static objects.
78
+
79
+
80
+ Limitations
81
+ -----------
82
+
83
+ - A particular option takes either 0 args or 1 arg. There are no optional
84
+ arguments, in the sense of both "-x" and "-x3" being accepted.
85
+
86
+ - Options lose their ordering in the output hash (but they are parsed in
87
+ order and you can keep track using state in the handler closures).
88
+
89
+ - There is no usage/help output.
90
+
91
+
92
+ About
93
+ -----
94
+
95
+ Copyright (C) 2006-2014 Joel VanderWerf, mailto:vjoel@users.sourceforge.net.
96
+
97
+ License is BSD. See [COPYING](COPYING).
@@ -0,0 +1,64 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+
4
+ PRJ = "argos"
5
+
6
+ def version
7
+ @version ||= begin
8
+ require 'argos'
9
+ warn "Argos::VERSION not a string" unless Argos::VERSION.kind_of? String
10
+ Argos::VERSION
11
+ end
12
+ end
13
+
14
+ def tag
15
+ @tag ||= "#{PRJ}-#{version}"
16
+ end
17
+
18
+ desc "Run tests"
19
+ Rake::TestTask.new :test do |t|
20
+ t.libs << "lib"
21
+ t.libs << "ext"
22
+ t.test_files = FileList["test/**/*.rb"]
23
+ end
24
+
25
+ desc "Commit, tag, and push repo; build and push gem"
26
+ task :release => "release:is_new_version" do
27
+ require 'tempfile'
28
+
29
+ sh "gem build #{PRJ}.gemspec"
30
+
31
+ file = Tempfile.new "template"
32
+ begin
33
+ file.puts "release #{version}"
34
+ file.close
35
+ sh "git commit --allow-empty -a -v -t #{file.path}"
36
+ ensure
37
+ file.close unless file.closed?
38
+ file.unlink
39
+ end
40
+
41
+ sh "git tag #{tag}"
42
+ sh "git push"
43
+ sh "git push --tags"
44
+
45
+ sh "gem push #{tag}.gem"
46
+ end
47
+
48
+ namespace :release do
49
+ desc "Diff to latest release"
50
+ task :diff do
51
+ latest = `git describe --abbrev=0 --tags --match '#{PRJ}-*'`.chomp
52
+ sh "git diff #{latest}"
53
+ end
54
+
55
+ desc "Log to latest release"
56
+ task :log do
57
+ latest = `git describe --abbrev=0 --tags --match '#{PRJ}-*'`.chomp
58
+ sh "git log #{latest}.."
59
+ end
60
+
61
+ task :is_new_version do
62
+ abort "#{tag} exists; update version!" unless `git tag -l #{tag}`.empty?
63
+ end
64
+ end
@@ -0,0 +1,39 @@
1
+ require 'argos'
2
+
3
+ v = 0
4
+ defaults = {
5
+ "v" => v,
6
+ "port" => 4000,
7
+ "host" => "localhost"
8
+ }
9
+
10
+ optdef = {
11
+ "x" => true,
12
+ "y" => "y",
13
+ "z" => 3,
14
+ "v" => proc {v+=1}, # no argument, but call the proc to get the value
15
+ "port" => proc {|arg| Integer(arg)},
16
+ "n" => proc {|arg| Integer(arg)},
17
+ "t" => proc {|arg| Float(arg)},
18
+ "cmd" => proc {|arg| arg.split(",")}
19
+ }
20
+
21
+ ARGV.replace %w{
22
+ -xyzn5 somefile --port 5000 -t -1.23 -vv -v --unrecognized-option
23
+ --cmd=ls,-l otherfile -- --port
24
+ }
25
+
26
+ begin
27
+ cli_opts = Argos.parse_options(ARGV, optdef)
28
+ rescue Argos::OptionError => ex
29
+ $stderr.puts ex.message
30
+ exit
31
+ end
32
+
33
+ opts = defaults.merge cli_opts
34
+
35
+ p opts
36
+ p ARGV
37
+ unless ARGV.empty?
38
+ puts "Some arg-looking strings were not handled:", *ARGV.grep(/^-./)
39
+ end
@@ -0,0 +1,98 @@
1
+ module Argos
2
+ VERSION = "1.0"
3
+
4
+ module_function
5
+
6
+ # Raised (a) when an option that takes an argument occurs at the end of the
7
+ # argv list, with no argument following it, or (b) when a handler barfs.
8
+ class OptionError < ArgumentError; end
9
+
10
+ # Called when an option that takes an argument occurs at the end of the
11
+ # argv list, with no argument following it.
12
+ def argument_missing opt
13
+ raise OptionError, "#{opt}: no argument provided."
14
+ end
15
+
16
+ def handle opt, handler, *args # :nodoc
17
+ args.empty? ? handler[] : handler[args[0]]
18
+ rescue => ex
19
+ raise OptionError, "#{opt}: #{ex}"
20
+ end
21
+
22
+ # Returns the hash of parsed options and argument values. The +argv+ array
23
+ # is modified: every recognized option and argument is deleted.
24
+ #
25
+ # The +optdef+ hash defines the options and their arguments.
26
+ #
27
+ # Each key is an option name (without "-" chars).
28
+ #
29
+ # The value for a key in +optdef+
30
+ # is used to generate the value for the same key in the options hash
31
+ # returned by this method.
32
+ #
33
+ # If the value has an #arity method and arity > 0, the value is considered to
34
+ # be a handler; it is called with the argument string to return the value
35
+ # associated with the option in the hash returned by the method.
36
+ #
37
+ # If the arity <= 0, the value is considered to be a handler for an option
38
+ # without arguments; it is called with no arguments to return the value of
39
+ # the option.
40
+ #
41
+ # If there is no arity method, the object itself is used as the value of
42
+ # the option.
43
+ #
44
+ # Only one kind of input will cause an exception (not counting exceptions
45
+ # raised by handler code or by bugs):
46
+ #
47
+ # - An option is found at the end of the list, and it requires an argument.
48
+ # This results in a call to #argument_missing, which by default raises
49
+ # OptionError.
50
+ #
51
+ def parse_options argv, optdef
52
+ orig = argv.dup; argv.clear
53
+ opts = {}
54
+
55
+ loop do
56
+ case (argstr=orig.shift)
57
+ when nil, "--"
58
+ argv.concat orig
59
+ break
60
+
61
+ when /^(--)([^=]+)=(.*)/, /^(-)([^-])(.+)/
62
+ short = ($1 == "-"); opt = $2; arg = $3
63
+ unless optdef.key?(opt)
64
+ argv << argstr
65
+ next
66
+ end
67
+ handler = optdef[opt]
68
+ arity = (handler.arity rescue nil)
69
+ opts[opt] =
70
+ case arity
71
+ when nil; orig.unshift("-#{arg}") if short; handler
72
+ when 0,-1; orig.unshift("-#{arg}") if short; handle(opt, handler)
73
+ else handle(opt, handler, arg)
74
+ end
75
+
76
+ when /^--(.+)/, /^-(.)$/
77
+ opt = $1
78
+ unless optdef.key?(opt)
79
+ argv << argstr
80
+ next
81
+ end
82
+ handler = optdef[opt]
83
+ arity = (handler.arity rescue nil)
84
+ opts[opt] =
85
+ case arity
86
+ when nil; handler
87
+ when 0,-1; handle(opt, handler)
88
+ else handle(opt, handler, orig.shift || argument_missing(opt))
89
+ end
90
+
91
+ else
92
+ argv << argstr
93
+ end
94
+ end
95
+
96
+ opts
97
+ end
98
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: argos
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - Joel VanderWerf
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-24 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: 'A slim command-line parser that does one thing well: turn an array of
14
+ arguments into a hash of recognized options and their arguments.'
15
+ email: vjoel@users.sourceforge.net
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files:
19
+ - README.md
20
+ - COPYING
21
+ files:
22
+ - COPYING
23
+ - README.md
24
+ - Rakefile
25
+ - example/args.rb
26
+ - lib/argos.rb
27
+ homepage: https://github.com/vjoel/argos
28
+ licenses:
29
+ - BSD
30
+ metadata: {}
31
+ post_install_message:
32
+ rdoc_options:
33
+ - "--quiet"
34
+ - "--line-numbers"
35
+ - "--inline-source"
36
+ - "--title"
37
+ - argos
38
+ - "--main"
39
+ - README.md
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubyforge_project:
54
+ rubygems_version: 2.2.1
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: Minimal command-line parser
58
+ test_files: []
59
+ has_rdoc: