rclid 1.0.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,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ Y2JkMTk5NGFmMzk1ODRlOWE1YjNhY2U0MzE4MGRmYmFhOTY2MWZkMw==
5
+ data.tar.gz: !binary |-
6
+ YmEwOTc3YTZjZDhhZWEyMTVhYmVmZjQ3OGY4ZTkyYzdhMGM3ZjRhOA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MjczYjJmZTBhZTk1M2FmN2JlMmI0MTliYWE3ZjE1YmMzYjU4NTkzOWRiYjk2
10
+ OTA3NGZmOTljOTFlMjZjNmNlODY2YjI1MDU2NjUxMDkzZmNkYzNmZTVjYjJk
11
+ OWMwY2ViZTZiZjA5NzJhMTU1ZWU5M2QxOGI0MTI2MTI4MWY1NjM=
12
+ data.tar.gz: !binary |-
13
+ MTg0ZDUwNWM4OGFlNGMxNTM3NGM0YmQxZWU1Y2I5MTA4YTQ1MWJiZWY0OTg2
14
+ MzdiNzBlYjJhNmQ0NGYxOTNmMmU2ZWFhODJiMDgzODk2ZGM0Y2RjZjJjMGNl
15
+ Njc0ODRjZDg3ODhlNmNkMWQ2MGRhMWRiODk2ODU0YTEyN2UxMDc=
data/.buildpath ADDED
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <buildpath>
3
+ <buildpathentry kind="src" path=""/>
4
+ <buildpathentry kind="con" path="org.eclipse.dltk.launching.INTERPRETER_CONTAINER"/>
5
+ </buildpath>
data/.project ADDED
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <projectDescription>
3
+ <name>rclid</name>
4
+ <comment></comment>
5
+ <projects>
6
+ </projects>
7
+ <buildSpec>
8
+ <buildCommand>
9
+ <name>org.eclipse.dltk.core.scriptbuilder</name>
10
+ <arguments>
11
+ </arguments>
12
+ </buildCommand>
13
+ </buildSpec>
14
+ <natures>
15
+ <nature>org.eclipse.dltk.ruby.core.nature</nature>
16
+ </natures>
17
+ </projectDescription>
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rclid.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Matthieu Vachon
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # Rclid
2
+
3
+ The name **Rclid** stands for **Rapid Command Line Interface Development** and
4
+ is pronounced the way you like.
5
+
6
+ As its name implies, the goal of this gem is to provide you with a light
7
+ structure to create command line interfaces like a breeze.
8
+
9
+ Focusing on rapid development, creating basic single command line application
10
+ or a more complex one using composite sub commands is achieve in light speed.
11
+
12
+ If you have ideas that would reduce even more development time and could
13
+ be that this library, come discuss it with me by creating an issue on
14
+ github.com.
15
+
16
+ ## Installation
17
+
18
+ Install it via [rubygems](https://rubygems.org/gems/rclid)
19
+
20
+ $ gem install rclid
21
+
22
+ ## Usage
23
+
24
+ **Rclid** is really to get started with. The simplest command line
25
+ application is like the following (file `hello`):
26
+
27
+ ```ruby
28
+ #!/usr/bin/env
29
+ require 'rclid/base'
30
+
31
+ class Hello < Rclid::Base
32
+ def execute()
33
+ puts "Hello, World!"
34
+ end
35
+ end
36
+
37
+ Hello.new().run()
38
+ ```
39
+
40
+ This will create a command line application that will print `Hello, World!`
41
+ in the console when `hello` is called.
42
+
43
+ Until I improve this section, there is different locations where
44
+ you can check for samples that use **Rclid**
45
+
46
+ * The samples directory contains some samples ruby files that
47
+ use **Rclid**. They are commented at different locations to
48
+ explain the features that you can use.
49
+
50
+ * [Buildozer](https://github.com/maoueh/buildozer) is using **Rclid** for its
51
+ command line interface. Check
52
+ [here](https://github.com/maoueh/buildozer/blob/master/lib/buildozer/cli/root.rb).
53
+
54
+ * [Clivers](https://github.com/maoueh/clivers) is using **Rclid** for its
55
+ command line interface. Check
56
+ [here](https://github.com/maoueh/clivers/blob/master/lib/clivers/cli/root.rb).
57
+
58
+ * My [personal bin](https://github.com/maoueh/personalbin) is on github. I use **Rclid**
59
+ for each command I create.
60
+
61
+ ## Contributing
62
+
63
+ 1. Fork it
64
+
65
+ 2. Create either a fix branch or a feature branch
66
+ * `git checkout -b fix-(name-here)`
67
+ * `git checkout -b feature-(name-here)`
68
+
69
+ 3. Commit your changes
70
+ * `git commit -am 'Message describing the fix or feature'`
71
+
72
+ 4. Push the branch into your repo
73
+ * `git push origin feature-(name-here)`
74
+
75
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |task|
5
+ task.test_files = FileList['test/**/test*.rb']
6
+ end
7
+
8
+ desc "Run tests"
9
+ task :default => :test
data/lib/rclid.rb ADDED
@@ -0,0 +1,2 @@
1
+ module Rclid
2
+ end
data/lib/rclid/base.rb ADDED
@@ -0,0 +1,138 @@
1
+ require 'optparse'
2
+
3
+ require 'rclid/helper/string'
4
+
5
+ module Rclid
6
+ class Base
7
+ @@MAX_WIDTH = 70
8
+
9
+ def initialize(arguments = ARGV, options = {})
10
+ @arguments = arguments
11
+ end
12
+
13
+ ##
14
+ # Specify the name of the command. Used as the default
15
+ # name when usage is not defined. So with this, it is
16
+ # possible to just specify a command name and then
17
+ # let base class handles the rest.
18
+ def name()
19
+ self.class.name.split("::").last().downcase()
20
+ end
21
+
22
+ ##
23
+ # Specify the description of this command.
24
+ # Overriding classes just need to return a
25
+ # string that will be output to terminal
26
+ # as-is. No formatting occurs.
27
+ def usage()
28
+ "Usage: #{name()} (options)"
29
+ end
30
+
31
+ ##
32
+ # Specify the description of this command.
33
+ # Overriding classes just need to return a
34
+ # string that will be formatted correctly
35
+ # for the terminal.
36
+ #
37
+ # Return nil if you dont want a description,
38
+ # this is the default.
39
+ def description()
40
+ nil
41
+ end
42
+
43
+ ##
44
+ # Specify the tail of this command.
45
+ # Overriding classes just need to return a
46
+ # string that will be formatted correctly
47
+ # for the terminal.
48
+ def tail()
49
+ "Available options:"
50
+ end
51
+
52
+ ##
53
+ # Specify additional arguments parse options
54
+ # Use OptoinParser syntax
55
+ def options(parser)
56
+ parser.on_tail("-h", "--help", "Show help") do
57
+ help()
58
+ end
59
+ end
60
+
61
+ ##
62
+ # This is the method that will be invoked to
63
+ # execute the cli command task.
64
+ def execute()
65
+ end
66
+
67
+ ##
68
+ # Show command help for this instance and exit
69
+ # with code 0.
70
+ def help()
71
+ puts @parser
72
+ exit(0)
73
+ end
74
+
75
+ ##
76
+ # Print an error message followed by the parser
77
+ # help.
78
+ def error(message)
79
+ puts "ERROR: #{message}"
80
+ puts ""
81
+
82
+ help()
83
+ end
84
+
85
+ def run()
86
+ @parser = parser()
87
+ @arguments = parser.parse(@arguments)
88
+
89
+ execute()
90
+ end
91
+
92
+ def parser()
93
+ return @parser if @parser
94
+
95
+ parser = OptionParser.new()
96
+
97
+ set_usage(parser)
98
+ set_description(parser)
99
+
100
+ options(parser)
101
+
102
+ set_tail(parser)
103
+ parser
104
+ end
105
+
106
+ def set_usage(parser)
107
+ parser.banner = usage()
108
+ end
109
+
110
+ def set_description(parser)
111
+ set_text(description(), parser,
112
+ :prepend_newline => true,
113
+ :max_width => @@MAX_WIDTH
114
+ )
115
+ end
116
+
117
+ def set_tail(parser)
118
+ set_text(tail(), parser,
119
+ :prepend_newline => true,
120
+ :max_width => @@MAX_WIDTH
121
+ )
122
+ end
123
+
124
+ def set_text(text, parser, options = {})
125
+ return if not text
126
+
127
+ parser.separator("") if options[:prepend_newline]
128
+
129
+ lines = text
130
+ lines = Helper::String::format_text(text, :max_width => options[:max_width]) if not lines.kind_of?(Array)
131
+ lines.each do |line|
132
+ parser.separator(line)
133
+ end
134
+
135
+ parser.separator("") if options[:append_newline]
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,74 @@
1
+ require 'rclid/base'
2
+
3
+ module Rclid
4
+ class Composite < Base
5
+ def initialize(arguments = ARGV)
6
+ super(arguments)
7
+
8
+ @subcommands = subcommands()
9
+ @arguments, @command, @subarguments = split_arguments(arguments)
10
+
11
+ raise "You must provide at least one subcommand in #{self.class}" if !@subcommands || @subcommands.empty?()
12
+ end
13
+
14
+ ##
15
+ # Default implementation of description for composite
16
+ # commands.
17
+ def description()
18
+ lines = ["Available subcommands:", ""]
19
+
20
+ @subcommands.keys().sort().each do |key|
21
+ lines << " #{key}"
22
+ end
23
+
24
+ lines
25
+ end
26
+
27
+ ##
28
+ # Method to be overriden in child classes to specify
29
+ # the map of subcommands available to the user.
30
+ #
31
+ # The key of the map is a symbol reprensenting the
32
+ # command name and the value is a constant representing
33
+ # the class to instantiate when the command name is used
34
+ # by the user.
35
+ #
36
+ # For example:
37
+ # { :build => Namespace::Build, :destroy => Namespace::Destroy }
38
+ #
39
+ def subcommands()
40
+ {}
41
+ end
42
+
43
+ def run()
44
+ @parser = parser()
45
+ @arguments = parser.parse(@arguments)
46
+
47
+ return help() if not @command
48
+
49
+ command_class = @subcommands[@command.to_sym]
50
+ return error("The command #{@command} does not exist") if not command_class
51
+
52
+ command_class.new(@subarguments).run()
53
+ end
54
+
55
+ def split_arguments(arguments)
56
+ main_arguments = arguments
57
+ command = nil
58
+ sub_arguments = []
59
+ subcommands = @subcommands.map {|key, classname| key.to_s()}
60
+
61
+ arguments.each_index do |i|
62
+ if subcommands.include?(arguments[i])
63
+ main_arguments = arguments[0, i]
64
+ command = arguments[i]
65
+ sub_arguments = arguments[i + 1, arguments.length - i + 1]
66
+
67
+ break
68
+ end
69
+ end
70
+
71
+ return [main_arguments, command, sub_arguments]
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,75 @@
1
+ module Rclid
2
+ module Helper
3
+ module String
4
+ def self.camelize(input)
5
+ return nil if not input
6
+
7
+ parts = input.split(/_/).map do |part|
8
+ part.capitalize()
9
+ end
10
+
11
+ parts.join("")
12
+ end
13
+
14
+ def self.format_text(text, options = {})
15
+ tokens = tokenize(text)
16
+ tokens_to_lines(tokens, options)
17
+ end
18
+
19
+ def self.tokenize(text)
20
+ text.scan(/([^\s]+)|(\n\r|\n|\r)|(\s+)/).map do |word, newline, space|
21
+ case
22
+ when word
23
+ { :text => word, :type => :word }
24
+ when newline
25
+ { :text => newline, :type => :newline }
26
+ when space && space =~ /^\s*$/
27
+ { :text => space, :type => :space }
28
+ end
29
+ end
30
+ end
31
+
32
+ def self.tokens_to_lines(tokens, options = {})
33
+ max_width = options[:max_width] || 80;
34
+ indentation = options[:indentation] || ""
35
+ preserve_paragraphs = options[:preserve_paragraphs] == nil ? true : options[:preserve_paragraphs]
36
+
37
+ lines = []
38
+ buffer = indentation
39
+
40
+ newline_count = 0
41
+ tokens.each do |token|
42
+ type = token[:type]
43
+ if type == :newline
44
+ newline_count += 1
45
+ next
46
+ end
47
+
48
+ if preserve_paragraphs and newline_count > 1
49
+ for i in 1..newline_count
50
+ lines << normalize_line(buffer)
51
+ buffer = indentation
52
+ end
53
+ end
54
+
55
+ newline_count = 0;
56
+ text = type == :space ? " " : token[:text]
57
+ potential_width = text.length() + buffer.length()
58
+ if potential_width > max_width
59
+ lines << normalize_line(buffer)
60
+ buffer = indentation
61
+ end
62
+
63
+ buffer += text
64
+ end
65
+
66
+ lines << normalize_line(buffer)
67
+ lines
68
+ end
69
+
70
+ def self.normalize_line(line, options = {})
71
+ line.strip()
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,3 @@
1
+ module Rclid
2
+ VERSION = "1.0.0"
3
+ end
data/rclid.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rclid/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "rclid"
8
+ gem.version = Rclid::VERSION
9
+ gem.authors = ["Matthieu Vachon"]
10
+ gem.email = ["matthieu.o.vachon@gmail.com"]
11
+ gem.summary = "Rapid Command Line Interface Development library"
12
+ gem.description = <<-EOS
13
+ As its name implies, the goal of this gem is to provide you with a light
14
+ structure to create command line interfaces like a breeze.
15
+
16
+ Focusing on rapid development, creating basic single command line application
17
+ or a more complex one using composite subcommands is achieve in light speed.
18
+
19
+ If you have ideas that would reduce even more development time and could
20
+ be that this library, come discuss it with me by creating an issue on
21
+ github.com.
22
+ EOS
23
+
24
+ gem.homepage = "https://github.com/maoueh/rclid"
25
+ gem.license = "MIT"
26
+
27
+ gem.files = `git ls-files`.split($/) - [".gitattributes", ".gitignore"]
28
+ gem.test_files = gem.files.grep(%r{^(test|gem|features)/})
29
+ gem.require_paths = ["lib"]
30
+
31
+ gem.add_development_dependency "bundler", "~> 1.3"
32
+ gem.add_development_dependency "rake"
33
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rclid/base'
4
+
5
+ class Hello < Rclid::Base
6
+ def execute()
7
+ name = @arguments[0] || "World!"
8
+
9
+ puts "Hello, #{name}"
10
+ end
11
+ end
12
+
13
+ Hello.new().run()
@@ -0,0 +1,7 @@
1
+ require 'rclid/base'
2
+
3
+ class Hello < Rclid::Base
4
+ def execute()
5
+ puts "Hello, Subcommand!"
6
+ end
7
+ end
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rclid/composite'
4
+
5
+ require_relative 'hello'
6
+ require_relative 'world'
7
+
8
+ # You extend Rclid::Composite to create a composite command
9
+ class Root < Rclid::Composite
10
+ def name()
11
+ # Usually, it would be your application name
12
+ # (like `clivers` or `nugrant` for example).
13
+ "composite"
14
+ end
15
+
16
+ def subcommands()
17
+ # Return the hash symbol -> Class that
18
+ # represents the sub commands that can
19
+ # be called from this composite. This is
20
+ # required.
21
+ {
22
+ :hello => Hello,
23
+ :world => World,
24
+ }
25
+ end
26
+
27
+ def options(parser)
28
+ super(parser)
29
+ parser.on_tail("-v", "--version", "Show version") do
30
+ version()
31
+ end
32
+ end
33
+
34
+ def version()
35
+ # Usually, it would be your application version
36
+ puts "Composite #{Rclid::VERSION}"
37
+ exit(0)
38
+ end
39
+ end
40
+
41
+ # Only the root needs to be run
42
+ # So this lines must not be added
43
+ # to the subcommands
44
+ Root.new().run()
@@ -0,0 +1,9 @@
1
+ require 'rclid/base'
2
+
3
+ class World < Rclid::Base
4
+ def execute()
5
+ name = @arguments[0] || "World!"
6
+
7
+ puts "Hello, #{name}!"
8
+ end
9
+ end
@@ -0,0 +1,91 @@
1
+ require 'test/unit'
2
+
3
+ require 'rclid/helper/string'
4
+
5
+ module Rclid
6
+ module Helper
7
+ class TestString < Test::Unit::TestCase
8
+ def test_camelize()
9
+ assert_equal(nil, nil)
10
+ assert_equal("", Helper::String.camelize(""))
11
+ assert_equal("Simple", Helper::String.camelize("simple"))
12
+ assert_equal("SimpleComplex", Helper::String.camelize("simple_complex"))
13
+ assert_equal("SimpleComplex", Helper::String.camelize("simple_complex"))
14
+ end
15
+
16
+ def test_tokenize()
17
+ text = " first second "
18
+ tokens = Helper::String.tokenize(text)
19
+
20
+ assert_equal([
21
+ { :text => " ", :type => :space},
22
+ { :text => "first", :type => :word},
23
+ { :text => " ", :type => :space},
24
+ { :text => "second", :type => :word},
25
+ { :text => " ", :type => :space}], tokens)
26
+ end
27
+
28
+ def test_tokenize_with_line_breaks()
29
+ text = <<-EOC
30
+ first
31
+ second
32
+ third
33
+ EOC
34
+ tokens = Helper::String.tokenize(text)
35
+
36
+ assert_equal([
37
+ {:text => " ", :type => :space},
38
+ {:text => "first", :type => :word},
39
+ {:text=>"\n", :type=>:newline},
40
+ {:text => " ", :type => :space},
41
+ {:text => "second", :type => :word},
42
+ {:text=>"\n", :type=>:newline},
43
+ {:text => " ", :type => :space},
44
+ {:text => "third", :type => :word},
45
+ {:text=>"\n", :type=>:newline},
46
+ ], tokens)
47
+ end
48
+
49
+ def test_format_text_simple()
50
+ text = <<-EOC
51
+ Donec ornare consectetur ante non porttitor. Lorem ipsum dolor
52
+ sit amet, consectetur adipiscing elit. Ut consequat lacinia ero.
53
+ EOC
54
+
55
+ assert_equal([
56
+ "Donec ornare consectetur ante non",
57
+ "porttitor. Lorem ipsum dolor sit amet,",
58
+ "consectetur adipiscing elit. Ut",
59
+ "consequat lacinia ero."
60
+ ], Helper::String.format_text(text, :max_width => 40))
61
+ end
62
+
63
+ def test_format_text_advanced()
64
+ text = <<-EOC
65
+ Lorem ipsum dolor sit amet,
66
+ consectetur adipiscing elit. Nam egestas "feugiat" quam sed vehicula. Integer placerat;
67
+
68
+ odio
69
+ in condimentum pretium. Nullam at porta lacus, non euismod purus.
70
+ Donec ornare consectetur ante non porttitor. Lorem ipsum dolor
71
+
72
+
73
+
74
+ sit amet, consectetur adipiscing elit. Ut consequat lacinia ero.
75
+ EOC
76
+
77
+ assert_equal([
78
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam egestas \"feugiat\"",
79
+ "quam sed vehicula. Integer placerat;",
80
+ "",
81
+ "odio in condimentum pretium. Nullam at porta lacus, non euismod purus. Donec",
82
+ "ornare consectetur ante non porttitor. Lorem ipsum dolor",
83
+ "",
84
+ "",
85
+ "",
86
+ "sit amet, consectetur adipiscing elit. Ut consequat lacinia ero.",
87
+ ], Helper::String.format_text(text, :max_width => 80))
88
+ end
89
+ end
90
+ end
91
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rclid
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Matthieu Vachon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: ! " As its name implies, the goal of this gem is to provide you with
42
+ a light\n structure to create command line interfaces like a breeze.\n\n Focusing
43
+ on rapid development, creating basic single command line application\n or a more
44
+ complex one using composite subcommands is achieve in light speed.\n\n If you
45
+ have ideas that would reduce even more development time and could\n be that this
46
+ library, come discuss it with me by creating an issue on\n github.com.\n"
47
+ email:
48
+ - matthieu.o.vachon@gmail.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - .buildpath
54
+ - .project
55
+ - Gemfile
56
+ - LICENSE.txt
57
+ - README.md
58
+ - Rakefile
59
+ - lib/rclid.rb
60
+ - lib/rclid/base.rb
61
+ - lib/rclid/composite.rb
62
+ - lib/rclid/helper/string.rb
63
+ - lib/rclid/version.rb
64
+ - rclid.gemspec
65
+ - samples/base/hello_world.rb
66
+ - samples/composite/hello/hello.rb
67
+ - samples/composite/hello/root.rb
68
+ - samples/composite/hello/world.rb
69
+ - test/lib/rclid/helper/test_string.rb
70
+ homepage: https://github.com/maoueh/rclid
71
+ licenses:
72
+ - MIT
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.0.3
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Rapid Command Line Interface Development library
94
+ test_files:
95
+ - test/lib/rclid/helper/test_string.rb