lucie-lib 0.0.2 → 0.0.4
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 +7 -0
- data/Rakefile +11 -2
- data/lib/lucie/app.rb +65 -29
- data/lib/lucie/command_line_parser.rb +8 -1
- data/lib/lucie/command_line_slicer.rb +77 -0
- data/lib/lucie/controller/base.rb +4 -1
- data/lib/lucie/snippets/template.rb +56 -12
- data/lib/lucie.rb +3 -3
- data/lucie-lib.gemspec +16 -15
- data/test/fixtures/command_parser_fixtures.rb +14 -0
- data/test/fixtures/template_snippet_fixtures.rb +13 -0
- data/test/functional/{command_parser_test.rb → app_test.rb} +33 -2
- data/test/functional/template_snippet_test.rb +69 -13
- data/test/test_app/app/controllers/application_controller.rb +5 -0
- data/test/test_helper.rb +13 -0
- data/test/unit/command_line_parser_test.rb +8 -1
- data/test/unit/command_line_slicer_test.rb +33 -0
- data/test/unit/controller/base_test.rb +13 -0
- metadata +45 -35
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 54cdab8b749d107f8e4623da10b409e84f9bc371
|
4
|
+
data.tar.gz: 6e6e80fd5c6f033f7e88e6196ba4ef5526b7ce5d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c281e872db3d2a261d61822f1647bae06944a3abd902f1b35fe0a8034429fa36a4e6da99999a2e6a13ec9cbd89e2b0daff299123177e29677a1c5f9fca76d06c
|
7
|
+
data.tar.gz: cb0c5212712368ab0ab728e8f3cd2351ae9c55b659d05fe89f104c9a8ec35e31b8a2c9a0e3cebf3ef7177042a0e9ec3ec8e6aa20dfded83c0bb6c4ce0f1856ab
|
data/Rakefile
CHANGED
@@ -4,8 +4,17 @@ require 'rake/testtask'
|
|
4
4
|
Rake::TestTask.new do |t|
|
5
5
|
t.libs << 'lib/lucie'
|
6
6
|
t.libs << 'test'
|
7
|
-
t.test_files = FileList['test
|
7
|
+
t.test_files = FileList['test/**/*_test.rb']
|
8
8
|
t.verbose = false
|
9
9
|
t.warning = true
|
10
10
|
end
|
11
|
-
task :default => :test
|
11
|
+
task :default => :test
|
12
|
+
|
13
|
+
if !ENV["TRAVIS"]
|
14
|
+
require 'rdoc/task'
|
15
|
+
RDoc::Task.new :doc do |rdoc|
|
16
|
+
rdoc.rdoc_dir = '../doc'
|
17
|
+
rdoc.options << '-f' << 'sdoc'
|
18
|
+
rdoc.rdoc_files.include("lib/*.rb")
|
19
|
+
end
|
20
|
+
end
|
data/lib/lucie/app.rb
CHANGED
@@ -1,20 +1,45 @@
|
|
1
|
+
|
2
|
+
|
1
3
|
module Lucie
|
4
|
+
# App responsible for configuring and launch the application
|
5
|
+
# based on Lucie application framework.
|
6
|
+
#
|
2
7
|
class App
|
3
8
|
|
9
|
+
class << self
|
10
|
+
attr_accessor :raise_exception
|
11
|
+
attr_accessor :log_level
|
12
|
+
attr_accessor :root
|
13
|
+
@raise_exception = false
|
14
|
+
@log_level = :info
|
15
|
+
end
|
16
|
+
|
4
17
|
attr_reader :command
|
5
18
|
attr_reader :root
|
19
|
+
attr_reader :pwd
|
6
20
|
|
7
21
|
def self.run(command = ARGV, root = nil)
|
8
|
-
|
9
|
-
|
10
|
-
|
22
|
+
root ||= File.expand_path("..", File.dirname(Kernel.caller[0]))
|
23
|
+
instance = self.init(command, root)
|
24
|
+
self.start(instance)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.init(command = ARGV, root = nil)
|
28
|
+
root ||= File.expand_path("..", File.dirname(Kernel.caller[0]))
|
29
|
+
self.new(command, root)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.start(instance)
|
33
|
+
instance.start
|
34
|
+
instance.exit_value
|
11
35
|
end
|
12
36
|
|
13
37
|
def initialize(command, root)
|
14
|
-
|
15
|
-
|
38
|
+
@root = root
|
39
|
+
@command = CommandLineParser.new(command)
|
16
40
|
@exit_value ||= 0
|
17
41
|
@task = nil
|
42
|
+
@pwd = ENV["PWD"]
|
18
43
|
end
|
19
44
|
|
20
45
|
def start
|
@@ -25,11 +50,8 @@ module Lucie
|
|
25
50
|
@exit_value
|
26
51
|
end
|
27
52
|
|
28
|
-
|
29
|
-
|
30
|
-
attr_accessor :log_level
|
31
|
-
@@raise_exception = false
|
32
|
-
@@log_level = :info
|
53
|
+
def env
|
54
|
+
ENV
|
33
55
|
end
|
34
56
|
|
35
57
|
private
|
@@ -45,10 +67,6 @@ private
|
|
45
67
|
raise if self.class.raise_exception
|
46
68
|
end
|
47
69
|
|
48
|
-
def command=(value)
|
49
|
-
@command ||= CommandLineParser.new(value)
|
50
|
-
end
|
51
|
-
|
52
70
|
def help?
|
53
71
|
@command.has_option?("-h") || @command.has_option?("--help") || @command.has_arg?("help") || task == "help"
|
54
72
|
end
|
@@ -58,38 +76,60 @@ private
|
|
58
76
|
end
|
59
77
|
|
60
78
|
def action
|
61
|
-
@action ||=
|
62
|
-
|
79
|
+
@action ||= begin
|
80
|
+
@command.args.first ? @command.args.first.to_sym : :index
|
81
|
+
end
|
63
82
|
end
|
64
83
|
|
65
84
|
def controller
|
66
|
-
@controller ||= controller_class.send(:new, command)
|
85
|
+
@controller ||= controller_class.send(:new, command, self)
|
67
86
|
end
|
68
87
|
|
69
88
|
def controller_class
|
70
|
-
|
71
|
-
|
89
|
+
if task
|
90
|
+
@controller_class ||= [task.split("_").map{|i| i.capitalize}.join, "Controller"].join
|
91
|
+
Object.const_get(@controller_class.to_sym)
|
92
|
+
else
|
93
|
+
include_controller_for "application"
|
94
|
+
@controller_class = "ApplicationController"
|
95
|
+
@action = :help
|
96
|
+
Object.const_get(@controller_class.to_sym)
|
97
|
+
end
|
72
98
|
rescue NameError
|
73
99
|
include_controller_for(task)
|
74
100
|
Object.const_get(@controller_class.to_sym)
|
75
101
|
end
|
76
102
|
|
77
103
|
def include_controller_for(task)
|
78
|
-
require [root, "app/controllers", "#{task}_controller"]
|
104
|
+
require File.join([root, "app/controllers", "#{task}_controller"])
|
79
105
|
rescue LoadError
|
80
106
|
self.exit_value = 255
|
81
107
|
raise ControllerNotFound, task
|
82
108
|
end
|
83
109
|
|
84
110
|
def call_action_on_controller
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
111
|
+
method = action
|
112
|
+
if controller_has_action? action
|
113
|
+
# pop the args[0] element because this is the method
|
114
|
+
@command.shift
|
115
|
+
elsif controller_has_action? :no_method
|
116
|
+
method = :no_method
|
117
|
+
else
|
118
|
+
self.exit_value = 255
|
119
|
+
raise ActionNotFound.new(action, task)
|
120
|
+
end
|
121
|
+
self.exit_value = controller.send(method)
|
89
122
|
rescue Controller::ExitRequest => exit_request
|
90
123
|
self.exit_value = exit_request.code
|
91
124
|
end
|
92
125
|
|
126
|
+
def controller_has_action?(action)
|
127
|
+
@public_actions ||= begin
|
128
|
+
controller_class.public_instance_methods - Controller::Base.public_instance_methods + [:help]
|
129
|
+
end
|
130
|
+
@public_actions.include?(action.to_sym)
|
131
|
+
end
|
132
|
+
|
93
133
|
def apply_validators
|
94
134
|
controller.class.apply_validators
|
95
135
|
end
|
@@ -98,10 +138,6 @@ private
|
|
98
138
|
controller.class.pair_parameters
|
99
139
|
end
|
100
140
|
|
101
|
-
def root=(value)
|
102
|
-
@root = value
|
103
|
-
end
|
104
|
-
|
105
141
|
def exception=(exception)
|
106
142
|
@exception = exception
|
107
143
|
end
|
@@ -122,4 +158,4 @@ private
|
|
122
158
|
@exit_value = exit_value if exit_value.is_a?(Fixnum)
|
123
159
|
end
|
124
160
|
end
|
125
|
-
end
|
161
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "lucie/command_line_slicer"
|
2
|
+
|
1
3
|
class CommandLineParser
|
2
4
|
|
3
5
|
attr_reader :options
|
@@ -5,6 +7,7 @@ class CommandLineParser
|
|
5
7
|
def initialize(parameters)
|
6
8
|
@params_str = parameters.class == Array ? parameters.join(" ") : parameters
|
7
9
|
@options = {}
|
10
|
+
@options[:args] = []
|
8
11
|
@latest_option = nil
|
9
12
|
|
10
13
|
parse_options()
|
@@ -37,6 +40,10 @@ class CommandLineParser
|
|
37
40
|
@options[:args].include?(option)
|
38
41
|
end
|
39
42
|
|
43
|
+
def args
|
44
|
+
@options[:args].dup
|
45
|
+
end
|
46
|
+
|
40
47
|
private
|
41
48
|
|
42
49
|
def parse_options
|
@@ -75,6 +82,6 @@ private
|
|
75
82
|
end
|
76
83
|
|
77
84
|
def array_of_options
|
78
|
-
@params_str.
|
85
|
+
CommandLineSlicer.new(@params_str).to_a
|
79
86
|
end
|
80
87
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
class CommandLineSlicer
|
2
|
+
def initialize(line)
|
3
|
+
@line = line.split("")
|
4
|
+
@parts = []
|
5
|
+
@neutral_status = false
|
6
|
+
@quotation_open = false
|
7
|
+
@scanned = ""
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_a
|
11
|
+
each_char do |char|
|
12
|
+
if boundary? char
|
13
|
+
save_chunk
|
14
|
+
elsif in_quoatation? char
|
15
|
+
toggle_quotation_state
|
16
|
+
elsif neutral? char
|
17
|
+
neutral :on
|
18
|
+
else
|
19
|
+
neutral :off
|
20
|
+
append char
|
21
|
+
end
|
22
|
+
end
|
23
|
+
save_chunk
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def append(char)
|
29
|
+
@scanned += char
|
30
|
+
end
|
31
|
+
|
32
|
+
def each_char(&blk)
|
33
|
+
while @line.size > 0
|
34
|
+
yield(@line.shift)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def toggle_quotation_state
|
39
|
+
@quotation_open = !@quotation_open
|
40
|
+
end
|
41
|
+
|
42
|
+
def save_chunk
|
43
|
+
@parts << @scanned if @scanned != ""
|
44
|
+
@scanned = ""
|
45
|
+
@parts
|
46
|
+
end
|
47
|
+
|
48
|
+
def neutral(sym)
|
49
|
+
@neutral_status = (sym == :on)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def neutral_chars
|
55
|
+
["\\"]
|
56
|
+
end
|
57
|
+
|
58
|
+
def boundary_chars
|
59
|
+
[" "]
|
60
|
+
end
|
61
|
+
|
62
|
+
def quotation_chars
|
63
|
+
["\"", "'"]
|
64
|
+
end
|
65
|
+
|
66
|
+
def boundary?(char)
|
67
|
+
boundary_chars.include?(char) && !@neutral_status && !@quotation_open
|
68
|
+
end
|
69
|
+
|
70
|
+
def in_quoatation?(char)
|
71
|
+
quotation_chars.include?(char) && !@neutral_status
|
72
|
+
end
|
73
|
+
|
74
|
+
def neutral?(char)
|
75
|
+
neutral_chars.include?(char) && !@neutral_status
|
76
|
+
end
|
77
|
+
end
|
@@ -5,13 +5,16 @@ module Lucie
|
|
5
5
|
include Validators::MandatoryOption
|
6
6
|
include Validators::Optional
|
7
7
|
|
8
|
+
attr_reader :app
|
9
|
+
|
8
10
|
class << self
|
9
11
|
@validators = []
|
10
12
|
@params = CommandLineParser.new("")
|
11
13
|
end
|
12
14
|
|
13
|
-
def initialize(command_line_parser)
|
15
|
+
def initialize(command_line_parser, app)
|
14
16
|
self.class.params = command_line_parser
|
17
|
+
@app = app
|
15
18
|
end
|
16
19
|
|
17
20
|
def self.params=(params)
|
@@ -1,28 +1,72 @@
|
|
1
1
|
require 'erb'
|
2
|
+
require 'fileutils'
|
2
3
|
|
3
4
|
module Lucie
|
4
5
|
module Snippets
|
5
6
|
module Template
|
7
|
+
|
8
|
+
protected
|
9
|
+
|
10
|
+
# that would be great if we occurre the Helper init in every method, but
|
11
|
+
# now I don't know nice solution for this
|
12
|
+
|
6
13
|
def create_file(file_path, &block)
|
7
|
-
|
8
|
-
|
9
|
-
|
14
|
+
@file_utils_helper ||= FileUtilsHelper.new(self)
|
15
|
+
@file_utils_helper.create_file(file_path, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def template(template, target)
|
19
|
+
@file_utils_helper ||= FileUtilsHelper.new(self)
|
20
|
+
@file_utils_helper.template(template, target, binding)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
class FileUtilsHelper
|
26
|
+
|
27
|
+
def initialize(controller)
|
28
|
+
@controller = controller
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_file(path, &content)
|
32
|
+
path = normalized path
|
33
|
+
create_dir_for path
|
34
|
+
add_content_to_file path, &content
|
10
35
|
end
|
11
36
|
|
12
|
-
|
13
|
-
|
14
|
-
|
37
|
+
def template(template, target, binding)
|
38
|
+
template = "app/templates/#{template}" if is_relative?(template)
|
39
|
+
target = File.join([@controller.app.pwd, target]) if is_relative?(target)
|
40
|
+
create_file(target) do |f|
|
41
|
+
f.write ERB.new(File.read(normalized(template))).result(binding)
|
15
42
|
end
|
16
|
-
else
|
17
|
-
File.new(file_path, "a")
|
18
43
|
end
|
19
|
-
end
|
20
44
|
|
21
|
-
|
22
|
-
|
23
|
-
|
45
|
+
def is_relative?(file_path)
|
46
|
+
file_path[0] != "/"
|
47
|
+
end
|
48
|
+
|
49
|
+
def normalized(path)
|
50
|
+
if is_relative?(path)
|
51
|
+
File.join([@controller.app.root, path])
|
52
|
+
else
|
53
|
+
path
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def create_dir_for(file_path)
|
58
|
+
dir_name = File.dirname(file_path)
|
59
|
+
if !File.directory?(dir_name)
|
60
|
+
FileUtils.mkdir_p(dir_name)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_content_to_file(path, &content)
|
65
|
+
block_given? && File.open(path, "a") { |f| yield f } || File.new(path, "a")
|
24
66
|
end
|
67
|
+
|
25
68
|
end
|
69
|
+
|
26
70
|
end
|
27
71
|
end
|
28
72
|
end
|
data/lib/lucie.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
$LOAD_PATH << File.expand_path("..", __FILE__)
|
2
|
+
|
1
3
|
require "lucie/version"
|
2
4
|
require "lucie/exceptions"
|
3
5
|
|
@@ -17,12 +19,10 @@ module Lucie
|
|
17
19
|
autoload :Template, "lucie/snippets/template"
|
18
20
|
end
|
19
21
|
|
20
|
-
autoload :CommandLineParser, "lucie/command_line_parser"
|
21
|
-
|
22
22
|
end
|
23
23
|
|
24
|
+
require "lucie/command_line_parser"
|
24
25
|
require "lucie/app"
|
25
26
|
require "lucie/controller/base"
|
26
27
|
|
27
28
|
include Lucie
|
28
|
-
|
data/lucie-lib.gemspec
CHANGED
@@ -3,21 +3,22 @@ version = File.read(File.expand_path('../../version', __FILE__)).strip
|
|
3
3
|
lib = File.expand_path('../lib', __FILE__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
5
|
|
6
|
-
Gem::Specification.new do |
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "lucie-lib"
|
8
|
+
s.version = version
|
9
|
+
s.authors = ["Nucc"]
|
10
|
+
s.email = ["nucc@bteam.hu"]
|
11
|
+
s.description = %q{Command line utility framework}
|
12
|
+
s.summary = %q{Library part of Lucie framework. Use only this gem, if you don't need project generator.}
|
13
|
+
s.homepage = "http://my.luc.ie"
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
s.files = `git ls-files`.split($/)
|
16
|
+
s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
18
|
+
s.require_paths = ["lib"]
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
s.add_development_dependency "rake", "10.0.3"
|
21
|
+
s.add_development_dependency "minitest", "4.6"
|
22
|
+
s.add_development_dependency "mini_shoulda", "0.4.0"
|
23
|
+
s.add_development_dependency "sdoc"
|
23
24
|
end
|
@@ -52,4 +52,18 @@ class CallIndexController < Controller::Base
|
|
52
52
|
def index
|
53
53
|
print "index_method"
|
54
54
|
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class MethodMissingController < Controller::Base
|
58
|
+
def index
|
59
|
+
print params[:args][0]
|
60
|
+
end
|
61
|
+
|
62
|
+
alias_method :no_method, :index
|
63
|
+
end
|
64
|
+
|
65
|
+
class DerivedController < CallIndexController
|
66
|
+
def new_method
|
67
|
+
print "new_method"
|
68
|
+
end
|
55
69
|
end
|
@@ -3,7 +3,7 @@ require "stringio"
|
|
3
3
|
require "helpers/test_app"
|
4
4
|
require "fixtures/command_parser_fixtures"
|
5
5
|
|
6
|
-
|
6
|
+
describe App do
|
7
7
|
|
8
8
|
should "parse commands" do
|
9
9
|
assert_output("Hello World", nil) { TestApp.run("command_parser hello") }
|
@@ -13,7 +13,6 @@ class CommandProcessorTest < MiniTest::Spec
|
|
13
13
|
assert_output("Parameter", nil) { TestApp.run("command_parser hello_2 --parameter Parameter") }
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
16
|
should "not give error when mandatory parameters are present" do
|
18
17
|
assert_output("Ok", nil) { TestApp.run("parameter_parser1 search -s") }
|
19
18
|
end
|
@@ -32,6 +31,14 @@ class CommandProcessorTest < MiniTest::Spec
|
|
32
31
|
assert_raises(Lucie::RequestError){ TestApp.run("optional_mandatory search") }
|
33
32
|
assert_output("Ok", nil) { TestApp.run("optional_mandatory no_mandatory") }
|
34
33
|
end
|
34
|
+
|
35
|
+
should "not be able to call method from Object class" do
|
36
|
+
assert_raises(Lucie::ActionNotFound) { TestApp.run("derived public_methods") }
|
37
|
+
end
|
38
|
+
|
39
|
+
should "not be able to call method from Controller::Base class" do
|
40
|
+
assert_raises(Lucie::ActionNotFound) { TestApp.run("derived params") }
|
41
|
+
end
|
35
42
|
end
|
36
43
|
|
37
44
|
should "be able to pair parameters" do
|
@@ -63,6 +70,12 @@ class CommandProcessorTest < MiniTest::Spec
|
|
63
70
|
end
|
64
71
|
end
|
65
72
|
|
73
|
+
should "call help method of ApplicationController when controller name is missing" do
|
74
|
+
assert_output "ApplicationController::help", "" do
|
75
|
+
TestApp.run "", File.expand_path("../../test_app/", __FILE__)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
66
79
|
should "return the exit value" do
|
67
80
|
assert_equal 1, TestApp.run("exit_value method1")
|
68
81
|
end
|
@@ -80,4 +93,22 @@ class CommandProcessorTest < MiniTest::Spec
|
|
80
93
|
TestApp.run("call_index")
|
81
94
|
end
|
82
95
|
end
|
96
|
+
|
97
|
+
should "call method_missing if task method is missing and leave the task in args" do
|
98
|
+
assert_output "no_method_with_this_name", "" do
|
99
|
+
TestApp.run("method_missing no_method_with_this_name")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
should "have a root directory which is the directory contains the bin and app folders" do
|
104
|
+
assert_equal File.expand_path("../..", __FILE__), TestApp.init("", nil).root
|
105
|
+
end
|
106
|
+
|
107
|
+
should "know the directory where it was called" do
|
108
|
+
assert_equal TestApp.new("", nil).pwd.path, File.expand_path("../../../", __FILE__).path
|
109
|
+
end
|
110
|
+
|
111
|
+
should "store the ENV" do
|
112
|
+
assert_equal ENV["PWD"], TestApp.init([], "").env["PWD"]
|
113
|
+
end
|
83
114
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "test_helper"
|
2
|
+
require "fixtures/template_snippet_fixtures"
|
2
3
|
require "tempfile"
|
3
4
|
|
4
5
|
class TemplateSnippetTest < MiniTest::Spec
|
@@ -6,25 +7,27 @@ class TemplateSnippetTest < MiniTest::Spec
|
|
6
7
|
include Snippets::Template
|
7
8
|
|
8
9
|
before do
|
10
|
+
@template_path = nil
|
11
|
+
@template_file_name = nil
|
9
12
|
@tmp_filename = template_path
|
10
13
|
remove_file(@tmp_filename) # if it exists
|
11
14
|
end
|
12
15
|
|
13
|
-
after do
|
14
|
-
|
16
|
+
after do
|
17
|
+
remove_file(@tmp_filename)
|
18
|
+
FileUtils.rmtree(File.join([template_dir, "a"]))
|
19
|
+
end
|
15
20
|
|
16
21
|
describe "create_file" do
|
17
|
-
|
18
22
|
should "be able to create an empty file" do
|
19
23
|
create_file @tmp_filename
|
20
24
|
assert File.exists?(@tmp_filename)
|
21
25
|
end
|
22
26
|
|
23
27
|
should "be able to generate multi level directory if it doesn't exist" do
|
24
|
-
@tmp_filename = [template_dir, "a", "b", template_file_name]
|
28
|
+
@tmp_filename = File.join([template_dir, "a", "b", template_file_name])
|
25
29
|
create_file @tmp_filename
|
26
30
|
assert File.exists?(@tmp_filename)
|
27
|
-
FileUtils.rmtree([template_dir, "a"].join("/"))
|
28
31
|
end
|
29
32
|
|
30
33
|
should "be able to add content to a file using block" do
|
@@ -46,20 +49,65 @@ class TemplateSnippetTest < MiniTest::Spec
|
|
46
49
|
assert_equal "line_1", lines[0]
|
47
50
|
assert_equal "line_2", lines[1]
|
48
51
|
end
|
52
|
+
|
53
|
+
should "generate file relative to PWD that comes from app.pwd" do
|
54
|
+
app = Class.new do
|
55
|
+
def initialize(root) @root = root end
|
56
|
+
attr_reader :root
|
57
|
+
end
|
58
|
+
|
59
|
+
TemplateController.new("", app.new(template_dir)).test_1(template_file_name)
|
60
|
+
assert_equal "test_1", File.read(template_path)
|
61
|
+
end
|
49
62
|
end
|
50
63
|
|
51
64
|
context "template" do
|
52
|
-
before do @template_file = Tempfile.new(template_file_name, template_dir); end
|
53
65
|
|
54
|
-
|
66
|
+
before do
|
67
|
+
@template_file = Tempfile.new(template_file_name, template_dir)
|
68
|
+
@app = Class.new do
|
69
|
+
def initialize(root, pwd=nil) @root = root; @pwd = pwd end
|
70
|
+
attr_reader :root
|
71
|
+
attr_reader :pwd
|
72
|
+
end
|
73
|
+
|
74
|
+
@rand = rand
|
55
75
|
File.open(@template_file, "w+") do |f|
|
56
|
-
f.write "template
|
76
|
+
f.write "template #{@rand}"
|
57
77
|
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
should "generate file from template using absolute directory" do
|
58
82
|
@variable = "test_var_for_template"
|
59
83
|
|
60
|
-
template @template_file, @tmp_filename
|
61
|
-
assert_equal "template
|
84
|
+
template @template_file.path, @tmp_filename
|
85
|
+
assert_equal "template #{@rand}", File.open(@tmp_filename, "r").read
|
62
86
|
end
|
87
|
+
|
88
|
+
should "use APP_ROOT/app/templates directory if template has relative path" do
|
89
|
+
# we will write it in the controller
|
90
|
+
empty(@template_file)
|
91
|
+
|
92
|
+
source = template_file_name
|
93
|
+
source_full_path = File.join([template_dir, "app/templates", template_file_name])
|
94
|
+
|
95
|
+
create_file(source_full_path) { |f| f.print "template" }
|
96
|
+
TemplateController.new("", @app.new(template_dir)).test_template_1(source, @template_file.path)
|
97
|
+
|
98
|
+
remove_file(source_full_path)
|
99
|
+
assert_equal "template", File.read(@template_file)
|
100
|
+
end
|
101
|
+
|
102
|
+
should "generate file to PWD if target is relative path" do
|
103
|
+
TemplateController.new("", @app.new(template_dir, "/tmp")).test_template_1(@template_file.path, template_file_name)
|
104
|
+
begin
|
105
|
+
assert_equal "template #{@rand}", File.read("/tmp/#{template_file_name}")
|
106
|
+
ensure
|
107
|
+
remove_file("/tmp/#{template_file_name}")
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
63
111
|
end
|
64
112
|
|
65
113
|
private
|
@@ -69,16 +117,24 @@ class TemplateSnippetTest < MiniTest::Spec
|
|
69
117
|
end
|
70
118
|
|
71
119
|
def template_file_name
|
72
|
-
|
73
|
-
|
120
|
+
@template_file_name ||= begin
|
121
|
+
rand = (Time.now.to_i * rand(10**6)).to_i
|
122
|
+
"template_#{rand}"
|
123
|
+
end
|
74
124
|
end
|
75
125
|
|
76
126
|
def template_path
|
77
|
-
|
127
|
+
@template_path ||= begin
|
128
|
+
File.join([template_dir, template_file_name])
|
129
|
+
end
|
78
130
|
end
|
79
131
|
|
80
132
|
def remove_file(filename)
|
81
133
|
FileUtils.remove_file(filename) if File.exists?(filename)
|
82
134
|
end
|
83
135
|
|
136
|
+
def empty(file)
|
137
|
+
file.truncate(0)
|
138
|
+
end
|
139
|
+
|
84
140
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,11 +1,18 @@
|
|
1
|
+
if ENV["TRAVIS"]
|
2
|
+
require 'coveralls'
|
3
|
+
Coveralls.wear!
|
4
|
+
end
|
5
|
+
|
1
6
|
# MiniTest is integrated to Ruby library and by default the test wants to use that.
|
2
7
|
# Force the Rubygems version
|
3
8
|
require 'minitest/autorun'
|
4
9
|
require "mini_shoulda"
|
10
|
+
require "pathname"
|
5
11
|
#require 'debugger'
|
6
12
|
|
7
13
|
require File.expand_path('../../lib/lucie.rb', __FILE__)
|
8
14
|
|
15
|
+
|
9
16
|
LUCIE_ROOT = File.expand_path File.dirname(__FILE__)
|
10
17
|
|
11
18
|
class MiniTest::Spec
|
@@ -27,4 +34,10 @@ class MiniTest::Spec
|
|
27
34
|
def reset_stderr_redirection
|
28
35
|
$stderr = @stderr
|
29
36
|
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class String
|
40
|
+
def path
|
41
|
+
Pathname.new(self.to_s).realpath.to_s
|
42
|
+
end
|
30
43
|
end
|
@@ -4,7 +4,8 @@ class CommandLineParserTest < MiniTest::Spec
|
|
4
4
|
|
5
5
|
should "parse empty string" do
|
6
6
|
parser = CommandLineParser.new ""
|
7
|
-
|
7
|
+
hash = {:args => []}
|
8
|
+
assert_equal hash, parser.options
|
8
9
|
end
|
9
10
|
|
10
11
|
should "parse short boolean value" do
|
@@ -66,4 +67,10 @@ class CommandLineParserTest < MiniTest::Spec
|
|
66
67
|
assert !parser.has_option?("print")
|
67
68
|
end
|
68
69
|
|
70
|
+
should "parse params enclosed with \" or ' as one arg" do
|
71
|
+
parser = CommandLineParser.new "arg1 'arg2 arg3'"
|
72
|
+
assert_equal "arg1", parser.args[0]
|
73
|
+
assert_equal "arg2 arg3", parser.args[1]
|
74
|
+
end
|
75
|
+
|
69
76
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class CommandLineSlicerTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_empty
|
6
|
+
assert_equal [], CommandLineSlicer.new("").to_a
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_one_word
|
10
|
+
assert_equal ["word"], CommandLineSlicer.new("word").to_a
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_more_words_with_spaces
|
14
|
+
assert_equal ["first", "second"], CommandLineSlicer.new("first second").to_a
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_neutral_space
|
18
|
+
assert_equal ["first second"], CommandLineSlicer.new("first\\ second").to_a
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_neutral_element_on_another_neutral
|
22
|
+
assert_equal ["first\\", "second"], CommandLineSlicer.new("first\\\\ second").to_a
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_neutral_element_on_another_neutral_between_quotation
|
26
|
+
assert_equal ["first\\ second"], CommandLineSlicer.new('"first\\\\ second"').to_a
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_quotation_marks
|
30
|
+
assert_equal ["first", "second third"], CommandLineSlicer.new('first "second third"').to_a
|
31
|
+
assert_equal ["first", "second third"], CommandLineSlicer.new("first 'second third'").to_a
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,62 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lucie-lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Nucc
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-09-15 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '='
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
version: 10.0.3
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '='
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
26
|
+
version: 10.0.3
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: minitest
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '='
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version: '
|
33
|
+
version: '4.6'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '='
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version: '
|
40
|
+
version: '4.6'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: mini_shoulda
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.4.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.4.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sdoc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
52
60
|
- !ruby/object:Gem::Version
|
53
61
|
version: '0'
|
54
62
|
type: :development
|
55
63
|
prerelease: false
|
56
64
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
65
|
requirements:
|
59
|
-
- -
|
66
|
+
- - '>='
|
60
67
|
- !ruby/object:Gem::Version
|
61
68
|
version: '0'
|
62
69
|
description: Command line utility framework
|
@@ -71,6 +78,7 @@ files:
|
|
71
78
|
- lib/lucie.rb
|
72
79
|
- lib/lucie/app.rb
|
73
80
|
- lib/lucie/command_line_parser.rb
|
81
|
+
- lib/lucie/command_line_slicer.rb
|
74
82
|
- lib/lucie/controller/base.rb
|
75
83
|
- lib/lucie/controller/exit_request.rb
|
76
84
|
- lib/lucie/exceptions.rb
|
@@ -81,45 +89,47 @@ files:
|
|
81
89
|
- lib/lucie/version.rb
|
82
90
|
- lucie-lib.gemspec
|
83
91
|
- test/fixtures/command_parser_fixtures.rb
|
84
|
-
- test/
|
92
|
+
- test/fixtures/template_snippet_fixtures.rb
|
93
|
+
- test/functional/app_test.rb
|
85
94
|
- test/functional/template_snippet_test.rb
|
86
95
|
- test/helpers/test_app.rb
|
96
|
+
- test/test_app/app/controllers/application_controller.rb
|
87
97
|
- test/test_helper.rb
|
88
98
|
- test/unit/command_line_parser_test.rb
|
89
|
-
|
99
|
+
- test/unit/command_line_slicer_test.rb
|
100
|
+
- test/unit/controller/base_test.rb
|
101
|
+
homepage: http://my.luc.ie
|
90
102
|
licenses: []
|
103
|
+
metadata: {}
|
91
104
|
post_install_message:
|
92
105
|
rdoc_options: []
|
93
106
|
require_paths:
|
94
107
|
- lib
|
95
108
|
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
-
none: false
|
97
109
|
requirements:
|
98
|
-
- -
|
110
|
+
- - '>='
|
99
111
|
- !ruby/object:Gem::Version
|
100
112
|
version: '0'
|
101
|
-
segments:
|
102
|
-
- 0
|
103
|
-
hash: 1605038875094015661
|
104
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
114
|
requirements:
|
107
|
-
- -
|
115
|
+
- - '>='
|
108
116
|
- !ruby/object:Gem::Version
|
109
117
|
version: '0'
|
110
|
-
segments:
|
111
|
-
- 0
|
112
|
-
hash: 1605038875094015661
|
113
118
|
requirements: []
|
114
119
|
rubyforge_project:
|
115
|
-
rubygems_version:
|
120
|
+
rubygems_version: 2.0.3
|
116
121
|
signing_key:
|
117
|
-
specification_version:
|
118
|
-
summary: '
|
122
|
+
specification_version: 4
|
123
|
+
summary: Library part of Lucie framework. Use only this gem, if you don't need project
|
124
|
+
generator.
|
119
125
|
test_files:
|
120
126
|
- test/fixtures/command_parser_fixtures.rb
|
121
|
-
- test/
|
127
|
+
- test/fixtures/template_snippet_fixtures.rb
|
128
|
+
- test/functional/app_test.rb
|
122
129
|
- test/functional/template_snippet_test.rb
|
123
130
|
- test/helpers/test_app.rb
|
131
|
+
- test/test_app/app/controllers/application_controller.rb
|
124
132
|
- test/test_helper.rb
|
125
133
|
- test/unit/command_line_parser_test.rb
|
134
|
+
- test/unit/command_line_slicer_test.rb
|
135
|
+
- test/unit/controller/base_test.rb
|