cog 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/API.rdoc CHANGED
@@ -16,13 +16,15 @@ when you issue this command from a shell in the root directory of your project:
16
16
  and it will look something like this:
17
17
 
18
18
  # All paths are relative to the directory containing this file.
19
-
20
- # The directory in which to find ERB template files.
21
- template_dir 'templates'
22
-
23
- # The directory in which application code can be found. This is where
24
- # generated code will go. Probably along side non-generated code.
25
- code_dir 'src'
19
+
20
+ # The directory in which to place Ruby generators and +ERB+ templates.
21
+ cog_dir 'cog'
22
+
23
+ # The directory in which to place generated application code.
24
+ app_dir 'src'
25
+
26
+ # The default language in which to generate source code.
27
+ language 'c++'
26
28
 
27
29
  == Testing
28
30
 
@@ -5,3 +5,6 @@ cog_dir 'cog'
5
5
 
6
6
  # The directory in which to place generated application code.
7
7
  app_dir 'src'
8
+
9
+ # The default language in which to generate source code.
10
+ language 'c++'
data/bin/cog CHANGED
@@ -12,12 +12,13 @@ unless File.respond_to? :realpath
12
12
  end
13
13
  $: << File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib')
14
14
  require 'rubygems'
15
+ require 'active_support/core_ext'
15
16
  require 'cog'
16
17
  require 'cog_version'
17
18
  require 'gli'
18
19
  require 'fileutils'
19
20
 
20
- include GLI
21
+ include GLI::App
21
22
 
22
23
  program_desc 'This is a utility to help you write code generators.'
23
24
 
@@ -34,26 +35,24 @@ command :init do |c|
34
35
  end
35
36
  end
36
37
 
37
- desc 'Create a new mirror class'
38
- arg_name 'ClassName'
39
- command :mirror do |c|
40
- c.desc 'The target language (see languages command)'
41
- c.arg_name 'language'
42
- c.flag [:language, :l]
43
-
44
- c.desc 'Slash (/) separated prefix for generator, templates, and app code'
45
- c.arg_name 'path'
46
- c.flag [:package, :p]
47
-
48
- c.action do |g,o,a|
49
- tc = Cog::TemplateController.new
50
- a.each do |class_name|
51
- tc.stamp_generator 'mirror', class_name, o
52
- tc.stamp_module 'mirror-abstract', "abstract_#{class_name}", o
53
- tc.stamp_module 'mirror-impl', class_name, o
54
- end
55
- end
56
- end
38
+ # desc 'Create a new mirror class'
39
+ # arg_name 'ClassName'
40
+ # command :mirror do |c|
41
+ # c.desc 'The target language (see languages command)'
42
+ # c.arg_name 'language'
43
+ # c.flag [:language, :l]
44
+ #
45
+ # c.desc 'Slash (/) separated prefix for generator, templates, and app code'
46
+ # c.arg_name 'path'
47
+ # c.flag [:package, :p]
48
+ #
49
+ # c.action do |g,opt,a|
50
+ # a.each do |class_name|
51
+ # mirror_gen = Cog::Meta::MirrorGen.new class_name
52
+ # mirror_gen.stamp opt
53
+ # end
54
+ # end
55
+ # end
57
56
 
58
57
  desc 'List supported languages'
59
58
  command :languages do |c|
@@ -93,4 +92,4 @@ on_error do |exception|
93
92
  true
94
93
  end
95
94
 
96
- exit GLI.run(ARGV)
95
+ exit run(ARGV)
data/lib/cog.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'cog/config'
2
- require 'cog/template_controller'
2
+ require 'cog/meta'
3
3
  require 'cog/mixins'
4
4
 
5
5
  module Cog
@@ -0,0 +1,65 @@
1
+ module Cog
2
+
3
+ # In your project's +Cogfile+, +self+ has been set to an instance of this class.
4
+ #
5
+ # ==== Example +Cogfile+
6
+ # cog_dir 'cog'
7
+ # app_dir 'src'
8
+ # language 'c++'
9
+ #
10
+ # Typing `cog init` will create a +Cogfile+ in the present working directory.
11
+ #
12
+ # +Cogfile+ files are used to configure an instance of Config.
13
+ class Cogfile
14
+
15
+ def initialize(config) # :nodoc:
16
+ @config = config
17
+ end
18
+
19
+ # Interpret the Cogfile and initialize @config
20
+ def interpret # :nodoc:
21
+ eval File.read(@config.cogfile_path), binding
22
+ rescue Exception => e
23
+ raise CogfileError.new(e.to_s)
24
+ end
25
+
26
+ # Define the directory in which to place Ruby generators and +ERB+ templates.
27
+ # ==== Arguments
28
+ # * +path+ - A file system path
29
+ # * +absolute+ - If false, the path is relative to the directory containing the +Cogfile+
30
+ def cog_dir(path, absolute=false)
31
+ @config.instance_eval do
32
+ @cog_dir = absolute ? path : File.join(project_root, path)
33
+ @generator_dir = File.join @cog_dir, 'generators'
34
+ @template_dir = File.join @cog_dir, 'templates'
35
+ end
36
+ end
37
+
38
+ # Define the directory in which to place generated application source code.
39
+ # ==== Arguments
40
+ # * +path+ - A file system path
41
+ # * +absolute+ - If false, the path is relative to the directory containing the +Cogfile+
42
+ def app_dir(path, absolute=false)
43
+ @config.instance_eval do
44
+ @app_dir = absolute ? path : File.join(project_root, path)
45
+ end
46
+ end
47
+
48
+ # Define the default language in which to generated application source code.
49
+ # ==== Arguments
50
+ # * +lang+ - A code for the language. Acceptable values are <tt>c++</tt>.
51
+ def language(lang)
52
+ @config.instance_eval do
53
+ @language = lang
54
+ end
55
+ end
56
+ end
57
+
58
+ # For wrapping errors which occur during the processing of a +Cogfile+.
59
+ class CogfileError < StandardError
60
+ def message
61
+ "in Cogfile, " + super
62
+ end
63
+ end
64
+
65
+ end
@@ -1,25 +1,50 @@
1
1
  require 'rubygems'
2
2
  require 'singleton'
3
+ require 'cog/cogfile'
3
4
 
4
5
  module Cog
5
6
 
6
- # When the +Cogfile+ is processed, +self+ will be the singleton instance of
7
- # this object.
7
+ # This interface is intended for use within generators. Instances of this type
8
+ # are initialized via Cogfile files.
8
9
  class Config
10
+
11
+ # Directory to which application source code is generated.
12
+ attr_reader :app_dir
13
+
14
+ # Path to the +Cogfile+.
15
+ attr_reader :cogfile_path
16
+
17
+ # Directory in which to find Ruby source files. These are files which
18
+ # control exactly how the code is going to be generated.
19
+ attr_reader :generator_dir
20
+
21
+ # Default language in which to generated application source code.
22
+ attr_reader :language
9
23
 
10
- # The directory in which the +Cogfile+ is found.
24
+ # Directory in which the +Cogfile+ is found.
11
25
  attr_reader :project_root
12
26
 
13
- # The path to the +Cogfile+.
14
- attr_reader :cogfile_path
27
+ # Directory in which to find ERB template files.
28
+ attr_reader :template_dir
15
29
 
16
- # Loads the default +Cogfile+ for the current project.
17
- #
30
+ # Initialize from a +Cogfile+ at the given path.
31
+ # ==== Arguments
32
+ # * +path+ - A file system path to a +Cogfile+. The file must exists.
33
+ def initialize(path)
34
+ @cogfile_path = File.expand_path path
35
+ @project_root = File.dirname @cogfile_path
36
+ cogfile = Cogfile.new self
37
+ cogfile.interpret
38
+ end
39
+
40
+ # The default configuration for the project.
41
+ #
42
+ # Initialized using the +Cogfile+ for the current project.
18
43
  # The +Cogfile+ will be looked for in the present working directory. If none
19
44
  # is found there the parent directory will be checked, and then the
20
45
  # grandparent, and so on.
21
46
  #
22
- # === Returns
47
+ # ==== Returns
23
48
  # An instance of Cogfile which has been configured with a +Cogfile+. If no
24
49
  # such file was found then +nil+.
25
50
  def self.for_project
@@ -35,78 +60,18 @@ module Cog
35
60
  end
36
61
  end
37
62
 
38
- # Initialize from a +Cogfile+ at the given path.
39
- def initialize(path)
40
- @cogfile_path = File.expand_path path
41
- @project_root = File.dirname @cogfile_path
42
- begin
43
- eval File.read(path), binding
44
- rescue Exception => e
45
- raise CogfileError.new(e.to_s)
46
- end
47
- end
48
-
49
- # The directory in which to place Ruby generators and +ERB+ templates.
50
- #
51
- # Can be used as a getter, or a setter within the +Cogfile+. As a setter,
52
- # +val+ is relative to project_root unless the option <tt>:absolute</tt>
53
- # is truthy.
54
- def cog_dir(val=nil, opt={})
55
- get_or_set :cog_dir, val, opt
56
- end
57
-
58
- # The directory in which to place generated application code.
59
- #
60
- # Can be used as a getter, or a setter within the +Cogfile+. As a setter,
61
- # +val+ is relative to project_root unless the option <tt>:absolute</tt>
62
- # is truthy.
63
- def app_dir(val=nil, opt={})
64
- get_or_set :app_dir, val, opt
65
- end
66
-
67
- # The path to the routes file which maps defines how generators map to
68
- # generated application code.
69
- def routes_path
70
- File.join cog_dir, 'routes.rb'
71
- end
72
-
73
- # The directory in which to find Ruby source files. These are files which
74
- # control exactly how the code is going to be generated.
75
- def generator_dir(val=nil, opt={})
76
- File.join cog_dir, 'generators'
77
- end
78
-
79
- # The directory in which to find ERB template files.
80
- def template_dir(val=nil, opt={})
81
- File.join cog_dir, 'templates'
82
- end
83
-
84
- # Location of the installed gem
85
- def self.gem_dir
63
+ # Location of the installed cog gem
64
+ def self.gem_dir # :nodoc:
86
65
  spec = Gem.loaded_specs['cog']
87
66
  if spec.nil?
88
- File.expand_path File.join(File.dirname($0), '..')
67
+ # The current __FILE__ is:
68
+ # ${COG_GEM_ROOT}/lib/cog/config.rb
69
+ File.expand_path File.join(File.dirname(__FILE__), '..', '..')
89
70
  else
90
71
  spec.gem_dir
91
72
  end
92
73
  end
93
-
94
- private
95
- def get_or_set(name, val, opt={}, &block)
96
- if val.nil?
97
- instance_variable_get "@#{name}"
98
- else
99
- val = File.join project_root, val unless opt[:absolute]
100
- instance_variable_set "@#{name}", val
101
- end
102
- end
103
- end
104
-
105
- # For wrapping errors which occur during the processing of a +Cogfile+.
106
- class CogfileError < StandardError
107
- def message
108
- "in Cogfile, " + super
109
- end
110
- end
111
74
 
75
+ end
76
+
112
77
  end
@@ -0,0 +1,9 @@
1
+ require 'cog/meta/mirror_gen'
2
+
3
+ module Cog
4
+
5
+ # Used by cog internals.
6
+ module Meta
7
+ end
8
+
9
+ end
@@ -0,0 +1,85 @@
1
+ require 'cog/mixins/uses_templates'
2
+ require 'cog/config'
3
+
4
+ module Cog
5
+ module Meta
6
+
7
+ # An abstract generator generator.
8
+ #
9
+ # Subclasses define generators which make other generators.
10
+ class GenGen
11
+
12
+ include Mixins::UsesTemplates
13
+
14
+ # Create a ruby generator from a template.
15
+ #
16
+ # === Parameters
17
+ # * +ruby_template+ - name of the ruby template. This is a template
18
+ # which is distributed in the cog gem. It is relative to
19
+ # <tt>templates/</tt>
20
+ # * +generator_name+ - name of the generator
21
+ #
22
+ # === Options
23
+ # * <tt>:language</tt> - only <tt>'c++'</tt> is accepted at this time
24
+ # * <tt>:package</tt> - slash (/) separated path which will prefix
25
+ # +generator_name+
26
+ # * <tt>:binding</tt> - specify an alternate binding to use when resolving
27
+ # the +ERB+ template. If none is provided +self.binding+ will be used.
28
+ def stamp_generator(ruby_template, generator_name, opt={})
29
+ template = File.join Config.gem_dir, 'templates', "#{ruby_template}.rb"
30
+ target = "#{generator_name}.rb"
31
+ target = File.join opt[:package], target if opt[:package]
32
+ target = File.join 'generators', target
33
+ stamp template,
34
+ :target => target,
35
+ :target_type => :cog,
36
+ :use_absolute_path => true,
37
+ :binding => opt[:binding]
38
+ end
39
+
40
+ # Create an app module template from a template.
41
+ #
42
+ # === Parameters
43
+ # * +source_template+ - name of the source template. This is a template
44
+ # which is distributed in the cog gem. It is relative to
45
+ # <tt>templates/{language}/</tt>, where language is specified by the
46
+ # <tt>:language</tt> option. Do not include any file extension such as
47
+ # <tt>.h</tt> (the <tt>:language</tt> will also determine this)
48
+ # * +module_name+ - name of the module. For languages like <tt>:c++</tt>,
49
+ # two templates will be generated (i.e. one <tt>.h</tt> and one
50
+ # <tt>.cpp</tt>)
51
+ #
52
+ # === Options
53
+ # * <tt>:language</tt> - only <tt>'c++'</tt> is accepted at this time
54
+ # * <tt>:package</tt> - slash (/) separated path which will prefix
55
+ # +module_name+
56
+ # * <tt>:binding</tt> - specify an alternate binding to use when resolving
57
+ # the +ERB+ template. If none is provided +self.binding+ will be used.
58
+ def stamp_module(source_template, module_name, opt={})
59
+ lang = opt[:language] || 'c++'
60
+ extensions_for_language(lang).each do |ext|
61
+ template = File.join Config.gem_dir, 'templates', lang, "#{source_template}.#{ext}"
62
+ target = "#{module_name}.#{ext}"
63
+ target = File.join opt[:package], target if opt[:package]
64
+ target = File.join 'templates', target
65
+ stamp template,
66
+ :target => target,
67
+ :target_type => :cog,
68
+ :use_absolute_path => true,
69
+ :binding => opt[:binding]
70
+ end
71
+ end
72
+
73
+ private
74
+ def extensions_for_language(lang)
75
+ case lang.to_s
76
+ when /(cpp|c\+\+)/i
77
+ [:h, :cpp]
78
+ else
79
+ []
80
+ end
81
+ end
82
+ end
83
+
84
+ end
85
+ end
@@ -0,0 +1,39 @@
1
+ require 'cog/meta/gen_gen'
2
+
3
+ module Cog
4
+ module Meta
5
+
6
+ # Generates a Cog::Mixins::Mirror and associated templates.
7
+ class MirrorGen
8
+
9
+ # Create a mirror generator
10
+ #
11
+ # === Parameters
12
+ # * +name+ - the name of the mirror. Will be forced to singular form.
13
+ def initialize(name, opt={})
14
+ @name = name.singularize
15
+ @gg = GenGen.new
16
+ end
17
+
18
+ def filename
19
+ @name.underscore
20
+ end
21
+
22
+ def classname
23
+ @name.camelize
24
+ end
25
+
26
+ def abstract_classname
27
+ "Cog#{@name.camelize}"
28
+ end
29
+
30
+ def stamp(opt={})
31
+ opt[:binding] = binding
32
+ @gg.stamp_generator 'mirror', filename, opt
33
+ @gg.stamp_module 'mirror-abstract', "abstract_#{filename}", opt
34
+ @gg.stamp_module 'mirror-impl', filename, opt
35
+ end
36
+ end
37
+
38
+ end
39
+ end
@@ -7,6 +7,18 @@ module Cog
7
7
  # Mixin for classes that can use templates to generate code
8
8
  module UsesTemplates
9
9
 
10
+ # File extension for a snippet of the given source code language.
11
+ # ==== Example
12
+ # snippet_extension 'c++' # => 'h'
13
+ def snippet_extension(lang = 'text')
14
+ case lang
15
+ when /(c\+\+|c|objc)/i
16
+ 'h'
17
+ else
18
+ 'txt'
19
+ end
20
+ end
21
+
10
22
  # Get the template with the given name.
11
23
  #
12
24
  # === Parameters
@@ -21,11 +33,16 @@ module Cog
21
33
  # An instance of ERB.
22
34
  def get_template(path, opt={})
23
35
  path += '.erb'
24
- path = File.join Config.for_project.template_dir, path unless opt[:absolute]
25
- raise MissingTemplate.new path unless File.exists? path
26
- ERB.new File.read(path)
36
+ prefix = if opt[:cog_template]
37
+ File.join Config.gem_dir, 'templates'
38
+ elsif !opt[:absolute]
39
+ Config.for_project.template_dir
40
+ end
41
+ path = File.join prefix, path unless prefix.nil?
42
+ raise Errors::MissingTemplate.new path unless File.exists? path
43
+ ERB.new File.read(path), 0, '>'
27
44
  end
28
-
45
+
29
46
  # Stamp this object using the template at the given path.
30
47
  #
31
48
  # === Parameters
@@ -78,7 +95,39 @@ module Cog
78
95
  nil
79
96
  end
80
97
  end
81
-
98
+
99
+ # A warning that indicates a file is maintained by a generator
100
+ def generated_warning
101
+ lang = Config.for_project.language
102
+ t = get_template "snippets/#{lang}/generated_warning.#{snippet_extension lang}", :cog_template => true
103
+ t.result(binding)
104
+ end
105
+
106
+ def include_guard_begin(name)
107
+ full = "COG_INCLUDE_GUARD_#{name.upcase}"
108
+ "#ifndef #{full}\n#define #{full}"
109
+ end
110
+
111
+ def include_guard_end
112
+ "#endif // COG_INCLUDE_GUARD_[...]"
113
+ end
114
+
115
+ def namespace_begin(name)
116
+ return if name.nil?
117
+ case Config.for_project.language
118
+ when /c\+\+/
119
+ "namespace #{name} {"
120
+ end
121
+ end
122
+
123
+ def namespace_end(name)
124
+ return if name.nil?
125
+ case Config.for_project.language
126
+ when /c\+\+/
127
+ "} // namespace #{name}"
128
+ end
129
+ end
130
+
82
131
  private
83
132
  def same?(original, scratch) # :nodoc:
84
133
  if File.exists? original
@@ -10,8 +10,9 @@ module Cog
10
10
  def matches?(runner)
11
11
  @runner = runner
12
12
  @runner.exec do |i,o,e|
13
- @first_line = o.readlines.first
14
- /help.*code gen/ =~ @first_line
13
+ @first_line = o.readline
14
+ @second_line = o.readline
15
+ /help.*code gen/ =~ @second_line
15
16
  end
16
17
  end
17
18
  def failure_message
@@ -1,3 +1,3 @@
1
1
  module Cog
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'
3
3
  end
@@ -0,0 +1,6 @@
1
+ <%= @gg.generated_warning %>
2
+
3
+ class <%= abstract_classname %>
4
+ {
5
+
6
+ };
@@ -0,0 +1 @@
1
+ class
@@ -0,0 +1,10 @@
1
+ class <%= classname %>
2
+ include Cog::Mixins::Mirror
3
+
4
+ # Attributes
5
+ string :name, :access => :r # Read-only string attribute
6
+ int :age # Read-write integer attribute
7
+
8
+ # Methods
9
+ meth :speak
10
+ end
@@ -0,0 +1,9 @@
1
+ /* --------------------------------------------------------------------------
2
+ WARNING
3
+
4
+ This is a generated file. DO NOT EDIT THIS FILE! Your changes will be lost
5
+ the next time this file is regenerated.
6
+
7
+ This file was generating using cog
8
+ https://github.com/ktonon/cog
9
+ -------------------------------------------------------------------------- */
@@ -0,0 +1,7 @@
1
+ WARNING
2
+
3
+ This is a generated file. DO NOT EDIT THIS FILE! Your changes will be lost
4
+ the next time this file is regenerated.
5
+
6
+ This file was generating using cog
7
+ https://github.com/ktonon/cog
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: 15
4
+ hash: 13
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 8
10
- version: 0.0.8
9
+ - 9
10
+ version: 0.0.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kevin Tonon
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-05-15 00:00:00 Z
18
+ date: 2012-10-27 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rake
@@ -61,14 +61,19 @@ files:
61
61
  - templates/c++/mirror-impl.cpp.erb
62
62
  - templates/c++/mirror-impl.h.erb
63
63
  - templates/mirror.rb.erb
64
+ - templates/snippets/c++/generated_warning.h.erb
65
+ - templates/snippets/generated_warning.txt
66
+ - lib/cog/cogfile.rb
64
67
  - lib/cog/config.rb
68
+ - lib/cog/meta/gen_gen.rb
69
+ - lib/cog/meta/mirror_gen.rb
70
+ - lib/cog/meta.rb
65
71
  - lib/cog/mixins/mirror.rb
66
72
  - lib/cog/mixins/uses_templates.rb
67
73
  - lib/cog/mixins.rb
68
74
  - lib/cog/spec_helpers/matchers.rb
69
75
  - lib/cog/spec_helpers/runner.rb
70
76
  - lib/cog/spec_helpers.rb
71
- - lib/cog/template_controller.rb
72
77
  - lib/cog.rb
73
78
  - lib/cog_version.rb
74
79
  - API.rdoc
@@ -106,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
111
  requirements: []
107
112
 
108
113
  rubyforge_project:
109
- rubygems_version: 1.8.15
114
+ rubygems_version: 1.8.24
110
115
  signing_key:
111
116
  specification_version: 3
112
117
  summary: This is a utility to help you write code generators.
@@ -1,74 +0,0 @@
1
- require 'cog/mixins/uses_templates'
2
- require 'cog/config'
3
-
4
- module Cog
5
-
6
- class TemplateController
7
-
8
- include Mixins::UsesTemplates
9
-
10
- # Create a ruby generator from a template.
11
- #
12
- # === Parameters
13
- # * +ruby_template+ - name of the ruby template. This is a template
14
- # which is distributed in the cog gem. It is relative to
15
- # <tt>templates/</tt>
16
- # * +generator_name+ - name of the generator
17
- #
18
- # === Options
19
- # * <tt>:language</tt> - only <tt>'c++'</tt> is accepted at this time
20
- # * <tt>:package</tt> - slash (/) separated path which will prefix
21
- # +generator_name+
22
- def stamp_generator(ruby_template, generator_name, opt={})
23
- template = File.join Config.gem_dir, 'templates', "#{ruby_template}.rb"
24
- target = "#{generator_name}.rb"
25
- target = File.join opt[:package], target if opt[:package]
26
- target = File.join 'generators', target
27
- stamp template,
28
- :target => target,
29
- :target_type => :cog,
30
- :use_absolute_path => true
31
- end
32
-
33
- # Create an app module template from a template.
34
- #
35
- # === Parameters
36
- # * +source_template+ - name of the source template. This is a template
37
- # which is distributed in the cog gem. It is relative to
38
- # <tt>templates/{language}/</tt>, where language is specified by the
39
- # <tt>:language</tt> option. Do not include any file extension such as
40
- # <tt>.h</tt> (the <tt>:language</tt> will also determine this)
41
- # * +module_name+ - name of the module. For languages like <tt>:c++</tt>,
42
- # two templates will be generated (i.e. one <tt>.h</tt> and one
43
- # <tt>.cpp</tt>)
44
- #
45
- # === Options
46
- # * <tt>:language</tt> - only <tt>'c++'</tt> is accepted at this time
47
- # * <tt>:package</tt> - slash (/) separated path which will prefix
48
- # +module_name+
49
- def stamp_module(source_template, module_name, opt={})
50
- lang = opt[:language] || 'c++'
51
- extensions_for_language(lang).each do |ext|
52
- template = File.join Config.gem_dir, 'templates', lang, "#{source_template}.#{ext}"
53
- target = "#{module_name}.#{ext}"
54
- target = File.join opt[:package], target if opt[:package]
55
- target = File.join 'templates', target
56
- stamp template,
57
- :target => target,
58
- :target_type => :cog,
59
- :use_absolute_path => true
60
- end
61
- end
62
-
63
- private
64
- def extensions_for_language(lang)
65
- case lang.to_s
66
- when /(cpp|c\+\+)/i
67
- [:h, :cpp]
68
- else
69
- []
70
- end
71
- end
72
- end
73
-
74
- end