cog 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/BuiltIn.cogfile +96 -0
- data/bin/cog +30 -39
- data/built_in/generators/sort.rb +3 -0
- data/built_in/plugins/basic/Cogfile +6 -0
- data/built_in/plugins/basic/templates/basic/generator.rb.erb +1 -0
- data/built_in/templates/cog/Cogfile.erb +40 -0
- data/built_in/templates/cog/plugin/generator.rb.erb.erb +3 -0
- data/{templates/cog/custom_tool/tool.rb.erb → built_in/templates/cog/plugin/plugin.rb.erb} +4 -11
- data/{templates → built_in/templates}/warning.erb +0 -0
- data/lib/cog.rb +25 -11
- data/lib/cog/config.rb +112 -49
- data/lib/cog/config/{language_methods.rb → language_config.rb} +23 -27
- data/lib/cog/config/plugin_config.rb +31 -0
- data/lib/cog/config/project_config.rb +48 -0
- data/lib/cog/controllers.rb +6 -8
- data/lib/cog/controllers/generator_controller.rb +30 -21
- data/lib/cog/controllers/plugin_controller.rb +43 -0
- data/lib/cog/controllers/template_controller.rb +12 -33
- data/lib/cog/dsl.rb +9 -0
- data/lib/cog/dsl/cogfile.rb +145 -0
- data/lib/cog/dsl/language_dsl.rb +142 -0
- data/lib/cog/embed_context.rb +0 -2
- data/lib/cog/embeds.rb +2 -7
- data/lib/cog/errors.rb +11 -24
- data/lib/cog/generator.rb +10 -15
- data/lib/cog/generator/file_methods.rb +2 -2
- data/lib/cog/generator/filters.rb +10 -14
- data/lib/cog/generator/language_methods.rb +2 -3
- data/lib/cog/generator_sandbox.rb +32 -0
- data/lib/cog/helpers.rb +10 -2
- data/lib/cog/helpers/cascading_set.rb +104 -0
- data/lib/cog/{embeds → helpers}/file_scanner.rb +1 -1
- data/lib/cog/language.rb +140 -0
- data/lib/cog/native_extensions.rb +2 -0
- data/lib/cog/native_extensions/array.rb +19 -0
- data/lib/cog/native_extensions/string.rb +54 -0
- data/lib/cog/plugin.rb +35 -0
- data/lib/cog/spec_helpers.rb +36 -14
- data/lib/cog/spec_helpers/matchers.rb +14 -4
- data/lib/cog/spec_helpers/matchers/match_maker.rb +1 -1
- data/lib/cog/spec_helpers/runner.rb +3 -9
- data/lib/cog/version.rb +1 -1
- metadata +27 -44
- data/Default.cogfile +0 -25
- data/lib/cog/built_in_tools.rb +0 -9
- data/lib/cog/built_in_tools/basic.rb +0 -10
- data/lib/cog/built_in_tools/basic/cog_tool.rb +0 -11
- data/lib/cog/config/cogfile.rb +0 -117
- data/lib/cog/config/lang_info.rb +0 -40
- data/lib/cog/config/project_methods.rb +0 -35
- data/lib/cog/config/tool_methods.rb +0 -94
- data/lib/cog/controllers/tool_controller.rb +0 -50
- data/lib/cog/helpers/cascading_template_set.rb +0 -75
- data/lib/cog/helpers/string.rb +0 -26
- data/lib/cog/languages.rb +0 -52
- data/lib/cog/languages/c_language.rb +0 -29
- data/lib/cog/languages/c_plus_plus_language.rb +0 -28
- data/lib/cog/languages/c_sharp_language.rb +0 -24
- data/lib/cog/languages/java_language.rb +0 -24
- data/lib/cog/languages/java_script_language.rb +0 -24
- data/lib/cog/languages/language.rb +0 -73
- data/lib/cog/languages/mixins.rb +0 -10
- data/lib/cog/languages/mixins/c_style_comments.rb +0 -23
- data/lib/cog/languages/mixins/hash_comments.rb +0 -19
- data/lib/cog/languages/python_language.rb +0 -20
- data/lib/cog/languages/qt_project_language.rb +0 -16
- data/lib/cog/languages/ruby_language.rb +0 -28
- data/lib/cog/tool.rb +0 -61
- data/lib/cog/tool/dsl.rb +0 -26
- data/templates/basic/generator.rb.erb +0 -4
- data/templates/cog/custom_tool/Gemfile.erb +0 -8
- data/templates/cog/custom_tool/LICENSE.erb +0 -18
- data/templates/cog/custom_tool/README.markdown.erb +0 -18
- data/templates/cog/custom_tool/Rakefile.erb +0 -15
- data/templates/cog/custom_tool/cog_tool.rb.erb +0 -17
- data/templates/cog/custom_tool/generator.rb.erb.erb +0 -9
- data/templates/cog/custom_tool/template.txt.erb.erb +0 -1
- data/templates/cog/custom_tool/tool.gemspec.erb +0 -17
- data/templates/cog/custom_tool/version.rb.erb +0 -5
data/BuiltIn.cogfile
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
generator_path 'built_in/generators'
|
2
|
+
template_path 'built_in/templates'
|
3
|
+
plugin_path 'built_in/plugins'
|
4
|
+
plugin_path Cog.gems_root_dir, true
|
5
|
+
|
6
|
+
language :c do |l|
|
7
|
+
l.name 'C'
|
8
|
+
l.comment '//'
|
9
|
+
l.multiline_comment '/*', '*/'
|
10
|
+
l.extension :c, :h
|
11
|
+
l.include_guard_begin {|name| "#ifndef #{name.underscore.upcase}\n#define #{name.underscore.upcase}"}
|
12
|
+
l.include_guard_end {|name| "#endif"}
|
13
|
+
end
|
14
|
+
|
15
|
+
language 'c++' do |l|
|
16
|
+
l.name 'C++'
|
17
|
+
l.comment_style :c
|
18
|
+
l.include_guard_style :c
|
19
|
+
l.extension :h, :hh, :hpp, :hxx, 'h++', :cc, :cpp, :cxx, 'c++'
|
20
|
+
l.use_named_scope {|name| "using namespace #{name};"}
|
21
|
+
l.named_scope_begin {|name| "namespace #{name} {"}
|
22
|
+
l.named_scope_end {|name| "} // namespace #{name}"}
|
23
|
+
end
|
24
|
+
|
25
|
+
language 'c#' do |l|
|
26
|
+
l.name 'C#'
|
27
|
+
l.comment_style :c
|
28
|
+
l.extension :cs
|
29
|
+
l.named_scope_begin {|name| "namespace #{name} {"}
|
30
|
+
l.named_scope_end {|name| "} // namespace #{name}"}
|
31
|
+
end
|
32
|
+
|
33
|
+
language :css do |l|
|
34
|
+
l.name 'Cascading Style Sheets'
|
35
|
+
l.multiline_comment '/*', '*/'
|
36
|
+
l.extension :css
|
37
|
+
end
|
38
|
+
|
39
|
+
language :html do |l|
|
40
|
+
l.name 'Hyper-text Markup Language'
|
41
|
+
l.comment_style :xml
|
42
|
+
l.extension :html
|
43
|
+
l.named_scope_begin {|name| "<div id='#{name}' class='cog-named-scope'>"}
|
44
|
+
l.named_scope_end {|name| "</div><!-- end of named scope #{name} -->"}
|
45
|
+
end
|
46
|
+
|
47
|
+
language :java do |l|
|
48
|
+
l.name 'Java'
|
49
|
+
l.comment_style :c
|
50
|
+
l.extension :java
|
51
|
+
l.named_scope_begin {|name| "package #{name};"}
|
52
|
+
l.named_scope_end {|name| "// end of package #{name}"}
|
53
|
+
end
|
54
|
+
|
55
|
+
language :javascript do |l|
|
56
|
+
l.name 'JavaScript'
|
57
|
+
l.comment_style :c
|
58
|
+
l.extension :js
|
59
|
+
l.named_scope_begin {|name| "var #{name} = { // named scope"}
|
60
|
+
l.named_scope_end {|name| "}; // end of named scope #{name}"}
|
61
|
+
end
|
62
|
+
|
63
|
+
language :objc do |l|
|
64
|
+
l.name 'Objective-C'
|
65
|
+
l.comment_style :c
|
66
|
+
l.extension :h, :m, :mm
|
67
|
+
end
|
68
|
+
|
69
|
+
language :python do |l|
|
70
|
+
l.name 'Python'
|
71
|
+
l.comment '#'
|
72
|
+
l.multiline_comment "'''", "'''"
|
73
|
+
l.extension :py
|
74
|
+
end
|
75
|
+
|
76
|
+
language :qt do |l|
|
77
|
+
l.name 'Qt Project'
|
78
|
+
l.comment '#'
|
79
|
+
l.extension :pro, :pri
|
80
|
+
end
|
81
|
+
|
82
|
+
language :ruby do |l|
|
83
|
+
l.comment '#'
|
84
|
+
l.multiline_comment '=begin', '=end'
|
85
|
+
l.extension :rb
|
86
|
+
l.named_scope_begin {|name| "module #{name} # named scope"}
|
87
|
+
l.named_scope_end {|name| "end # named scope #{name}"}
|
88
|
+
end
|
89
|
+
|
90
|
+
language :xml do |l|
|
91
|
+
l.name 'Extensible Markup Language'
|
92
|
+
l.multiline_comment '<!--', '-->'
|
93
|
+
l.extension :xml
|
94
|
+
l.named_scope_begin {|name| "<cog:named-scope id='#{name}'>"}
|
95
|
+
l.named_scope_end {|name| "</cog:named-scope><!-- #{name} -->"}
|
96
|
+
end
|
data/bin/cog
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'gli'
|
3
|
-
$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
4
3
|
require 'cog'
|
5
|
-
require 'active_support/core_ext'
|
6
|
-
require 'fileutils'
|
7
|
-
require 'rainbow'
|
8
4
|
|
9
5
|
include GLI::App
|
10
6
|
|
@@ -13,18 +9,13 @@ program_desc 'This is a utility to help you write code generators.'
|
|
13
9
|
desc 'Current version of cog'
|
14
10
|
version Cog::VERSION
|
15
11
|
|
16
|
-
desc '
|
17
|
-
switch
|
12
|
+
desc 'When listing files, show the full path to the file'
|
13
|
+
switch :fullpaths
|
18
14
|
|
19
15
|
desc 'Set the Cogfile explicitly'
|
20
16
|
arg_name 'path'
|
21
17
|
flag :cogfile
|
22
18
|
|
23
|
-
desc 'Set the active tool'
|
24
|
-
arg_name 'name'
|
25
|
-
default_value 'basic'
|
26
|
-
flag [:tool, :t]
|
27
|
-
|
28
19
|
desc 'Suppress the use of color in output'
|
29
20
|
switch :colorless
|
30
21
|
|
@@ -44,7 +35,7 @@ command [:generator, :gen] do |c|
|
|
44
35
|
c.desc 'List project generators'
|
45
36
|
c.command :list do |sub|
|
46
37
|
sub.action do |gopt, opt, args|
|
47
|
-
x = Cog::Controllers::GeneratorController.list
|
38
|
+
x = Cog::Controllers::GeneratorController.list
|
48
39
|
puts x.join "\n" unless x.empty?
|
49
40
|
end
|
50
41
|
end
|
@@ -56,13 +47,18 @@ command [:generator, :gen] do |c|
|
|
56
47
|
sub.default_value 'in Cogfile'
|
57
48
|
sub.flag [:language, :l]
|
58
49
|
|
50
|
+
sub.desc 'Specify the plugin which will be used to create the generator'
|
51
|
+
sub.arg_name 'name'
|
52
|
+
sub.default_value 'basic'
|
53
|
+
sub.flag [:plugin, :p]
|
54
|
+
|
59
55
|
sub.action do |gopt, opt, args|
|
60
56
|
args.each do |name|
|
61
57
|
if opt[:language] && opt[:language] != 'in Cogfile'
|
62
58
|
lang = Cog::Languages.get_language opt[:language]
|
63
59
|
Cog.target_language = lang
|
64
60
|
end
|
65
|
-
Cog::Controllers::GeneratorController.create name
|
61
|
+
Cog::Controllers::GeneratorController.create name, :plugin_name => opt[:plugin]
|
66
62
|
end
|
67
63
|
end
|
68
64
|
end
|
@@ -72,35 +68,37 @@ command [:generator, :gen] do |c|
|
|
72
68
|
c.arg_name 'name'
|
73
69
|
c.command :run do |sub|
|
74
70
|
sub.action do |gopt, opt, args|
|
75
|
-
raise Cog::Errors::ActionRequiresProject.new('run generator') unless Cog.project?
|
76
71
|
Cog::Embeds.gather_from_project
|
77
|
-
|
78
|
-
|
79
|
-
|
72
|
+
if args.empty?
|
73
|
+
Cog::Controllers::GeneratorController.run_all
|
74
|
+
else
|
75
|
+
args.each do |name|
|
76
|
+
Cog::Controllers::GeneratorController.run name
|
77
|
+
end
|
80
78
|
end
|
81
79
|
end
|
82
80
|
end
|
83
81
|
end
|
84
82
|
|
85
|
-
desc 'List or create DSLs known as cog
|
86
|
-
command :
|
83
|
+
desc 'List or create DSLs known as cog plugins'
|
84
|
+
command :plugin do |c|
|
87
85
|
|
88
86
|
c.default_command :list
|
89
87
|
|
90
|
-
c.desc 'List the available
|
88
|
+
c.desc 'List the available plugins'
|
91
89
|
c.command :list do |sub|
|
92
90
|
sub.action do |gopt, opt, args|
|
93
|
-
x = Cog::Controllers::
|
91
|
+
x = Cog::Controllers::PluginController.list
|
94
92
|
puts x.join "\n" unless x.empty?
|
95
93
|
end
|
96
94
|
end
|
97
95
|
|
98
|
-
c.desc 'Create a new
|
99
|
-
c.arg_name '
|
96
|
+
c.desc 'Create a new plugin'
|
97
|
+
c.arg_name 'plugin_name'
|
100
98
|
c.command :new do |sub|
|
101
99
|
sub.action do |gopt, opt, args|
|
102
100
|
args.each do |name|
|
103
|
-
Cog::Controllers::
|
101
|
+
Cog::Controllers::PluginController.create name
|
104
102
|
end
|
105
103
|
end
|
106
104
|
end
|
@@ -114,24 +112,17 @@ command [:template, :tm] do |c|
|
|
114
112
|
c.desc 'List the available templates'
|
115
113
|
c.command :list do |sub|
|
116
114
|
sub.action do |gopt, opt, args|
|
117
|
-
x = Cog::Controllers::TemplateController.list
|
115
|
+
x = Cog::Controllers::TemplateController.list
|
118
116
|
puts x.join "\n" unless x.empty?
|
119
117
|
end
|
120
118
|
end
|
121
119
|
|
122
120
|
c.desc 'Create a new project template'
|
123
121
|
c.command :new do |sub|
|
124
|
-
|
125
|
-
sub.switch ['force-override', :f]
|
126
|
-
|
122
|
+
|
127
123
|
sub.action do |gopt, opt, args|
|
128
124
|
args.each do |name|
|
129
|
-
|
130
|
-
Cog::Controllers::TemplateController.create name, :force_override => opt[:f]
|
131
|
-
rescue Cog::Errors::DuplicateTemplate => e
|
132
|
-
STDERR.write "Use --force-override to copy the original template into your project templates\n"
|
133
|
-
raise
|
134
|
-
end
|
125
|
+
Cog::Controllers::TemplateController.create name, :force_override => opt[:f]
|
135
126
|
end
|
136
127
|
end
|
137
128
|
end
|
@@ -161,11 +152,11 @@ pre do |gopt, command, opt, args|
|
|
161
152
|
STDERR.write "No such Cogfile at #{gopt[:cogfile]}\n"
|
162
153
|
false
|
163
154
|
else
|
164
|
-
Cog.prepare
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
155
|
+
Cog.prepare(
|
156
|
+
:minimal => command.name == :init,
|
157
|
+
:project_cogfile_path => gopt[:cogfile],
|
158
|
+
:fullpaths => gopt[:fullpaths]
|
159
|
+
)
|
169
160
|
true
|
170
161
|
end
|
171
162
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# This is the <%= @name %> generator
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# All paths are relative to the directory containing this file.
|
2
|
+
|
3
|
+
<% if @cogfile_type == :plugin %>
|
4
|
+
stamp_generator do |name, dest|
|
5
|
+
@name = name
|
6
|
+
stamp '<%= @plugin_name %>/generator.rb', dest, :absolute_destination => true
|
7
|
+
end
|
8
|
+
|
9
|
+
autoload_plugin :<%= @plugin_module %>, 'lib/<%= @plugin_name %>'
|
10
|
+
|
11
|
+
<% end %>
|
12
|
+
<% if @cogfile_type == :project %>
|
13
|
+
# Define the directory to which code is generated
|
14
|
+
project_path 'lib'
|
15
|
+
|
16
|
+
<% end %>
|
17
|
+
# Define a directory in which to find generators
|
18
|
+
generator_path '<%= @prefix %>generators'
|
19
|
+
|
20
|
+
# Define a directory in which to find templates
|
21
|
+
template_path '<%= @prefix %>templates'
|
22
|
+
|
23
|
+
<% unless @cogfile_type == :plugin %>
|
24
|
+
# Define a directory in which to find plugins
|
25
|
+
plugin_path '<%= @prefix %>plugins'
|
26
|
+
|
27
|
+
<% end %>
|
28
|
+
<% if @cogfile_type == :project %>
|
29
|
+
# Explicitly specify a mapping from file extensions to languages
|
30
|
+
#
|
31
|
+
# key => value pairs from this mapping will override the default
|
32
|
+
# language map supplied by +cog+
|
33
|
+
#
|
34
|
+
# Type `cog language list` to see a list of supported languages
|
35
|
+
# and the current file extension mappings
|
36
|
+
language_extensions({
|
37
|
+
:h => 'c++',
|
38
|
+
})
|
39
|
+
|
40
|
+
<% end %>
|
@@ -1,22 +1,15 @@
|
|
1
1
|
$LOAD_PATH << File.join(File.dirname(__FILE__))
|
2
|
-
require '<%= @tool_name %>/version'
|
3
2
|
require 'cog'
|
4
3
|
|
5
|
-
# Custom cog
|
6
|
-
module <%= @
|
4
|
+
# Custom cog plugin <%= @plugin_name %>
|
5
|
+
module <%= @plugin_module %>
|
7
6
|
|
8
7
|
# Root of the DSL
|
9
8
|
# Feel free to rename this to something more appropriate
|
10
9
|
def self.widget(generator_name, &block)
|
11
10
|
w = Widget.new generator_name
|
12
11
|
block.call w
|
13
|
-
|
14
|
-
# Activate <%= @tool_name %> while rendering templates
|
15
|
-
# so that cog will be able to find <%= @tool_name %> templates
|
16
|
-
Cog.activate_tool '<%= @tool_name %>' do
|
17
|
-
w.generate
|
18
|
-
end
|
19
|
-
|
12
|
+
w.generate
|
20
13
|
nil
|
21
14
|
end
|
22
15
|
|
@@ -34,7 +27,7 @@ module <%= @tool_module %>
|
|
34
27
|
end
|
35
28
|
|
36
29
|
def generate
|
37
|
-
|
30
|
+
puts "TODO: write generator code for <%= @plugin_name %>"
|
38
31
|
end
|
39
32
|
end
|
40
33
|
end
|
File without changes
|
data/lib/cog.rb
CHANGED
@@ -1,23 +1,37 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require '
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'rainbow'
|
4
|
+
|
4
5
|
require 'cog/errors'
|
5
|
-
require 'cog/
|
6
|
-
require 'cog/helpers'
|
7
|
-
require 'cog/languages'
|
8
|
-
require 'cog/tool'
|
9
|
-
require 'cog/version'
|
6
|
+
require 'cog/native_extensions'
|
10
7
|
|
11
|
-
# This top level module serves as a singleton instance of the {Config} interface.
|
8
|
+
# This top level module serves as a singleton instance of the {Config} interface. It is configured with various cogfiles, which are evaluated as instances of {DSL::Cogfile}.
|
12
9
|
module Cog
|
13
10
|
|
11
|
+
autoload :Config, 'cog/config'
|
12
|
+
autoload :Controllers, 'cog/controllers'
|
13
|
+
autoload :DSL, 'cog/dsl'
|
14
|
+
autoload :EmbedContext, 'cog/embed_context'
|
15
|
+
autoload :Embeds, 'cog/embeds'
|
16
|
+
autoload :Generator, 'cog/generator'
|
17
|
+
autoload :GeneratorSandbox, 'cog/generator_sandbox'
|
18
|
+
autoload :Helpers, 'cog/helpers'
|
19
|
+
autoload :Language, 'cog/language'
|
20
|
+
autoload :Plugin, 'cog/plugin'
|
21
|
+
autoload :VERSION, 'cog/version'
|
22
|
+
|
14
23
|
extend Config
|
15
24
|
|
16
25
|
# Prepare the project in the present working directory for use with +cog+
|
17
26
|
# @return [nil]
|
18
27
|
def self.initialize_project
|
19
|
-
|
20
|
-
|
28
|
+
@cogfile_type = :project
|
29
|
+
@prefix = 'cog/'
|
30
|
+
Generator.stamp 'cog/Cogfile', 'Cogfile', :absolute_destination => true, :binding => binding, :once => true
|
31
|
+
|
32
|
+
@cogfile_type = :user
|
33
|
+
@prefix = ''
|
34
|
+
Generator.stamp 'cog/Cogfile', user_cogfile, :absolute_destination => true, :binding => binding, :once => true
|
21
35
|
nil
|
22
36
|
end
|
23
37
|
|
data/lib/cog/config.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
|
-
require 'cog/config/cogfile'
|
2
|
-
require 'cog/config/language_methods'
|
3
|
-
require 'cog/config/project_methods'
|
4
|
-
require 'cog/config/tool_methods'
|
5
|
-
require 'cog/languages'
|
6
|
-
require 'cog/errors'
|
7
|
-
require 'cog/tool'
|
8
|
-
|
9
1
|
module Cog
|
10
2
|
|
11
3
|
# This is a low level interface. It is mainly used by the {Generator} methods to determine where to find things, and where to put them.
|
12
|
-
# When +cog+ is used in a project it will be configured with a {Cogfile}. The Cogfile is processed during a call to {#prepare}.
|
13
4
|
module Config
|
14
|
-
include ProjectMethods
|
15
|
-
include LanguageMethods
|
16
|
-
include ToolMethods
|
17
5
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
6
|
+
autoload :LanguageConfig, 'cog/config/language_config'
|
7
|
+
autoload :ProjectConfig, 'cog/config/project_config'
|
8
|
+
autoload :PluginConfig, 'cog/config/plugin_config'
|
9
|
+
|
10
|
+
include ProjectConfig
|
11
|
+
include LanguageConfig
|
12
|
+
include PluginConfig
|
13
|
+
|
14
|
+
# @return [Array<String>] directories in which to find generators
|
15
|
+
attr_reader :generator_path
|
16
|
+
|
17
|
+
# @return [Array<String>] directories in which to find templates
|
18
|
+
attr_reader :template_path
|
19
|
+
|
20
|
+
# @return [Array<String>] directories in which to find plugins
|
21
|
+
attr_reader :plugin_path
|
22
22
|
|
23
23
|
# @return [String] Location of the installed cog gem
|
24
24
|
def gem_dir
|
@@ -31,53 +31,110 @@ module Cog
|
|
31
31
|
spec.gem_dir
|
32
32
|
end
|
33
33
|
end
|
34
|
+
|
35
|
+
# @return [String,nil] if installed as a gem, return the parent directory of the gem's location
|
36
|
+
def gems_root_dir
|
37
|
+
x = gem_dir
|
38
|
+
File.expand_path(File.join(x, '..')) unless File.exists?(File.join(x, 'Gemfile'))
|
39
|
+
end
|
40
|
+
|
41
|
+
# @return [String] Path to <tt>${HOME}/.cog</tt>
|
42
|
+
def user_dir
|
43
|
+
File.expand_path File.join(ENV['HOME'], '.cog')
|
44
|
+
end
|
45
|
+
|
46
|
+
# @return [String] Path to the current user's cogfile
|
47
|
+
def user_cogfile
|
48
|
+
File.join user_dir, 'Cogfile'
|
49
|
+
end
|
34
50
|
|
35
|
-
#
|
36
|
-
|
37
|
-
|
38
|
-
#
|
39
|
-
# * {#project_templates_path} which is present if {#project?}
|
40
|
-
# * {Tool#templates_path} for each registered tool (in no particular order)
|
41
|
-
# * {#cog_templates_path} which is *always* present
|
42
|
-
#
|
43
|
-
# @return [Array<String>] a list of directories order with ascending priority
|
44
|
-
def template_paths
|
45
|
-
[@project_templates_path, active_tool && active_tool.templates_path, Cog.cog_templates_path].compact
|
51
|
+
# @return [Boolean] when listing files, full paths should be shown
|
52
|
+
def show_fullpaths?
|
53
|
+
@fullpaths
|
46
54
|
end
|
47
|
-
|
55
|
+
|
48
56
|
# Must be called once before using cog.
|
49
57
|
# In the context of a command-line invocation, this method will be called automatically. Outside of that context, for example in a unit test, it will have to be called manually.
|
50
|
-
# @option opt [
|
51
|
-
# @option opt [Boolean] :
|
58
|
+
# @option opt [Boolean] :fullpaths (false) when listing files, full paths should be shown
|
59
|
+
# @option opt [Boolean] :minimal (false) only load the built-in Cogfile
|
60
|
+
# @option opt [String] :project_cogfile_path (nil) explicitly specify the location of the project {DSL::Cogfile}. If not provided, it will be searched for. If none can be found, {#project?} will be +false+
|
52
61
|
def prepare(opt={})
|
53
62
|
throw :ConfigInstanceAlreadyPrepared if @prepared && !opt[:force_reset]
|
54
63
|
@prepared = true
|
55
|
-
@
|
56
|
-
@
|
57
|
-
@
|
58
|
-
@
|
59
|
-
@
|
60
|
-
@
|
61
|
-
@
|
62
|
-
@
|
63
|
-
@
|
64
|
-
@
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
64
|
+
@fullpaths = opt[:fullpaths]
|
65
|
+
@project_path = nil
|
66
|
+
@project_generator_path = nil
|
67
|
+
@project_plugin_path = nil
|
68
|
+
@project_template_path = nil
|
69
|
+
@generator_path = []
|
70
|
+
@plugin_path = []
|
71
|
+
@template_path = []
|
72
|
+
@plugins = {}
|
73
|
+
@target_language = Language.new
|
74
|
+
@active_languages = [Language.new] # active language stack
|
75
|
+
@language = {}
|
76
|
+
@language_extension_map = {}
|
77
|
+
|
78
|
+
process_cogfiles opt
|
79
|
+
post_cogfile_processing
|
80
|
+
build_language_extension_map
|
72
81
|
end
|
73
82
|
|
74
83
|
private
|
75
84
|
|
76
|
-
#
|
85
|
+
# @option opt [Boolean] :minimal (false) only load the built-in Cogfile
|
86
|
+
# @option opt [String] :project_cogfile_path (nil) project cogfile
|
87
|
+
def process_cogfiles(opt={})
|
88
|
+
@project_cogfile_path = opt[:project_cogfile_path] || find_default_cogfile
|
89
|
+
if @project_cogfile_path
|
90
|
+
@project_cogfile_path = File.expand_path @project_cogfile_path
|
91
|
+
@project_root = File.dirname @project_cogfile_path
|
92
|
+
end
|
93
|
+
process_cogfile built_in_cogfile
|
94
|
+
return if opt[:minimal]
|
95
|
+
process_cogfile user_cogfile if File.exists? user_cogfile
|
96
|
+
process_cogfile @project_cogfile_path, :plugin_path_only => true if @project_cogfile_path
|
97
|
+
plugins.each do |plugin|
|
98
|
+
process_cogfile plugin.cogfile_path, :plugin => plugin
|
99
|
+
end
|
100
|
+
process_cogfile @project_cogfile_path, :project => true if @project_cogfile_path
|
101
|
+
end
|
102
|
+
|
103
|
+
# @param path [String] path to the cogfile
|
104
|
+
# @option opt [Boolean] :plugin_path_only (false) only process +plugin_path+ calls in the given cogfile
|
105
|
+
# @option opt [Boolean] :active_plugin (false) process the +stamp_generator+ call in the given cogfile
|
106
|
+
# @option opt [Plugin] :plugin (nil) indicate that the cogfile is for the given plugin
|
107
|
+
def process_cogfile(path, opt={})
|
108
|
+
cogfile = DSL::Cogfile.new self, path, opt
|
109
|
+
cogfile.interpret
|
110
|
+
end
|
111
|
+
|
112
|
+
def post_cogfile_processing
|
113
|
+
@language.each_value do |lang|
|
114
|
+
if lang.comment_style != lang.key
|
115
|
+
other = @language[lang.comment_style]
|
116
|
+
lang.apply_comment_style other
|
117
|
+
end
|
118
|
+
if lang.include_guard_style != lang.key
|
119
|
+
other = @language[lang.include_guard_style]
|
120
|
+
lang.apply_include_guard_style other
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def build_language_extension_map
|
126
|
+
@language.each_value do |lang|
|
127
|
+
lang.extensions.each do |ext|
|
128
|
+
@language_extension_map[ext] = lang.key unless @language_extension_map.member?(ext)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# The {DSL::Cogfile} will be looked for in the present working directory. If none
|
77
134
|
# is found there the parent directory will be checked, and then the
|
78
135
|
# grandparent, and so on.
|
79
136
|
#
|
80
|
-
# @return [Config] the singleton instance
|
137
|
+
# @return [Config, nil] the singleton instance
|
81
138
|
def find_default_cogfile
|
82
139
|
parts = Dir.pwd.split File::SEPARATOR
|
83
140
|
i = parts.length
|
@@ -87,5 +144,11 @@ module Cog
|
|
87
144
|
path = File.join(parts.slice(0, i) + ['Cogfile']) if i >= 0
|
88
145
|
(path && File.exists?(path)) ? path : nil
|
89
146
|
end
|
147
|
+
|
148
|
+
# @return [String] path to the built-in cogfile
|
149
|
+
def built_in_cogfile
|
150
|
+
File.join gem_dir, 'BuiltIn.cogfile'
|
151
|
+
end
|
152
|
+
|
90
153
|
end
|
91
154
|
end
|