lucie-lib 0.0.1

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.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in lucy.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'lib/lucie'
6
+ t.libs << 'test'
7
+ t.test_files = FileList['test/*/*_test.rb']
8
+ t.verbose = false
9
+ t.warning = true
10
+ end
11
+ task :default => :test
data/lib/lucie/app.rb ADDED
@@ -0,0 +1,125 @@
1
+ module Lucie
2
+ class App
3
+
4
+ attr_reader :command
5
+ attr_reader :root
6
+
7
+ def self.run(command = ARGV, root = nil)
8
+ obj = self.new(command, root)
9
+ obj.start
10
+ obj.exit_value
11
+ end
12
+
13
+ def initialize(command, root)
14
+ self.root = root || File.expand_path("..", File.dirname(Kernel.caller[2]))
15
+ self.command = command
16
+ @exit_value ||= 0
17
+ @task = nil
18
+ end
19
+
20
+ def start
21
+ help? ? call_help : call_method_invoking_process
22
+ end
23
+
24
+ def exit_value
25
+ @exit_value
26
+ end
27
+
28
+ class << self
29
+ attr_accessor :raise_exception
30
+ attr_accessor :log_level
31
+ @@raise_exception = false
32
+ @@log_level = :info
33
+ end
34
+
35
+ private
36
+
37
+ def call_method_invoking_process
38
+ apply_validators
39
+ pair_parameters
40
+ call_action_on_controller
41
+ rescue => e
42
+ self.exception = e
43
+ give_user_friendly_error_message
44
+ write_backtrace
45
+ raise if self.class.raise_exception
46
+ end
47
+
48
+ def command=(value)
49
+ @command ||= CommandLineParser.new(value)
50
+ end
51
+
52
+ def help?
53
+ @command.has_option?("-h") || @command.has_option?("--help") || @command.has_arg?("help") || task == "help"
54
+ end
55
+
56
+ def task
57
+ @task ||= @command.shift
58
+ end
59
+
60
+ def action
61
+ @action ||= @command.shift
62
+ @action ? @action.to_sym : "index"
63
+ end
64
+
65
+ def controller
66
+ @controller ||= controller_class.send(:new, command)
67
+ end
68
+
69
+ def controller_class
70
+ @controller_class ||= [task.split("_").map{|i| i.capitalize}.join, "Controller"].join
71
+ Object.const_get(@controller_class.to_sym)
72
+ rescue NameError
73
+ include_controller_for(task)
74
+ Object.const_get(@controller_class.to_sym)
75
+ end
76
+
77
+ def include_controller_for(task)
78
+ require [root, "app/controllers", "#{task}_controller"].join("/")
79
+ rescue LoadError
80
+ self.exit_value = 255
81
+ raise ControllerNotFound, task
82
+ end
83
+
84
+ def call_action_on_controller
85
+ self.exit_value = controller.send(action || "index")
86
+ rescue NameError
87
+ self.exit_value = 255
88
+ raise ActionNotFound.new(action, task)
89
+ rescue Controller::ExitRequest => exit_request
90
+ self.exit_value = exit_request.code
91
+ end
92
+
93
+ def apply_validators
94
+ controller.class.apply_validators
95
+ end
96
+
97
+ def pair_parameters
98
+ controller.class.pair_parameters
99
+ end
100
+
101
+ def root=(value)
102
+ @root = value
103
+ end
104
+
105
+ def exception=(exception)
106
+ @exception = exception
107
+ end
108
+
109
+ def give_user_friendly_error_message
110
+ $stderr << @exception.to_s.strip
111
+ end
112
+
113
+ def write_backtrace
114
+ $stderr.puts Kernel.caller.join("\n") if App.log_level == :debug
115
+ end
116
+
117
+ def call_help
118
+ $stdout << controller.help
119
+ end
120
+
121
+ def exit_value=(exit_value)
122
+ @exit_value = exit_value if exit_value.is_a?(Fixnum)
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,80 @@
1
+ class CommandLineParser
2
+
3
+ attr_reader :options
4
+
5
+ def initialize(parameters)
6
+ @params_str = parameters.class == Array ? parameters.join(" ") : parameters
7
+ @options = {}
8
+ @latest_option = nil
9
+
10
+ parse_options()
11
+ end
12
+
13
+ def [](name)
14
+ @options[name]
15
+ end
16
+
17
+ def shift
18
+ @options[:args].shift
19
+ end
20
+
21
+ def pair(short, long)
22
+ short_p = remove_dashes(short).to_sym
23
+ long_p = remove_dashes(long).to_sym
24
+
25
+ if @options[short_p].class == String
26
+ @options[long_p] = @options[short_p]
27
+ else
28
+ @options[short_p] = @options[long_p]
29
+ end
30
+ end
31
+
32
+ def has_option?(option)
33
+ @options[remove_dashes(option).to_sym] || false
34
+ end
35
+
36
+ def has_arg?(option)
37
+ @options[:args].include?(option)
38
+ end
39
+
40
+ private
41
+
42
+ def parse_options
43
+ array_of_options.each do |option|
44
+ if is_option?(option)
45
+ save_option(option)
46
+ else
47
+ save_parameter(option)
48
+ end
49
+ end
50
+ end
51
+
52
+ def is_option?(option)
53
+ option =~ /^-/
54
+ end
55
+
56
+ def remove_dashes(option)
57
+ option.gsub(/^-+/, "")
58
+ end
59
+
60
+ def save_option(option)
61
+ without_dashes = remove_dashes(option)
62
+ @options[without_dashes.to_sym] = true
63
+ @latest_option = without_dashes.to_sym
64
+ end
65
+
66
+ def save_parameter(option)
67
+ if @options[@latest_option].class == String
68
+ @options[@latest_option] += [" ", option].join
69
+ elsif !@latest_option
70
+ @options[:args] ||= []
71
+ @options[:args] << option
72
+ else
73
+ @options[@latest_option] = option
74
+ end
75
+ end
76
+
77
+ def array_of_options
78
+ @params_str.strip.split
79
+ end
80
+ end
@@ -0,0 +1,59 @@
1
+ module Lucie
2
+ module Controller
3
+ class Base
4
+
5
+ include Validators::MandatoryOption
6
+ include Validators::Optional
7
+
8
+ class << self
9
+ @validators = []
10
+ @params = CommandLineParser.new("")
11
+ end
12
+
13
+ def initialize(command_line_parser)
14
+ self.class.params = command_line_parser
15
+ end
16
+
17
+ def self.params=(params)
18
+ @params = params
19
+ end
20
+
21
+ def params
22
+ self.class.params
23
+ end
24
+
25
+ def self.params
26
+ @params
27
+ end
28
+
29
+ def self.validators
30
+ @validators ||= []
31
+ @validators
32
+ end
33
+
34
+ def self.pair_parameters
35
+ validators.each do |validator|
36
+ short = validator.short_option
37
+ long = validator.long_option
38
+
39
+ if short != "" && long != ""
40
+ params.pair(short, long)
41
+ end
42
+ end
43
+ end
44
+
45
+ def self.apply_validators
46
+ validators.each {|validator| validator.apply(params) } if validators
47
+ end
48
+
49
+ def exit(value)
50
+ raise ExitRequest, value
51
+ end
52
+
53
+ def help
54
+ "Help"
55
+ end
56
+
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,10 @@
1
+ module Lucie
2
+ module Controller
3
+ class ExitRequest < Exception
4
+ attr_reader :code
5
+ def initialize(code)
6
+ @code = code
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ module Lucie
2
+ class RequestError < StandardError
3
+ def initialize(validator)
4
+ super "#{validator.description} (#{validator.short_option}) is mandatory parameter"
5
+ end
6
+ end
7
+
8
+ class ControllerNotFound < StandardError
9
+ def initialize(controller_name)
10
+ super "Controller is not found for #{controller_name}."
11
+ end
12
+ end
13
+
14
+ class ActionNotFound < StandardError
15
+ def initialize(action, controller)
16
+ super "#{action} is not found in #{controller}."
17
+ end
18
+ end
19
+
20
+ class ExitRequest < Exception
21
+ attr_reader :exit
22
+ def initialize(exit)
23
+ @exit = exit
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,28 @@
1
+ require 'erb'
2
+
3
+ module Lucie
4
+ module Snippets
5
+ module Template
6
+ def create_file(file_path, &block)
7
+ dir_name = File.dirname(file_path)
8
+ if !File.directory?(dir_name)
9
+ FileUtils.mkdir_p(dir_name)
10
+ end
11
+
12
+ if block
13
+ File.open(file_path, "a") do |f|
14
+ yield(f)
15
+ end
16
+ else
17
+ File.new(file_path, "a")
18
+ end
19
+ end
20
+
21
+ def template(template, target)
22
+ create_file(target) do |f|
23
+ f.write ERB.new(File.read(template)).result(binding)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ module Lucie
2
+ module Validators
3
+ class Base
4
+ def initialize(*args)
5
+ @argname = args.flatten
6
+ end
7
+
8
+ def apply(params)
9
+ fail NotImplemented
10
+ end
11
+
12
+ def short_option
13
+ @argname.select{|option| option[0] == "-" && option[1] != "-"}.join.strip
14
+ end
15
+
16
+ def long_option
17
+ @argname.select{|option| option[0] == "-" && option[1] == "-"}.join.strip
18
+ end
19
+
20
+ def description
21
+ @argname.select{|option| option[0] != "-" }.first
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module Lucie
2
+ module Validators
3
+ module MandatoryOption
4
+
5
+ class Validator < Base
6
+ def apply(params)
7
+ fail RequestError.new(self) unless params[:"#{short_option.gsub(/^-*/, '')}"]
8
+ end
9
+ end
10
+
11
+ def mandatory(*args)
12
+ v = Validator.new(args)
13
+ v.apply(params)
14
+ end
15
+
16
+ def self.included(base)
17
+ base.extend(ClassMethods)
18
+ end
19
+
20
+ module ClassMethods
21
+ def mandatory(*args)
22
+ self.validators << Validator.new(args)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,21 @@
1
+ module Lucie
2
+ module Validators
3
+ module Optional
4
+
5
+ class Validator < Base
6
+ def apply(params)
7
+ end
8
+ end
9
+
10
+ def self.included(base)
11
+ base.extend(ClassMethods)
12
+ end
13
+
14
+ module ClassMethods
15
+ def optional(*args)
16
+ self.validators << Validator.new(args)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module Lucie
2
+ VERSION = "0.0.1"
3
+ end
data/lib/lucie.rb ADDED
@@ -0,0 +1,28 @@
1
+ require "lucie/version"
2
+ require "lucie/exceptions"
3
+
4
+ module Lucie
5
+
6
+ module Controller
7
+ autoload :ExitRequest, "lucie/controller/exit_request"
8
+ end
9
+
10
+ module Validators
11
+ autoload :MandatoryOption, "lucie/validators/mandatory_option"
12
+ autoload :Optional, "lucie/validators/optional"
13
+ autoload :Base, "lucie/validators/base"
14
+ end
15
+
16
+ module Snippets
17
+ autoload :Template, "lucie/snippets/template"
18
+ end
19
+
20
+ autoload :CommandLineParser, "lucie/command_line_parser"
21
+
22
+ end
23
+
24
+ require "lucie/app"
25
+ require "lucie/controller/base"
26
+
27
+ include Lucie
28
+
data/lucie-lib.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ version = File.read(File.expand_path('../../version', __FILE__)).strip
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "lucie-lib"
8
+ gem.version = version
9
+ gem.authors = ["Nucc"]
10
+ gem.email = ["nucc@bteam.hu"]
11
+ gem.description = %q{Command line utility framework}
12
+ gem.summary = %q{}
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_development_dependency "rake"
21
+ gem.add_development_dependency "minitest"
22
+ gem.add_development_dependency "mini_shoulda"
23
+ end
@@ -0,0 +1,55 @@
1
+ class CommandParserController < Controller::Base
2
+ def hello
3
+ print "Hello World"
4
+ end
5
+
6
+ def hello_2
7
+ print params[:parameter]
8
+ end
9
+ end
10
+
11
+ class ParameterParser1Controller < Controller::Base
12
+ mandatory "-s", "Search expression"
13
+ def search
14
+ print "Ok"
15
+ end
16
+ end
17
+
18
+ class OptionalMandatoryController < Controller::Base
19
+ def search
20
+ mandatory "-s", "Search expression"
21
+ print "Ok"
22
+ end
23
+
24
+ def no_mandatory
25
+ print "Ok"
26
+ end
27
+ end
28
+
29
+ class ParameterPairingController < Controller::Base
30
+ optional "-e", "--expression", "Search expression"
31
+
32
+ def search_short
33
+ print params[:expression]
34
+ end
35
+
36
+ def search_long
37
+ print params[:e]
38
+ end
39
+ end
40
+
41
+ class ExitValueController < Controller::Base
42
+ def method1
43
+ exit 1
44
+ end
45
+
46
+ def no_exit
47
+ "asdf"
48
+ end
49
+ end
50
+
51
+ class CallIndexController < Controller::Base
52
+ def index
53
+ print "index_method"
54
+ end
55
+ end
@@ -0,0 +1,83 @@
1
+ require "test_helper"
2
+ require "stringio"
3
+ require "helpers/test_app"
4
+ require "fixtures/command_parser_fixtures"
5
+
6
+ class CommandProcessorTest < MiniTest::Spec
7
+
8
+ should "parse commands" do
9
+ assert_output("Hello World", nil) { TestApp.run("command_parser hello") }
10
+ end
11
+
12
+ should "parse long parameter" do
13
+ assert_output("Parameter", nil) { TestApp.run("command_parser hello_2 --parameter Parameter") }
14
+ end
15
+
16
+
17
+ should "not give error when mandatory parameters are present" do
18
+ assert_output("Ok", nil) { TestApp.run("parameter_parser1 search -s") }
19
+ end
20
+
21
+ context "raise exception" do
22
+ setup do
23
+ TestApp.raise_exception = true
24
+ end
25
+
26
+ should "force mandatory parameters" do
27
+ assert_raises(Lucie::RequestError){ TestApp.run("parameter_parser1 search") }
28
+ end
29
+
30
+ should "give error, when method has mandatory parameter but another shouldn't throw in this case" do
31
+ assert_output("Ok", nil) { TestApp.run("optional_mandatory search -s") }
32
+ assert_raises(Lucie::RequestError){ TestApp.run("optional_mandatory search") }
33
+ assert_output("Ok", nil) { TestApp.run("optional_mandatory no_mandatory") }
34
+ end
35
+ end
36
+
37
+ should "be able to pair parameters" do
38
+ assert_output("some_string", nil) { TestApp.run("parameter_pairing search_short -e some_string") }
39
+ assert_output("some_string", nil) { TestApp.run("parameter_pairing search_long --expression some_string") }
40
+ end
41
+
42
+ should "write to stderr that no controller found when controller is missing" do
43
+ assert_output "", "Controller is not found for no_controller." do
44
+ TestApp.run("no_controller")
45
+ end
46
+ end
47
+
48
+ should "write to stderr that no action found when action is missing" do
49
+ assert_output "", "no_action is not found in optional_mandatory." do
50
+ TestApp.run("optional_mandatory no_action")
51
+ end
52
+ end
53
+
54
+ should "write user friendly message when mandatory parmaeter is missing" do
55
+ assert_output "", "Search expression (-s) is mandatory parameter" do
56
+ TestApp.run "parameter_parser1 search"
57
+ end
58
+ end
59
+
60
+ should "write help message for help command" do
61
+ assert_output "Help", "" do
62
+ TestApp.run "parameter_parser1 help"
63
+ end
64
+ end
65
+
66
+ should "return the exit value" do
67
+ assert_equal 1, TestApp.run("exit_value method1")
68
+ end
69
+
70
+ should "return 0 if exit value is missing" do
71
+ assert_equal 0, TestApp.run("exit_value no_exit")
72
+ end
73
+
74
+ should "return 255 when controller or action is missing" do
75
+ assert_equal 255, TestApp.run("no_controller_with_this_name")
76
+ end
77
+
78
+ should "call index method when only the task present" do
79
+ assert_output "index_method", "" do
80
+ TestApp.run("call_index")
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,84 @@
1
+ require "test_helper"
2
+ require "tempfile"
3
+
4
+ class TemplateSnippetTest < MiniTest::Spec
5
+
6
+ include Snippets::Template
7
+
8
+ before do
9
+ @tmp_filename = template_path
10
+ remove_file(@tmp_filename) # if it exists
11
+ end
12
+
13
+ after do remove_file(@tmp_filename); end
14
+
15
+
16
+ describe "create_file" do
17
+
18
+ should "be able to create an empty file" do
19
+ create_file @tmp_filename
20
+ assert File.exists?(@tmp_filename)
21
+ end
22
+
23
+ should "be able to generate multi level directory if it doesn't exist" do
24
+ @tmp_filename = [template_dir, "a", "b", template_file_name].join("/")
25
+ create_file @tmp_filename
26
+ assert File.exists?(@tmp_filename)
27
+ FileUtils.rmtree([template_dir, "a"].join("/"))
28
+ end
29
+
30
+ should "be able to add content to a file using block" do
31
+ create_file @tmp_filename do |f|
32
+ f.puts "line_1"
33
+ f.puts "line_2"
34
+ end
35
+
36
+ lines = File.new(@tmp_filename, "r").read.split("\n")
37
+ assert_equal "line_1", lines[0]
38
+ assert_equal "line_2", lines[1]
39
+ end
40
+
41
+ should "be able to append content to a file" do
42
+ create_file @tmp_filename do |f| f.puts "line_1"; end
43
+ create_file @tmp_filename do |f| f.puts "line_2"; end
44
+
45
+ lines = File.new(@tmp_filename, "r").read.split("\n")
46
+ assert_equal "line_1", lines[0]
47
+ assert_equal "line_2", lines[1]
48
+ end
49
+ end
50
+
51
+ context "template" do
52
+ before do @template_file = Tempfile.new(template_file_name, template_dir); end
53
+
54
+ should "generate file from template using absolute directory" do
55
+ File.open(@template_file, "w+") do |f|
56
+ f.write "template <%= @variable %>"
57
+ end
58
+ @variable = "test_var_for_template"
59
+
60
+ template @template_file, @tmp_filename
61
+ assert_equal "template test_var_for_template", File.open(@tmp_filename, "r").read
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def template_dir
68
+ File.expand_path("../../../tmp", __FILE__)
69
+ end
70
+
71
+ def template_file_name
72
+ rand = (Time.now.to_i * rand(10**6)).to_i
73
+ "template_#{rand}"
74
+ end
75
+
76
+ def template_path
77
+ [template_dir, template_file_name].join("/")
78
+ end
79
+
80
+ def remove_file(filename)
81
+ FileUtils.remove_file(filename) if File.exists?(filename)
82
+ end
83
+
84
+ end
@@ -0,0 +1,2 @@
1
+ class TestApp < Lucie::App
2
+ end
@@ -0,0 +1,30 @@
1
+ # MiniTest is integrated to Ruby library and by default the test wants to use that.
2
+ # Force the Rubygems version
3
+ require 'minitest/autorun'
4
+ require "mini_shoulda"
5
+ #require 'debugger'
6
+
7
+ require File.expand_path('../../lib/lucie.rb', __FILE__)
8
+
9
+ LUCIE_ROOT = File.expand_path File.dirname(__FILE__)
10
+
11
+ class MiniTest::Spec
12
+ include Lucie
13
+
14
+ def setup
15
+ redirect_stderr
16
+ end
17
+
18
+ def teardown
19
+ reset_stderr_redirection
20
+ end
21
+
22
+ def redirect_stderr
23
+ @stderr = $stderr
24
+ $stderr = StringIO.new
25
+ end
26
+
27
+ def reset_stderr_redirection
28
+ $stderr = @stderr
29
+ end
30
+ end
@@ -0,0 +1,69 @@
1
+ require "test_helper"
2
+
3
+ class CommandLineParserTest < MiniTest::Spec
4
+
5
+ should "parse empty string" do
6
+ parser = CommandLineParser.new ""
7
+ assert_equal Hash.new, parser.options
8
+ end
9
+
10
+ should "parse short boolean value" do
11
+ parser = CommandLineParser.new "-a"
12
+ assert parser.options[:a]
13
+ end
14
+
15
+ should "parse more short boolean values" do
16
+ parser = CommandLineParser.new "-a -b"
17
+ assert parser.options[:a]
18
+ assert parser.options[:b]
19
+ end
20
+
21
+ should "parse long boolean value" do
22
+ parser = CommandLineParser.new "--long-parameter"
23
+ assert parser.options[:"long-parameter"]
24
+ end
25
+
26
+ should "parse multiple long boolean values" do
27
+ parser = CommandLineParser.new "--long-parameter --another-long-parameter"
28
+ assert parser.options[:"long-parameter"]
29
+ assert parser.options[:"another-long-parameter"]
30
+ end
31
+
32
+ should "parse string parameter" do
33
+ parser = CommandLineParser.new "--string this_is_a_string"
34
+ assert_equal "this_is_a_string", parser.options[:string]
35
+ end
36
+
37
+ should "parse more string parameters" do
38
+ parser = CommandLineParser.new "--string this is a string"
39
+ assert_equal "this is a string", parser.options[:string]
40
+ end
41
+
42
+ should "parse arguments" do
43
+ parser = CommandLineParser.new "arg1 arg2 -x -y"
44
+ assert_equal "arg1", parser.options[:args][0]
45
+ assert parser.options[:x]
46
+ end
47
+
48
+ should "be able to shift the args array" do
49
+ parser = CommandLineParser.new "arg1 arg2"
50
+ arg = parser.shift
51
+ assert_equal "arg1", arg
52
+ assert_equal "arg2", parser.options[:args][0]
53
+ end
54
+
55
+ should "be able to answer the an argument is present or not" do
56
+ parser = CommandLineParser.new "arg1 arg2"
57
+ assert parser.has_arg?("arg1")
58
+ assert parser.has_arg?("arg2")
59
+ assert !parser.has_arg?("arg3")
60
+ end
61
+
62
+ should "be able to answer the parameter is present or not" do
63
+ parser = CommandLineParser.new "arg1 -h -p"
64
+ assert parser.has_option?("h")
65
+ assert parser.has_option?("p")
66
+ assert !parser.has_option?("print")
67
+ end
68
+
69
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lucie-lib
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Nucc
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: minitest
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: mini_shoulda
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Command line utility framework
63
+ email:
64
+ - nucc@bteam.hu
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - Gemfile
70
+ - Rakefile
71
+ - lib/lucie.rb
72
+ - lib/lucie/app.rb
73
+ - lib/lucie/command_line_parser.rb
74
+ - lib/lucie/controller/base.rb
75
+ - lib/lucie/controller/exit_request.rb
76
+ - lib/lucie/exceptions.rb
77
+ - lib/lucie/snippets/template.rb
78
+ - lib/lucie/validators/base.rb
79
+ - lib/lucie/validators/mandatory_option.rb
80
+ - lib/lucie/validators/optional.rb
81
+ - lib/lucie/version.rb
82
+ - lucie-lib.gemspec
83
+ - test/fixtures/command_parser_fixtures.rb
84
+ - test/functional/command_parser_test.rb
85
+ - test/functional/template_snippet_test.rb
86
+ - test/helpers/test_app.rb
87
+ - test/test_helper.rb
88
+ - test/unit/command_line_parser_test.rb
89
+ homepage: ''
90
+ licenses: []
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ segments:
102
+ - 0
103
+ hash: -2466274242132173745
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ segments:
111
+ - 0
112
+ hash: -2466274242132173745
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 1.8.25
116
+ signing_key:
117
+ specification_version: 3
118
+ summary: ''
119
+ test_files:
120
+ - test/fixtures/command_parser_fixtures.rb
121
+ - test/functional/command_parser_test.rb
122
+ - test/functional/template_snippet_test.rb
123
+ - test/helpers/test_app.rb
124
+ - test/test_helper.rb
125
+ - test/unit/command_line_parser_test.rb