cog 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/bin/cog +6 -6
  2. data/lib/cog.rb +7 -11
  3. data/lib/cog/built_in_tools/basic.rb +1 -1
  4. data/lib/cog/built_in_tools/basic/cog_tool.rb +5 -12
  5. data/lib/cog/config.rb +47 -200
  6. data/lib/cog/config/cogfile.rb +5 -7
  7. data/lib/cog/config/lang_info.rb +1 -1
  8. data/lib/cog/config/language_methods.rb +71 -0
  9. data/lib/cog/config/project_methods.rb +35 -0
  10. data/lib/cog/config/tool_methods.rb +94 -0
  11. data/lib/cog/controllers/generator_controller.rb +7 -8
  12. data/lib/cog/controllers/template_controller.rb +18 -21
  13. data/lib/cog/controllers/tool_controller.rb +19 -22
  14. data/lib/cog/embed_context.rb +131 -0
  15. data/lib/cog/embeds.rb +84 -58
  16. data/lib/cog/embeds/file_scanner.rb +28 -5
  17. data/lib/cog/errors.rb +3 -0
  18. data/lib/cog/generator.rb +65 -31
  19. data/lib/cog/generator/file_methods.rb +1 -1
  20. data/lib/cog/generator/filters.rb +1 -1
  21. data/lib/cog/generator/language_methods.rb +3 -3
  22. data/lib/cog/helpers/string.rb +3 -3
  23. data/lib/cog/languages.rb +2 -0
  24. data/lib/cog/languages/c_language.rb +3 -27
  25. data/lib/cog/languages/c_plus_plus_language.rb +3 -8
  26. data/lib/cog/languages/c_sharp_language.rb +3 -16
  27. data/lib/cog/languages/java_language.rb +3 -16
  28. data/lib/cog/languages/java_script_language.rb +3 -16
  29. data/lib/cog/languages/language.rb +12 -12
  30. data/lib/cog/languages/mixins.rb +10 -0
  31. data/lib/cog/languages/mixins/c_style_comments.rb +23 -0
  32. data/lib/cog/languages/mixins/hash_comments.rb +19 -0
  33. data/lib/cog/languages/python_language.rb +2 -33
  34. data/lib/cog/languages/qt_project_language.rb +3 -34
  35. data/lib/cog/languages/ruby_language.rb +6 -31
  36. data/lib/cog/spec_helpers/matchers/match_maker.rb +10 -6
  37. data/lib/cog/tool.rb +61 -0
  38. data/lib/cog/tool/dsl.rb +26 -0
  39. data/lib/cog/version.rb +1 -1
  40. data/templates/basic/generator.rb.erb +1 -7
  41. data/templates/cog/custom_tool/cog_tool.rb.erb +10 -8
  42. data/templates/cog/custom_tool/generator.rb.erb.erb +3 -3
  43. data/templates/cog/custom_tool/tool.rb.erb +1 -1
  44. metadata +13 -16
  45. data/lib/cog/config/tool.rb +0 -99
  46. data/lib/cog/embeds/context.rb +0 -86
  47. data/templates/basic/template.c.erb.erb +0 -1
  48. data/templates/basic/template.cpp.erb.erb +0 -6
  49. data/templates/basic/template.cs.erb.erb +0 -6
  50. data/templates/basic/template.h.erb.erb +0 -1
  51. data/templates/basic/template.hpp.erb.erb +0 -6
  52. data/templates/basic/template.java.erb.erb +0 -1
  53. data/templates/basic/template.js.erb.erb +0 -1
  54. data/templates/basic/template.py.erb.erb +0 -1
  55. data/templates/basic/template.rb.erb.erb +0 -6
  56. data/templates/basic/template.txt.erb.erb +0 -1
@@ -73,17 +73,13 @@ module Cog
73
73
  # @api developer
74
74
  # @return [String] positive interpretation of the {#message} block result
75
75
  def failure_message
76
- msg = instance_eval &@msg_block
77
- msg = msg.gsub /\[([^\|\]]*)(?:\|([^\]]*)\])?/, '\1'
78
- "expected #{@invocation} #{msg}\n#{trace}"
76
+ _failure_message '\1'
79
77
  end
80
78
 
81
79
  # @api developer
82
80
  # @return [String] negative interpretation of the {#message} block result
83
81
  def negative_failure_message
84
- msg = instance_eval &@msg_block
85
- msg = msg.gsub /\[([^\|\]]*)(?:\|([^\]]*)\])?/, '\2'
86
- "expected #{@invocation} #{msg}\n#{trace}"
82
+ _failure_message '\2'
87
83
  end
88
84
 
89
85
  # @api developer
@@ -91,6 +87,14 @@ module Cog
91
87
  def trace
92
88
  "STDOUT:\n#{@lines.join "\n"}\nSTDERR:\n#{@error.join "\n"}"
93
89
  end
90
+
91
+ private
92
+
93
+ def _failure_message(repl)
94
+ msg = instance_eval &@msg_block
95
+ msg = msg.gsub /\[([^\|\]]*)(?:\|([^\]]*)\])?/, '\2'
96
+ "expected #{@invocation} #{msg}\n#{trace}"
97
+ end
94
98
  end
95
99
 
96
100
  # Makes it easier to write RSpec matchers for testing +cog+ command invocations
@@ -0,0 +1,61 @@
1
+ require 'cog/tool/dsl'
2
+ require 'cog/errors'
3
+
4
+ module Cog
5
+
6
+ class Tool
7
+
8
+ # @return [String] name of the tool
9
+ attr_reader :name
10
+
11
+ # @return [String] explicit path to the tool
12
+ attr_reader :path
13
+
14
+ # @return [String] directory in which to find tool templates
15
+ attr_reader :templates_path
16
+
17
+ # @return [Boolean] the tool needs to be explicitly required
18
+ attr_reader :explicit_require
19
+
20
+ # @api developer
21
+ # @return [GeneratorStamper]
22
+ attr_reader :generator_stamper
23
+
24
+ # @param path [String] path to the <tt>cog_tool.rb</tt> file
25
+ # @option opt [Boolean] :built_in (false) if +true+, {#templates_path} will be +nil+ for this tool, as the templates should be included with +cog+
26
+ # @option opt [Boolean] :explicit_require (false) the tool needs to be explicitly required
27
+ def initialize(path, opt={})
28
+ unless File.basename(path) == 'cog_tool.rb' && File.exists?(path)
29
+ raise Errors::InvalidToolConfiguration.new(path)
30
+ end
31
+ dir = File.dirname(path)
32
+ @name = File.basename dir
33
+ @path = File.expand_path File.join(dir, '..', "#{@name}.rb")
34
+ @explicit_require = opt[:explicit_require]
35
+ unless opt[:built_in]
36
+ @templates_path = File.expand_path File.join(dir, '..', '..', 'cog', 'templates')
37
+ end
38
+ end
39
+
40
+ # Fully load the tool
41
+ def load
42
+ require @path
43
+ end
44
+
45
+ # Stamp the generator
46
+ # @param name [String] name of the generator to stamp
47
+ # @param dest [String] file system path where the file will be created
48
+ # @return [nil]
49
+ def stamp_generator(name, dest)
50
+ raise Errors::ToolMissingDefinition.new('stamp_generator') if @stamp_generator_block.nil?
51
+ @stamp_generator_block.call name.to_s, dest.to_s
52
+ nil
53
+ end
54
+
55
+ # Sort tools by name
56
+ def <=>(other)
57
+ @name <=> other.name
58
+ end
59
+ end
60
+
61
+ end
@@ -0,0 +1,26 @@
1
+ module Cog
2
+ class Tool
3
+
4
+ # Domain-specific language for defining cog tools
5
+ class DSL
6
+
7
+ # @api developer
8
+ # @param tool [Tool] the tool which is being defined
9
+ def initialize(tool)
10
+ @tool = tool
11
+ end
12
+
13
+ # Define a block to call when stamping a generator for this tool
14
+ # @yieldparam name [String] name of the generator to stamp
15
+ # @yieldparam dest [String] file system path where the file will be created
16
+ # @yieldreturn [nil]
17
+ # @return [nil]
18
+ def stamp_generator(&block)
19
+ @tool.instance_eval do
20
+ @stamp_generator_block = block
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -1,5 +1,5 @@
1
1
  module Cog
2
2
  unless const_defined? :VERSION
3
- VERSION = '0.2.1'
3
+ VERSION = '0.2.2'
4
4
  end
5
5
  end
@@ -1,10 +1,4 @@
1
1
  require 'cog'
2
2
  include Cog::Generator
3
3
 
4
- # Setup the template context
5
- @class = '<%= name.gsub ' ', '' %>'
6
-
7
- # Render the templates
8
- <% @language.module_extensions.each do |ext| %>
9
- stamp '<%= name %>.<%= ext %>', 'generated_<%= name %>.<%= ext %>'
10
- <% end %>
4
+ # This is the <%= @name %> generator
@@ -1,15 +1,17 @@
1
1
  require 'cog'
2
+ include Cog::Generator
2
3
 
3
4
  # Register <%= @tool_name %> as a tool with cog
4
- Cog::Config.instance.register_tool __FILE__ do |tool|
5
+ Cog.register_tool __FILE__ do |tool|
5
6
 
6
- # Define how new <%= @tool_name %> generators are created
7
- #
8
- # Add context as required by your generator template.
9
- #
10
- # When the block is executed, +self+ will be an instance of Cog::Config::Tool::GeneratorStamper
11
- tool.stamp_generator do
12
- stamp '<%= @tool_name %>/generator.rb', generator_dest, :absolute_destination => true
7
+ # Define a method which creates a <%= @tool_name %> generator
8
+ tool.stamp_generator do |name, dest|
9
+
10
+ # Setup context for the template
11
+ @name = name # Generator name
12
+
13
+ # Create the generator file
14
+ stamp '<%= @tool_name %>/generator.rb', dest, :absolute_destination => true
13
15
  end
14
16
 
15
17
  end
@@ -1,7 +1,7 @@
1
- <%% if tool.explicit_require %>
2
- require '<%%= tool.path %>'
1
+ <%% if Cog.active_tool.explicit_require %>
2
+ require '<%%= Cog.active_tool.path %>'
3
3
  <%% else %>
4
- require '<%%= tool.name %>'
4
+ require '<%%= Cog.active_tool.name %>'
5
5
  <%% end %>
6
6
 
7
7
  <%= @tool_module %>.widget '<%%= @name %>' do |w|
@@ -13,7 +13,7 @@ module <%= @tool_module %>
13
13
 
14
14
  # Activate <%= @tool_name %> while rendering templates
15
15
  # so that cog will be able to find <%= @tool_name %> templates
16
- Cog::Config.instance.activate_tool '<%= @tool_name %>' do
16
+ Cog.activate_tool '<%= @tool_name %>' do
17
17
  w.generate
18
18
  end
19
19
 
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: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
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-12-12 00:00:00 Z
18
+ date: 2012-12-15 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: gli
@@ -114,16 +114,6 @@ files:
114
114
  - Default.cogfile
115
115
  - LICENSE
116
116
  - templates/basic/generator.rb.erb
117
- - templates/basic/template.c.erb.erb
118
- - templates/basic/template.cpp.erb.erb
119
- - templates/basic/template.cs.erb.erb
120
- - templates/basic/template.h.erb.erb
121
- - templates/basic/template.hpp.erb.erb
122
- - templates/basic/template.java.erb.erb
123
- - templates/basic/template.js.erb.erb
124
- - templates/basic/template.py.erb.erb
125
- - templates/basic/template.rb.erb.erb
126
- - templates/basic/template.txt.erb.erb
127
117
  - templates/cog/custom_tool/cog_tool.rb.erb
128
118
  - templates/cog/custom_tool/Gemfile.erb
129
119
  - templates/cog/custom_tool/generator.rb.erb.erb
@@ -140,13 +130,15 @@ files:
140
130
  - lib/cog/built_in_tools.rb
141
131
  - lib/cog/config/cogfile.rb
142
132
  - lib/cog/config/lang_info.rb
143
- - lib/cog/config/tool.rb
133
+ - lib/cog/config/language_methods.rb
134
+ - lib/cog/config/project_methods.rb
135
+ - lib/cog/config/tool_methods.rb
144
136
  - lib/cog/config.rb
145
137
  - lib/cog/controllers/generator_controller.rb
146
138
  - lib/cog/controllers/template_controller.rb
147
139
  - lib/cog/controllers/tool_controller.rb
148
140
  - lib/cog/controllers.rb
149
- - lib/cog/embeds/context.rb
141
+ - lib/cog/embed_context.rb
150
142
  - lib/cog/embeds/file_scanner.rb
151
143
  - lib/cog/embeds.rb
152
144
  - lib/cog/errors.rb
@@ -164,6 +156,9 @@ files:
164
156
  - lib/cog/languages/java_language.rb
165
157
  - lib/cog/languages/java_script_language.rb
166
158
  - lib/cog/languages/language.rb
159
+ - lib/cog/languages/mixins/c_style_comments.rb
160
+ - lib/cog/languages/mixins/hash_comments.rb
161
+ - lib/cog/languages/mixins.rb
167
162
  - lib/cog/languages/python_language.rb
168
163
  - lib/cog/languages/qt_project_language.rb
169
164
  - lib/cog/languages/ruby_language.rb
@@ -172,6 +167,8 @@ files:
172
167
  - lib/cog/spec_helpers/matchers.rb
173
168
  - lib/cog/spec_helpers/runner.rb
174
169
  - lib/cog/spec_helpers.rb
170
+ - lib/cog/tool/dsl.rb
171
+ - lib/cog/tool.rb
175
172
  - lib/cog/version.rb
176
173
  - lib/cog.rb
177
174
  - yard-templates/default/fulldoc/html/css/common.css
@@ -1,99 +0,0 @@
1
- require 'cog/errors'
2
- require 'cog/generator'
3
-
4
- module Cog
5
- class Config
6
-
7
- class Tool
8
-
9
- # @return [String] name of the tool
10
- attr_reader :name
11
-
12
- # @return [String] explicit path to the tool
13
- attr_reader :path
14
-
15
- # @return [String] directory in which to find tool templates
16
- attr_reader :templates_path
17
-
18
- # @return [Boolean] the tool needs to be explicitly required
19
- attr_reader :explicit_require
20
-
21
- # @param path [String] path to the <tt>cog_tool.rb</tt> file
22
- # @option opt [Boolean] :built_in (false) if +true+, {#templates_path} will be +nil+ for this tool, as the templates should be included with +cog+
23
- # @option opt [Boolean] :explicit_require (false) the tool needs to be explicitly required
24
- def initialize(path, opt={})
25
- unless File.basename(path) == 'cog_tool.rb' && File.exists?(path)
26
- raise Errors::InvalidToolConfiguration.new(path)
27
- end
28
- dir = File.dirname(path)
29
- @name = File.basename dir
30
- @path = File.expand_path File.join(dir, '..', "#{@name}.rb")
31
- @explicit_require = opt[:explicit_require]
32
- unless opt[:built_in]
33
- @templates_path = File.expand_path File.join(dir, '..', '..', 'cog', 'templates')
34
- end
35
- end
36
-
37
- # Fully load the tool
38
- def load
39
- require @path
40
- end
41
-
42
- # Encapsulates the block which stamps the generator for this tool
43
- class GeneratorStamper
44
-
45
- include Generator
46
-
47
- # @return [Config] singleton instance
48
- attr_accessor :config
49
-
50
- # @return [String] path to the generator file which should be created
51
- attr_reader :generator_dest
52
-
53
- # @return [String] +underscore_version+ of the generator name
54
- attr_reader :name
55
-
56
- # @return [Tool] the tool for which this stamps generators
57
- attr_reader :tool
58
-
59
- # @return [String] +CamelizedVersion+ of the generator name
60
- def camelized
61
- @name.camelize
62
- end
63
-
64
- # @api developer
65
- # @param tool [Tool]
66
- # @param block [Block]
67
- def initialize(tool, block)
68
- @tool = tool
69
- @block = block
70
- end
71
-
72
- # Stamp the generator
73
- # @api developer
74
- def stamp_generator(name, generator_dest, config)
75
- @name = name.to_s.underscore
76
- @config = config
77
- @generator_dest = generator_dest
78
- instance_eval &@block
79
- end
80
- end
81
-
82
- # @api developer
83
- # @return [GeneratorStamper]
84
- attr_reader :generator_stamper
85
-
86
- # Define a block to call when stamping a generator for this tool
87
- #
88
- # @yield The block should do the work of stamping the generator file, and any custom templates. The block's +self+ object will be a {GeneratorStamper}
89
- def stamp_generator(&block)
90
- @generator_stamper = GeneratorStamper.new self, block
91
- end
92
-
93
- # Sort tools by name
94
- def <=>(other)
95
- @name <=> other.name
96
- end
97
- end
98
- end
99
- end
@@ -1,86 +0,0 @@
1
- require 'cog/config'
2
-
3
- module Cog
4
- module Embeds
5
-
6
- # Describes the environment of an embed statement including the file in which it was found, the line number, the language, an more.
7
- class Context
8
-
9
- # @return [Fixnum] line number at which the directive was found
10
- attr_accessor :lineno
11
-
12
- # @return [String] the value for the given key
13
- attr_reader :name
14
-
15
- # @param path [String] path to the file in which the cog directive was found
16
- def initialize(name, path)
17
- @name = name
18
- @options = {}
19
- @path = path
20
- end
21
-
22
- # @return [Array<String>] arguments passed to the directive
23
- def args
24
- @args
25
- end
26
-
27
- # @return [String] for block directives, the body of text which occurs between the curly braces.
28
- # @example
29
- # // cog: snippet(my-snip) {
30
- # body
31
- # // cog: }
32
- def body
33
- @body
34
- end
35
-
36
- # @return [String] the filename extension
37
- def extension
38
- @ext ||= File.extname(filename).slice(1..-1)
39
- end
40
-
41
- # @return [String] basename of the file in which the cog directive was found
42
- def filename
43
- @filename ||= File.basename @path
44
- end
45
-
46
- # @return [Languages::Language] the language of the file
47
- def language
48
- @lang ||= Config.instance.language_for_extension extension
49
- end
50
-
51
- # @return [Boolean] was the once switch used?
52
- def once?
53
- @once
54
- end
55
-
56
- # @api developer
57
- # @param value [String, nil] set the body to this value
58
- def body=(value)
59
- @body = value
60
- end
61
-
62
- # @api developer
63
- # @param value [Boolean] was the once switch used?
64
- def once=(value)
65
- @once = !!value
66
- end
67
-
68
- # @api developer
69
- # @param value [Array<String>] arguments used with the directive
70
- def args=(value)
71
- @args = value
72
- end
73
-
74
- # @api developer
75
- # @return [String]
76
- def to_directive
77
- x = "cog: #{name}"
78
- x += args.join ' ' if args
79
- x += " once" if once?
80
- x
81
- end
82
-
83
- end
84
-
85
- end
86
- end