cog 0.2.2 → 0.3.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.
- 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
@@ -1,36 +1,32 @@
|
|
1
|
-
require 'cog/config/lang_info'
|
2
|
-
|
3
1
|
module Cog
|
4
2
|
module Config
|
5
3
|
|
6
4
|
# {Config} methods related to languages
|
7
|
-
module
|
8
|
-
|
9
|
-
# @return [Languages::Lanugage] target language which should be used when creating generators, and no language is explicitly specified
|
10
|
-
attr_accessor :target_language
|
5
|
+
module LanguageConfig
|
11
6
|
|
12
|
-
# @return [
|
7
|
+
# @return [Language] language which is active in the current context
|
13
8
|
def active_language
|
14
9
|
@active_languages.last
|
15
10
|
end
|
16
11
|
|
17
12
|
# Activate a given language within the scope of the provided block.
|
18
|
-
# Either provide <tt
|
19
|
-
# @
|
13
|
+
# Either provide <tt>key</tt> or <tt>:ext</tt> but not both. If the extension does not match any of the supported languages, the {#active_language} will not change, but the block will still be called.
|
14
|
+
# @param key [:String] the lanuage identifier. Type <tt>cog language list</tt> to see the possible values
|
20
15
|
# @option opt [:String] :ext (nil) a file extension which will map to a language identifier. Type <tt>cog language map</tt> to see mapped extensions
|
21
16
|
# @yield within this block the {#active_language} will be set to the desired value
|
22
17
|
# @return [Object] the value returned by the block
|
23
|
-
def activate_language(opt={}, &block)
|
18
|
+
def activate_language(key, opt={}, &block)
|
24
19
|
throw :ActivateLanguageRequiresABlock if block.nil?
|
25
|
-
|
26
|
-
|
20
|
+
opt, key = key, nil if key.is_a? Hash
|
21
|
+
key = if opt[:ext]
|
22
|
+
ext = opt[:ext].to_s.downcase
|
27
23
|
ext = ext.slice(1..-1) if ext.start_with?('.')
|
28
|
-
@language_extension_map[ext
|
24
|
+
@language_extension_map[ext] unless ext.empty?
|
29
25
|
else
|
30
|
-
|
26
|
+
key
|
31
27
|
end
|
32
|
-
if
|
33
|
-
@active_languages <<
|
28
|
+
if key
|
29
|
+
@active_languages << @language[key]
|
34
30
|
r = block.call
|
35
31
|
@active_languages.pop
|
36
32
|
r
|
@@ -44,26 +40,26 @@ module Cog
|
|
44
40
|
@language_extension_map.keys
|
45
41
|
end
|
46
42
|
|
43
|
+
# @param key [String] the language key
|
44
|
+
# @return [Language] the language for the given key
|
45
|
+
def language(key)
|
46
|
+
@language[key]
|
47
|
+
end
|
48
|
+
|
47
49
|
# @param path [String] the file system extension, or full path to a file
|
48
|
-
# @return [
|
50
|
+
# @return [Language, nil] the language for the given extension
|
49
51
|
def language_for(path)
|
50
52
|
ext = File.extname(path.to_s)
|
51
53
|
ext = path.to_s if ext.empty?
|
52
54
|
ext = ext.downcase
|
53
55
|
ext = ext.slice(1..-1) if ext.start_with? '.'
|
54
|
-
|
55
|
-
|
56
|
+
key = @language_extension_map[ext]
|
57
|
+
@language[key] if key
|
56
58
|
end
|
57
59
|
|
58
|
-
# @return [Array<
|
60
|
+
# @return [Array<Language>] current configuration of supported languages
|
59
61
|
def language_summary
|
60
|
-
|
61
|
-
@language_extension_map.each_pair do |ext, lang_id|
|
62
|
-
lang_id = Languages::ALIAS[lang_id] || lang_id
|
63
|
-
summary[lang_id] ||= LangInfo.new(lang_id, Languages::REV_ALIAS[lang_id] || [])
|
64
|
-
summary[lang_id].extensions << ext
|
65
|
-
end
|
66
|
-
summary.values.sort
|
62
|
+
@language.values.sort
|
67
63
|
end
|
68
64
|
|
69
65
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Cog
|
2
|
+
module Config
|
3
|
+
|
4
|
+
# {Config} methods related to plugins
|
5
|
+
module PluginConfig
|
6
|
+
|
7
|
+
# @return [Plugin] the plugin registered for the given name
|
8
|
+
def plugin(name)
|
9
|
+
@plugins[name]
|
10
|
+
end
|
11
|
+
|
12
|
+
# @return [Array<Plugin>] a sorted list of available plugins
|
13
|
+
def plugins
|
14
|
+
@plugins.values.sort
|
15
|
+
end
|
16
|
+
|
17
|
+
# @api developer
|
18
|
+
# Register plugins found in the given directory
|
19
|
+
# @param path [String] path to a directory containing cog plugins
|
20
|
+
# @return [nil]
|
21
|
+
def register_plugins(path)
|
22
|
+
Dir.glob("#{path}/*/Cogfile").each do |cogfile_path|
|
23
|
+
p = Plugin.new cogfile_path
|
24
|
+
@plugins[p.name] ||= p
|
25
|
+
end
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Cog
|
2
|
+
module Config
|
3
|
+
|
4
|
+
# {Config} methods related to projects
|
5
|
+
module ProjectConfig
|
6
|
+
|
7
|
+
# @return [String] path to the project's {DSL::Cogfile}
|
8
|
+
attr_reader :project_cogfile_path
|
9
|
+
|
10
|
+
# @return [String] directory in which to place generated output. For example, the +destination+ parameter of {Generator#stamp} is relative to this path.
|
11
|
+
attr_reader :project_path
|
12
|
+
|
13
|
+
# @return [String] directory in which the project's {DSL::Cogfile} is found
|
14
|
+
attr_reader :project_root
|
15
|
+
|
16
|
+
# @return [String,nil] directory in which to place project generators
|
17
|
+
attr_reader :project_generator_path
|
18
|
+
|
19
|
+
# @return [String,nil] directory in which to place project plugins
|
20
|
+
attr_reader :project_plugin_path
|
21
|
+
|
22
|
+
# @return [String,nil] directory in which to place project templates
|
23
|
+
attr_reader :project_template_path
|
24
|
+
|
25
|
+
# @return [Boolean] whether or not we operating in the context of a project
|
26
|
+
def project?
|
27
|
+
!@project_root.nil?
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Array<String>] list of paths to files in the {#project_path} which are written in a supported language
|
31
|
+
def supported_project_files
|
32
|
+
if project?
|
33
|
+
exts = Cog.language_extensions.join ','
|
34
|
+
Dir.glob "#{Cog.project_path}/**/*.{#{exts}}"
|
35
|
+
else
|
36
|
+
[]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def path_if_for_project(path)
|
43
|
+
path if path && path.start_with?(@project_root)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/cog/controllers.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
require 'cog/controllers/generator_controller'
|
2
|
-
require 'cog/controllers/template_controller'
|
3
|
-
require 'cog/controllers/tool_controller'
|
4
|
-
require 'cog/errors'
|
5
|
-
|
6
1
|
module Cog
|
7
2
|
|
8
|
-
# Contains controllers for managing basic +cog+ objects like generators, templates, and
|
3
|
+
# Contains controllers for managing basic +cog+ objects like generators, templates, and plugins
|
9
4
|
module Controllers
|
10
|
-
|
5
|
+
|
6
|
+
autoload :GeneratorController, 'cog/controllers/generator_controller'
|
7
|
+
autoload :TemplateController, 'cog/controllers/template_controller'
|
8
|
+
autoload :PluginController, 'cog/controllers/plugin_controller'
|
11
9
|
|
10
|
+
end
|
12
11
|
end
|
13
|
-
|
@@ -1,8 +1,3 @@
|
|
1
|
-
require 'cog/config'
|
2
|
-
require 'cog/errors'
|
3
|
-
require 'cog/helpers'
|
4
|
-
require 'rainbow'
|
5
|
-
|
6
1
|
module Cog
|
7
2
|
module Controllers
|
8
3
|
|
@@ -11,34 +6,48 @@ module Cog
|
|
11
6
|
|
12
7
|
# Create a new generator
|
13
8
|
# @param name [String] the name to use for the new generator
|
9
|
+
# @option opt [String] :plugin_name (nil) plugin to use
|
14
10
|
# @return [Boolean] was the generator successfully created?
|
15
|
-
def self.create(name)
|
16
|
-
|
17
|
-
|
18
|
-
raise Errors::
|
19
|
-
|
11
|
+
def self.create(name, opt={})
|
12
|
+
plugin = Cog.plugin(opt[:plugin_name])
|
13
|
+
prefix = Cog.project_generator_path
|
14
|
+
raise Errors::NoSuchPlugin.new(opt[:plugin_name]) if plugin.nil?
|
15
|
+
raise Errors::PluginMissingDefinition.new('stamp_generator') if plugin.stamp_generator_block.nil?
|
16
|
+
raise Errors::ActionRequiresProjectGeneratorPath.new('create generator') unless prefix
|
17
|
+
dest = File.join prefix, "#{name}.rb"
|
18
|
+
raise Errors::DuplicateGenerator.new(dest) if File.exists?(dest)
|
19
|
+
plugin.stamp_generator_block.call name.to_s, dest
|
20
20
|
end
|
21
21
|
|
22
22
|
# List the available project generators
|
23
|
-
# @option opt [Boolean] :verbose (false) list full paths to generator files
|
24
23
|
# @return [Array<String>] a list of generators
|
25
|
-
def self.list
|
26
|
-
|
27
|
-
x = Dir.glob(File.join Cog.project_generators_path, '*.rb')
|
28
|
-
opt[:verbose] ? x : (x.collect {|path| File.basename(path).slice(0..-4)})
|
24
|
+
def self.list
|
25
|
+
Helpers::CascadingSet.process_paths Cog.generator_path, :ext => 'rb'
|
29
26
|
end
|
30
27
|
|
31
28
|
# Run the generator with the given name
|
32
|
-
# @param name [String] name of the generator
|
29
|
+
# @param name [String] name of the generator to run
|
33
30
|
# @return [nil]
|
34
31
|
def self.run(name)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
Cog.generator_path.reverse.each do |root|
|
33
|
+
path = File.join root, "#{name}.rb"
|
34
|
+
if File.exists?(path)
|
35
|
+
GeneratorSandbox.new(path).interpret
|
36
|
+
return
|
37
|
+
end
|
38
|
+
end
|
39
|
+
raise Errors::NoSuchGenerator.new(name)
|
40
40
|
end
|
41
41
|
|
42
|
+
# Run all generators
|
43
|
+
# @return [nil]
|
44
|
+
def self.run_all
|
45
|
+
Cog.generator_path.each do |root|
|
46
|
+
Dir.glob("#{root}/*.rb").each do |path|
|
47
|
+
GeneratorSandbox.new(path).interpret
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
42
51
|
end
|
43
52
|
end
|
44
53
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Cog
|
2
|
+
module Controllers
|
3
|
+
|
4
|
+
# Manage +cog+ plugins
|
5
|
+
#
|
6
|
+
# @see https://github.com/ktonon/cog#plugins Introduction to Plugins
|
7
|
+
module PluginController
|
8
|
+
|
9
|
+
# Generate a new project plugin with the given name
|
10
|
+
# @param name [String] name of the plugin to create. Should not conflict with other plugin names
|
11
|
+
# @return [nil]
|
12
|
+
def self.create(name)
|
13
|
+
raise Errors::DuplicatePlugin.new(name) unless Cog.plugin(name).nil?
|
14
|
+
@cogfile_type = :plugin
|
15
|
+
@prefix = ''
|
16
|
+
@cog_version = Cog::VERSION
|
17
|
+
@plugin_name = name.to_s.underscore
|
18
|
+
@plugin_module = name.to_s.camelize
|
19
|
+
prefix = Cog.project_plugin_path
|
20
|
+
prefix = prefix ? "#{prefix}/" : ''
|
21
|
+
opt = { :absolute_destination => true, :binding => binding }
|
22
|
+
[
|
23
|
+
['Cogfile', 'Cogfile'],
|
24
|
+
['plugin/plugin.rb', "lib/#{@plugin_name}.rb"],
|
25
|
+
['plugin/generator.rb.erb', "templates/#{@plugin_name}/generator.rb.erb"],
|
26
|
+
].each do |tm, dest|
|
27
|
+
Generator.stamp "cog/#{tm}", "#{prefix}#{@plugin_name}/#{dest}", opt
|
28
|
+
end
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Array<String>] a list of available plugins
|
33
|
+
def self.list
|
34
|
+
cs = Helpers::CascadingSet.new
|
35
|
+
Cog.plugins.each do |plugin|
|
36
|
+
cs.add_plugin plugin
|
37
|
+
end
|
38
|
+
cs.to_a
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -1,53 +1,32 @@
|
|
1
|
-
require 'cog/config'
|
2
|
-
require 'cog/errors'
|
3
|
-
require 'cog/generator'
|
4
|
-
require 'cog/helpers'
|
5
|
-
require 'rainbow'
|
6
|
-
|
7
1
|
module Cog
|
8
2
|
module Controllers
|
9
3
|
|
10
4
|
# Manage a project's templates
|
11
5
|
module TemplateController
|
12
6
|
|
13
|
-
# List the available templates
|
14
|
-
# @option opt [Boolean] :verbose (false) list full template paths
|
15
|
-
# @return [Array<String>] a list of templates
|
16
|
-
def self.list(opt={})
|
17
|
-
cts = Helpers::CascadingTemplateSet.new
|
18
|
-
cts.add_templates 'built-in', :built_in, Cog.cog_templates_path, opt
|
19
|
-
tool = Cog.active_tool
|
20
|
-
unless tool.templates_path.nil?
|
21
|
-
cts.add_templates tool.name, :tool, tool.templates_path, opt
|
22
|
-
end
|
23
|
-
if Cog.project?
|
24
|
-
cts.add_templates 'project', :project, Cog.project_templates_path, opt
|
25
|
-
end
|
26
|
-
cts.to_a
|
27
|
-
end
|
28
|
-
|
29
7
|
# Create a new project template
|
30
8
|
# @param name [String] name of the template, relative to the project's templates directory
|
31
|
-
# @option opt [Boolean] :force_override (false) if a built-in or
|
9
|
+
# @option opt [Boolean] :force_override (false) if a built-in or plugin template with the same name already exists, should a project override be created?
|
32
10
|
# @return [nil]
|
33
11
|
def self.create(name, opt={})
|
34
|
-
|
12
|
+
prefix = Cog.project_template_path
|
13
|
+
raise Errors::ActionRequiresProjectTemplatePath.new('create template') unless prefix
|
35
14
|
name = name.without_extension :erb
|
36
|
-
dest = File.join
|
37
|
-
|
15
|
+
dest = File.join prefix, "#{name}.erb"
|
38
16
|
original = Generator.get_template name, :as_path => true
|
39
|
-
|
40
|
-
if opt[:force_override]
|
41
|
-
Generator.copy_file_if_missing original, dest
|
42
|
-
else
|
43
|
-
raise Errors::DuplicateTemplate.new original
|
44
|
-
end
|
17
|
+
Generator.copy_file_if_missing original, dest
|
45
18
|
nil
|
46
19
|
rescue Errors::NoSuchTemplate
|
47
20
|
# No original, ok to create an empty template
|
48
|
-
touch_file dest
|
21
|
+
Generator.touch_file dest
|
49
22
|
nil
|
50
23
|
end
|
24
|
+
|
25
|
+
# List the available templates
|
26
|
+
# @return [Array<String>] a list of templates
|
27
|
+
def self.list
|
28
|
+
Helpers::CascadingSet.process_paths Cog.template_path, :ext => 'erb'
|
29
|
+
end
|
51
30
|
|
52
31
|
end
|
53
32
|
end
|
data/lib/cog/dsl.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
module Cog
|
2
|
+
module DSL
|
3
|
+
|
4
|
+
# In your project's +Cogfile+, +self+ has been set to an instance of this class.
|
5
|
+
# Typing <tt>cog init</tt> will create a +Cogfile+ in the present working directory.
|
6
|
+
class Cogfile
|
7
|
+
|
8
|
+
include Generator
|
9
|
+
|
10
|
+
# Initialize with an instance of {Config}
|
11
|
+
# @api developer
|
12
|
+
# @param config [Config] the object which will be configured by this Cogfile
|
13
|
+
# @param path [String] path to the cogfile
|
14
|
+
# @option opt [Boolean] :project (false) is this the project cogfile?
|
15
|
+
# @option opt [Boolean] :plugin_path_only (false) only process +plugin_path+ calls in the given cogfile
|
16
|
+
# @option opt [Plugin] :plugin (nil) indicate that the cogfile is for the given plugin
|
17
|
+
def initialize(config, path, opt={})
|
18
|
+
@cogfile_context = {
|
19
|
+
:config => config,
|
20
|
+
:cogfile_path => path,
|
21
|
+
:cogfile_dir => File.dirname(path),
|
22
|
+
:project => opt[:project],
|
23
|
+
:plugin_path_only => opt[:plugin_path_only],
|
24
|
+
:plugin => opt[:plugin],
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
# Interpret the +Cogfile+ at {Config::ProjectConfig#cogfile_path}
|
29
|
+
# @api developer
|
30
|
+
# @return [nil]
|
31
|
+
def interpret
|
32
|
+
eval File.read(cogfile_path), binding
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
# Define the directory in which to generate code
|
37
|
+
# @param path [String] a file system path to a directory
|
38
|
+
# @param absolute [Boolean] if +false+, the path is relative to {Config::ProjectConfig#project_root}
|
39
|
+
# @return [nil]
|
40
|
+
def project_path(path, absolute=false)
|
41
|
+
return if @cogfile_context[:plugin_path_only]
|
42
|
+
path = File.join @cogfile_context[:cogfile_dir], path unless absolute
|
43
|
+
config_eval { @project_path = path }
|
44
|
+
end
|
45
|
+
|
46
|
+
# Define a directory in which to find generators
|
47
|
+
# @param path [String] a file system path
|
48
|
+
# @param absolute [Boolean] if +false+, the path is relative to {Config::ProjectConfig#project_root}
|
49
|
+
# @return [nil]
|
50
|
+
def generator_path(path, absolute=false)
|
51
|
+
return if @cogfile_context[:plugin_path_only]
|
52
|
+
add_config_path :generator, path, absolute
|
53
|
+
end
|
54
|
+
|
55
|
+
# Define a directory in which to find templates
|
56
|
+
# @param path [String] a file system path
|
57
|
+
# @param absolute [Boolean] if +false+, the path is relative to {Config::ProjectConfig#project_root}
|
58
|
+
# @return [nil]
|
59
|
+
def template_path(path, absolute=false)
|
60
|
+
return if @cogfile_context[:plugin_path_only]
|
61
|
+
add_config_path :template, path, absolute
|
62
|
+
end
|
63
|
+
|
64
|
+
# Define a directory in which to find plugins
|
65
|
+
# @param path [String] a file system path
|
66
|
+
# @param absolute [Boolean] if +false+, the path is relative to {Config::ProjectConfig#project_root}
|
67
|
+
# @return [nil]
|
68
|
+
def plugin_path(path, absolute=false)
|
69
|
+
path = add_config_path :plugin, path, absolute
|
70
|
+
if path && File.exists?(path)
|
71
|
+
raise Errors::PluginPathIsNotADirectory.new path unless File.directory?(path)
|
72
|
+
@cogfile_context[:config].register_plugins path
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Explicitly specify a mapping from file extensions to languages
|
77
|
+
# @param map [Hash] key-value pairs from this mapping will override the default language map supplied by +cog+
|
78
|
+
# @return [nil]
|
79
|
+
def language_extensions(map)
|
80
|
+
return if @cogfile_context[:plugin_path_only]
|
81
|
+
config_eval do
|
82
|
+
map.each_pair do |key, value|
|
83
|
+
@language_extension_map[key.to_s.downcase] = value.to_s.downcase
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Define and register a language with cog
|
89
|
+
# @param key [String] unique case-insensitive identifier
|
90
|
+
# @yieldparam lang [LanguageDSL] an interface for defining the language
|
91
|
+
# @return [Object] the return value of the block
|
92
|
+
def language(key, &block)
|
93
|
+
return if @cogfile_context[:plugin_path_only]
|
94
|
+
dsl = LanguageDSL.new key
|
95
|
+
r = block.call dsl
|
96
|
+
lang = dsl.finalize
|
97
|
+
config_eval do
|
98
|
+
@language[lang.key] = lang
|
99
|
+
end
|
100
|
+
r
|
101
|
+
end
|
102
|
+
|
103
|
+
# Register an autoload variable in the class {GeneratorSandbox}. That way when generators are run as instances of a sandbox, they will be able to load plugins just by referencing them using the provided +identifier_name+.
|
104
|
+
# @param identifier_name [String] identifier by which the plugin can be referenced in generators
|
105
|
+
# @param path [String] path to the ruby file to load when the identifier is referenced (relative to the cogfile)
|
106
|
+
# @return [nil]
|
107
|
+
def autoload_plugin(identifier_name, path)
|
108
|
+
GeneratorSandbox.autoload_plugin(identifier_name, File.join(@cogfile_context[:plugin].path, path))
|
109
|
+
end
|
110
|
+
|
111
|
+
# Define a block to call when stamping a generator for a plugin. A call to this method should only be used in plugin cogfiles.
|
112
|
+
# @yieldparam name [String] name of the generator to stamp
|
113
|
+
# @yieldparam dest [String] file system path where the file will be created
|
114
|
+
# @yieldreturn [nil]
|
115
|
+
# @return [nil]
|
116
|
+
def stamp_generator(&block)
|
117
|
+
@cogfile_context[:plugin].stamp_generator_block = block
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
def cogfile_path
|
123
|
+
@cogfile_context[:cogfile_path]
|
124
|
+
end
|
125
|
+
|
126
|
+
# @return [nil]
|
127
|
+
def config_eval(&block)
|
128
|
+
@cogfile_context[:config].instance_eval &block
|
129
|
+
nil
|
130
|
+
end
|
131
|
+
|
132
|
+
# @return [String,nil] absolute path
|
133
|
+
def add_config_path(name, path, absolute)
|
134
|
+
return if path.nil?
|
135
|
+
path = File.join @cogfile_context[:cogfile_dir], path unless absolute
|
136
|
+
is_project = @cogfile_context[:project]
|
137
|
+
config_eval do
|
138
|
+
instance_variable_set("@project_#{name}_path", path) if is_project
|
139
|
+
instance_variable_get("@#{name}_path") << path
|
140
|
+
end
|
141
|
+
path
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|