cog 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/cog +22 -1
- data/lib/cog/built_in_tools.rb +9 -0
- data/lib/cog/built_in_tools/basic.rb +2 -2
- data/lib/cog/controllers/template_controller.rb +27 -0
- data/lib/cog/errors.rb +3 -1
- data/lib/cog/generator.rb +20 -2
- data/lib/cog/helpers/string.rb +10 -1
- data/lib/cog/spec_helpers/runner.rb +1 -1
- data/lib/cog/version.rb +1 -1
- metadata +4 -3
data/bin/cog
CHANGED
@@ -24,6 +24,9 @@ arg_name 'name'
|
|
24
24
|
default_value 'basic'
|
25
25
|
flag :tool
|
26
26
|
|
27
|
+
desc 'Suppress the use of color in output'
|
28
|
+
switch :colorless
|
29
|
+
|
27
30
|
desc 'Add cog to the project in the present working directory'
|
28
31
|
command :init do |c|
|
29
32
|
|
@@ -93,7 +96,7 @@ command :tool do |c|
|
|
93
96
|
end
|
94
97
|
|
95
98
|
desc 'Manage templates'
|
96
|
-
command :template do |c|
|
99
|
+
command [:template, :tm] do |c|
|
97
100
|
|
98
101
|
c.default_command :list
|
99
102
|
|
@@ -104,9 +107,27 @@ command :template do |c|
|
|
104
107
|
puts x.join "\n" unless x.empty?
|
105
108
|
end
|
106
109
|
end
|
110
|
+
|
111
|
+
c.desc 'Create a new project template'
|
112
|
+
c.command :new do |sub|
|
113
|
+
sub.desc 'Force override of existing built-in or tool templates'
|
114
|
+
sub.switch ['force-override', :f]
|
115
|
+
|
116
|
+
sub.action do |gopt, opt, args|
|
117
|
+
args.each do |name|
|
118
|
+
begin
|
119
|
+
Cog::Controllers::TemplateController.create name, :force_override => opt[:f]
|
120
|
+
rescue Cog::Errors::DuplicateTemplate => e
|
121
|
+
STDERR.write "Use --force-override to copy the original template into your project templates\n"
|
122
|
+
raise
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
107
127
|
end
|
108
128
|
|
109
129
|
pre do |gopt, command, opt, args|
|
130
|
+
Sickill::Rainbow.enabled = false if gopt[:colorless]
|
110
131
|
if gopt[:cogfile] && !File.exists?(gopt[:cogfile])
|
111
132
|
STDERR.write "No such Cogfile at #{gopt[:cogfile]}\n"
|
112
133
|
false
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'cog/config'
|
2
2
|
require 'cog/errors'
|
3
|
+
require 'cog/generator'
|
3
4
|
require 'cog/helpers'
|
4
5
|
require 'rainbow'
|
5
6
|
|
@@ -26,6 +27,32 @@ module Cog
|
|
26
27
|
cts.to_a
|
27
28
|
end
|
28
29
|
|
30
|
+
# Create a new project template
|
31
|
+
# @param name [String] name of the template, relative to the project's templates directory
|
32
|
+
# @option opt [Boolean] :force_override (false) if a built-in or tool template with the same name already exists, should a project override be created?
|
33
|
+
# @return [nil]
|
34
|
+
def self.create(name, opt={})
|
35
|
+
raise Errors::ActionRequiresProject.new('create template') unless Config.instance.project?
|
36
|
+
name = name.without_extension :erb
|
37
|
+
dest = File.join Config.instance.project_templates_path, "#{name}.erb"
|
38
|
+
Object.instance_eval do
|
39
|
+
extend Generator
|
40
|
+
begin
|
41
|
+
original = get_template name, :as_path => true
|
42
|
+
return if original == dest # Nothing to create
|
43
|
+
if opt[:force_override]
|
44
|
+
copy_if_missing original, dest
|
45
|
+
else
|
46
|
+
raise Errors::DuplicateTemplate.new original
|
47
|
+
end
|
48
|
+
rescue Errors::NoSuchTemplate
|
49
|
+
# No original, ok to create an empty template
|
50
|
+
touch_file dest
|
51
|
+
end
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
29
56
|
end
|
30
57
|
end
|
31
58
|
end
|
data/lib/cog/errors.rb
CHANGED
@@ -38,7 +38,9 @@ module Cog
|
|
38
38
|
"a file or directory at the given path already exists, cannot create anything there"
|
39
39
|
end
|
40
40
|
|
41
|
-
define_error :DuplicateGenerator, 'generator
|
41
|
+
define_error :DuplicateGenerator, 'generator'
|
42
|
+
|
43
|
+
define_error :DuplicateTemplate, 'template'
|
42
44
|
|
43
45
|
define_error :DuplicateTool, 'tool'
|
44
46
|
|
data/lib/cog/generator.rb
CHANGED
@@ -16,7 +16,8 @@ module Cog
|
|
16
16
|
# Get the template with the given name
|
17
17
|
# @param path [String] path to template file relative one of the {Config#template_paths}
|
18
18
|
# @option opt [Boolean] :absolute (false) is the +path+ argument absolute?
|
19
|
-
# @
|
19
|
+
# @option opt [Boolean] :as_path (false) return the template as an ERB instance (+false+) or an absolute path to the file (+true+)
|
20
|
+
# @return [ERB, String] an instance of {http://ruby-doc.org/stdlib-1.9.3/libdoc/erb/rdoc/ERB.html ERB} or an absolute path to the template
|
20
21
|
def get_template(path, opt={})
|
21
22
|
path += '.erb'
|
22
23
|
fullpath = if opt[:absolute]
|
@@ -28,7 +29,11 @@ module Cog
|
|
28
29
|
end
|
29
30
|
end
|
30
31
|
raise Errors::NoSuchTemplate.new path unless File.exists? fullpath
|
31
|
-
|
32
|
+
if opt[:as_path]
|
33
|
+
File.expand_path fullpath
|
34
|
+
else
|
35
|
+
ERB.new File.read(fullpath), 0, '>'
|
36
|
+
end
|
32
37
|
end
|
33
38
|
|
34
39
|
# Stamp a template into a file or return it as a string
|
@@ -64,6 +69,7 @@ module Cog
|
|
64
69
|
# @return [nil]
|
65
70
|
def copy_if_missing(src, dest, opt={})
|
66
71
|
unless File.exists? dest
|
72
|
+
touch_path File.dirname(dest), opt
|
67
73
|
FileUtils.cp src, dest
|
68
74
|
STDOUT.write "Created #{dest.relative_to_project_root}\n".color(:green) unless opt[:quiet]
|
69
75
|
end
|
@@ -81,6 +87,18 @@ module Cog
|
|
81
87
|
nil
|
82
88
|
end
|
83
89
|
|
90
|
+
# Create the file at the given path,
|
91
|
+
# Creates directories along the path as required.
|
92
|
+
# @param path [String] a file system path representing a file
|
93
|
+
# @option opt [Boolean] :quiet (false) suppress writing to STDOUT?
|
94
|
+
# @return [nil]
|
95
|
+
def touch_file(path, opt={})
|
96
|
+
touch_path File.dirname(path), opt
|
97
|
+
FileUtils.touch path
|
98
|
+
STDOUT.write "Created #{path.relative_to_project_root}\n".color(:green) unless opt[:quiet]
|
99
|
+
nil
|
100
|
+
end
|
101
|
+
|
84
102
|
# File extension for a snippet of the given source code language.
|
85
103
|
# @api unstable
|
86
104
|
# @example
|
data/lib/cog/helpers/string.rb
CHANGED
@@ -12,6 +12,15 @@ class String
|
|
12
12
|
# @return [String] this string as a file system path relative to the +prefix+
|
13
13
|
def relative_to(prefix)
|
14
14
|
return dup if prefix.nil?
|
15
|
-
start_with?(prefix) ? slice(prefix.length+1..-1) : dup
|
15
|
+
start_with?(prefix.to_s) ? slice(prefix.to_s.length+1..-1) : dup
|
16
|
+
end
|
17
|
+
|
18
|
+
# @param ext [String] file extension to remove from the end of this string
|
19
|
+
# @return [String] a copy of this string with the given extension removed. Does nothing if this string does not edit with the extension
|
20
|
+
def without_extension(ext)
|
21
|
+
return dup if ext.nil?
|
22
|
+
ext = ext.to_s
|
23
|
+
ext = '.' + ext unless ext.start_with? '.'
|
24
|
+
end_with?(ext) ? slice(0..(-ext.length - 1)) : dup
|
16
25
|
end
|
17
26
|
end
|
@@ -19,7 +19,7 @@ module Cog
|
|
19
19
|
# @param args [Array<String>] arguments to pass to +cog+
|
20
20
|
# @return [Invocation] an object which can be used with custom {Matchers}
|
21
21
|
def run(*args)
|
22
|
-
args = [@cog] + args
|
22
|
+
args = [@cog, '--colorless'] + args
|
23
23
|
Invocation.new(args.collect {|x| x.to_s}, :tools => @tools)
|
24
24
|
end
|
25
25
|
end
|
data/lib/cog/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kevin Tonon
|
@@ -100,6 +100,7 @@ files:
|
|
100
100
|
- templates/warning.h.erb
|
101
101
|
- lib/cog/built_in_tools/basic/cog_tool.rb
|
102
102
|
- lib/cog/built_in_tools/basic.rb
|
103
|
+
- lib/cog/built_in_tools.rb
|
103
104
|
- lib/cog/config/cogfile.rb
|
104
105
|
- lib/cog/config/tool.rb
|
105
106
|
- lib/cog/config.rb
|