smartgen 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/ChangeLog.md +14 -0
  2. data/Gemfile.lock +2 -2
  3. data/README.md +7 -0
  4. data/lib/smartgen/configuration.rb +1 -49
  5. data/lib/smartgen/engines.rb +1 -0
  6. data/lib/smartgen/engines/base.rb +3 -3
  7. data/lib/smartgen/engines/erb.rb +15 -0
  8. data/lib/smartgen/engines/markdown.rb +1 -1
  9. data/lib/smartgen/engines/textile.rb +1 -1
  10. data/lib/smartgen/generator.rb +29 -17
  11. data/lib/smartgen/markup_file.rb +6 -2
  12. data/lib/smartgen/object_hash.rb +15 -5
  13. data/lib/smartgen/rake_task.rb +21 -5
  14. data/lib/smartgen/renderers/erb.rb +1 -4
  15. data/lib/smartgen/resource.rb +1 -9
  16. data/lib/smartgen/version.rb +1 -1
  17. data/spec/fixtures/expectations/common/another_index.html +13 -0
  18. data/spec/fixtures/expectations/common/index.html +8 -0
  19. data/spec/fixtures/expectations/common/other_index.html +13 -0
  20. data/spec/fixtures/expectations/erb/index.html +15 -0
  21. data/spec/fixtures/expectations/erb/with_layout/index.html +19 -0
  22. data/spec/fixtures/expectations/indexer/index_with_indexer.html +16 -0
  23. data/spec/fixtures/expectations/indexer/index_with_indexer_and_numbered_index.html +16 -0
  24. data/spec/fixtures/expectations/with_layout/index.html +12 -0
  25. data/spec/fixtures/expectations/with_layout/index_with_metadata.html +43 -0
  26. data/spec/fixtures/expectations/with_layout/index_with_specific_metadata.html +44 -0
  27. data/spec/fixtures/src/assets/images/image.gif +0 -0
  28. data/spec/fixtures/src/assets/javascripts/somelib.js +2 -0
  29. data/spec/fixtures/src/assets/stylesheets/style.css +2 -0
  30. data/spec/fixtures/src/common/another_index.md +12 -0
  31. data/spec/fixtures/src/common/index.textile +10 -0
  32. data/spec/fixtures/src/common/other_index.markdown +12 -0
  33. data/spec/fixtures/src/common/somefile +10 -0
  34. data/spec/fixtures/src/erb/index.html.erb +7 -0
  35. data/spec/fixtures/src/erb/with_layout/index.html.erb +7 -0
  36. data/spec/fixtures/src/erb/with_layout/layout.html.erb +5 -0
  37. data/spec/fixtures/src/indexer/index_with_indexer.textile +26 -0
  38. data/spec/fixtures/src/indexer/index_with_indexer_and_numbered_index.textile +26 -0
  39. data/spec/fixtures/src/layout.html.erb +5 -0
  40. data/spec/fixtures/src/layout_with_metadata.html.erb +22 -0
  41. data/spec/fixtures/src/layout_with_specific_metadata.html.erb +23 -0
  42. data/spec/fixtures/src/metadata.yml +43 -0
  43. data/spec/fixtures/src/with_layout/index.textile +10 -0
  44. data/spec/fixtures/src/with_layout/index_with_specific_metadata.textile +10 -0
  45. data/spec/lib/smartgen/configuration_spec.rb +5 -0
  46. data/spec/lib/smartgen/engines/base_spec.rb +73 -0
  47. data/spec/lib/smartgen/engines/erb_spec.rb +37 -0
  48. data/spec/lib/smartgen/engines/markdown_spec.rb +23 -0
  49. data/spec/lib/smartgen/engines/textile_spec.rb +19 -0
  50. data/spec/lib/smartgen/generator_spec.rb +272 -0
  51. data/spec/lib/smartgen/indexer_spec.rb +122 -0
  52. data/spec/lib/smartgen/markup_file_spec.rb +168 -0
  53. data/spec/lib/smartgen/object_hash_spec.rb +91 -0
  54. data/spec/lib/smartgen/renderers/erb_spec.rb +32 -0
  55. data/spec/lib/smartgen/resource_spec.rb +73 -0
  56. data/spec/lib/smartgen/watcher_spec.rb +71 -0
  57. data/spec/lib/smartgen_spec.rb +18 -0
  58. data/spec/sandbox/.gitkeep +0 -0
  59. data/spec/spec_helper.rb +37 -0
  60. metadata +99 -13
data/ChangeLog.md CHANGED
@@ -1,3 +1,17 @@
1
+ 0.5.0
2
+ -----
3
+
4
+ * Added ERB engine
5
+ * Added a sample Thorfile and fixed thor generator description so that it can be properly used.
6
+ * Configuration options are passed directly to generators to avoid duplicate options definitions
7
+ * Allowing one to pass a different resource name for rake task
8
+ * Metadata will be passed as an ObjectHash to renderers and engines
9
+
10
+ 0.4.0
11
+ -----
12
+
13
+ * Passing metadata to engines and their preprocessors.
14
+
1
15
  0.3.0
2
16
  -----
3
17
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smartgen (0.4.0)
4
+ smartgen (0.5.0)
5
5
  RedCloth (= 4.2.3)
6
6
  activesupport (>= 2.3.5)
7
7
  bluecloth (>= 2.0.9)
@@ -14,7 +14,7 @@ GEM
14
14
  remote: http://rubygems.org/
15
15
  specs:
16
16
  RedCloth (4.2.3)
17
- activesupport (3.0.4)
17
+ activesupport (2.3.5)
18
18
  archive-tar-minitar (0.5.2)
19
19
  bluecloth (2.0.10)
20
20
  columnize (0.3.2)
data/README.md CHANGED
@@ -161,6 +161,13 @@ Then you can call both `my_doc` and `watch_my_doc`:
161
161
  rake my_doc # generates files right away
162
162
  rake watch_my_doc # generates files and watch for changes
163
163
 
164
+ ## Related Gems
165
+
166
+ * [Smartgen SyntaxHighlighter](http://github.com/smartgen/smartgen_syntaxhighlighter) -- Adds support to use Alex Gorbatchev's Syntax Highlighter plugin with smartgen
167
+ * [Smartgen ERB](http://github.com/smartgen/smartgen_erb) -- A ERB preprocessor for smartgen engines
168
+
169
+ There are some
170
+
164
171
  ## Contributors
165
172
 
166
173
  * [Vicente Mundim](http://github.com/vicentemundim) _(author)_
@@ -1,7 +1,6 @@
1
1
  module Smartgen
2
-
3
2
  # Holds configurations for each smartgen resource.
4
- class Configuration
3
+ class Configuration < ObjectHash
5
4
 
6
5
  # An array with all the source files that should be generated.
7
6
  #
@@ -18,52 +17,5 @@ module Smartgen
18
17
  # default:
19
18
  # nil
20
19
  attr_accessor :output_folder
21
-
22
- # An optional layout file to be used when rendering each page.
23
- #
24
- # default:
25
- # nil
26
- attr_accessor :layout
27
-
28
- # An array of dirs to be copied to output folder.
29
- #
30
- # It will copy the contents of each directory to the output folder,
31
- # preserving the directory itself. So, if output folder is '/public/doc',
32
- # then 'doc/stylesheets' will be copied to 'public/docs/stylesheets'.
33
- #
34
- # default:
35
- # []
36
- attr_accessor :assets
37
-
38
- # A YAML metadata file used to specify metadata used in all pages, or even
39
- # specific page metadata.
40
- #
41
- # default:
42
- # nil
43
- attr_accessor :metadata_file
44
-
45
- # Whether indexer should be used or not.
46
- #
47
- # default:
48
- # false
49
- attr_accessor :use_indexer
50
-
51
- # Whether indexer should add numbered indexes on header tags.
52
- #
53
- # Only makes sense if #use_indexer is true
54
- #
55
- # default:
56
- # false
57
- attr_accessor :numbered_index
58
-
59
- def initialize
60
- @src_files = []
61
- @output_folder = nil
62
- @layout = nil
63
- @assets = []
64
- @metadata_file = nil
65
- @use_indexer = false
66
- @numbered_index = false
67
- end
68
20
  end
69
21
  end
@@ -1,3 +1,4 @@
1
1
  require File.expand_path('engines/base', File.dirname(__FILE__))
2
2
  require File.expand_path('engines/textile', File.dirname(__FILE__))
3
3
  require File.expand_path('engines/markdown', File.dirname(__FILE__))
4
+ require File.expand_path('engines/erb', File.dirname(__FILE__))
@@ -14,8 +14,8 @@ module Smartgen
14
14
  end
15
15
 
16
16
  # Process a file, calling each pre processor if any.
17
- def process(body, metadata={})
18
- parse(pre_process(body, metadata))
17
+ def process(body, metadata=Smartgen::ObjectHash.new)
18
+ parse(pre_process(body, metadata), metadata)
19
19
  end
20
20
 
21
21
  # Returns true if the given extension is supported by this engine.
@@ -39,7 +39,7 @@ module Smartgen
39
39
  end
40
40
  end
41
41
 
42
- def parse(body)
42
+ def parse(body, metadata)
43
43
  body
44
44
  end
45
45
 
@@ -0,0 +1,15 @@
1
+ module Smartgen
2
+ module Engine
3
+ # Processes erb files, supporting '.erb' extension.
4
+ class ERB < Base
5
+ protected
6
+ def parse(body, metadata)
7
+ ::ERB.new(body).result(binding)
8
+ end
9
+
10
+ def extensions
11
+ @extensions ||= ['.erb']
12
+ end
13
+ end
14
+ end
15
+ end
@@ -5,7 +5,7 @@ module Smartgen
5
5
  # Processes markdown files, supporting both '.md' and '.markdown' extensions.
6
6
  class Markdown < Base
7
7
  protected
8
- def parse(body)
8
+ def parse(body, metadata)
9
9
  BlueCloth.new(body).to_html
10
10
  end
11
11
 
@@ -5,7 +5,7 @@ module Smartgen
5
5
  # Processes textile files, supporting '.textile' extension.
6
6
  class Textile < Base
7
7
  protected
8
- def parse(body)
8
+ def parse(body, metadata)
9
9
  RedCloth.new(body).to_html
10
10
  end
11
11
 
@@ -5,26 +5,28 @@ module Smartgen
5
5
  class Generator < Thor::Group
6
6
  include Thor::Actions
7
7
 
8
- desc "An array with all the source files that should be generated. See Configuration#src_files"
9
- argument :src_files, :type => :array
8
+ desc "Process given markup files, generating HTML, optionally using a layout and copying assets."
10
9
 
11
- desc "The output folder, where all generated files will be located. See Configuration#output_folder"
12
- argument :output_folder, :type => :string
10
+ argument :src_files, :type => :array,
11
+ :desc => "An array with all the source files that should be generated."
13
12
 
14
- desc "An optional layout file to be used when rendering each page. See Configuration#layout"
15
- class_option :layout, :type => :string
13
+ argument :output_folder, :type => :string,
14
+ :desc => "The output folder, where all generated files will be located."
16
15
 
17
- desc "An array of dirs to be copied to output folder. See Configuration#assets"
18
- class_option :assets, :type => :array, :default => []
16
+ class_option :layout, :type => :string,
17
+ :desc => "An optional layout file to be used when rendering each page."
19
18
 
20
- desc "A YAML metadata file used to specify metadata used in all pages, or even specific page metadata. See Configuration#metadata_file"
21
- class_option :metadata_file, :type => :string
19
+ class_option :assets, :type => :array, :default => [],
20
+ :desc => "An array of dirs to be copied to output folder."
22
21
 
23
- desc "Whether indexer should be used or not. See Configuration#use_indexer"
24
- class_option :use_indexer, :type => :boolean, :default => false
22
+ class_option :metadata_file, :type => :string,
23
+ :desc => "A YAML metadata file used to specify metadata used in all pages, or even specific page metadata."
25
24
 
26
- desc "Whether indexer should add numbered indexes on header tags. See Configuration#numbered_index"
27
- class_option :numbered_index, :type => :boolean, :default => false
25
+ class_option :use_indexer, :type => :boolean, :default => false,
26
+ :desc => "Whether indexer should be used or not."
27
+
28
+ class_option :numbered_index, :type => :boolean, :default => false,
29
+ :desc => "Whether indexer should add numbered indexes on header tags."
28
30
 
29
31
  def create_output_folder
30
32
  destination_root = output_folder
@@ -85,9 +87,9 @@ module Smartgen
85
87
 
86
88
  def load_metadata
87
89
  if options["metadata_file"]
88
- YAML.load(File.read(options["metadata_file"]))
90
+ Smartgen::ObjectHash.new(YAML.load(File.read(options["metadata_file"])))
89
91
  else
90
- {}
92
+ Smartgen::ObjectHash.new
91
93
  end
92
94
  end
93
95
 
@@ -106,7 +108,7 @@ module Smartgen
106
108
  end
107
109
 
108
110
  def markup_files
109
- Dir[*src_files].select { |f| supported?(File.extname(f)) }.map do |markup_filename|
111
+ supported_src_files.map do |markup_filename|
110
112
  MarkupFile.new markup_filename, markup_file_options
111
113
  end
112
114
  end
@@ -119,10 +121,20 @@ module Smartgen
119
121
  end
120
122
  end
121
123
 
124
+ def supported_src_files
125
+ Dir[*src_files].select do |path|
126
+ supported?(File.extname(path)) && !layout?(path)
127
+ end
128
+ end
129
+
122
130
  def supported?(extension)
123
131
  MarkupFile.engines.one? { |engine| engine.supported?(extension) }
124
132
  end
125
133
 
134
+ def layout?(file)
135
+ File.expand_path(options[:layout]) == File.expand_path(file) if has_layout?
136
+ end
137
+
126
138
  def output_folder_path(path)
127
139
  File.join(output_folder, path)
128
140
  end
@@ -40,7 +40,7 @@ module Smartgen
40
40
  def initialize(path, options={})
41
41
  @path = path
42
42
  @extension = File.extname(path)
43
- @filename = File.basename(path, @extension)
43
+ @filename = filename_for(path)
44
44
  @engine = engine_for(@extension) || self.class.engines.first
45
45
 
46
46
  @contents = engine.process(raw_contents, options[:metadata])
@@ -64,7 +64,7 @@ module Smartgen
64
64
  # first ones are the ones with higher priority.
65
65
  def engines
66
66
  if @engines.blank?
67
- @engines = [Smartgen::Engine::Textile.new, Smartgen::Engine::Markdown.new]
67
+ @engines = [Smartgen::Engine::Textile.new, Smartgen::Engine::Markdown.new, Smartgen::Engine::ERB.new]
68
68
  end
69
69
 
70
70
  @engines
@@ -87,5 +87,9 @@ module Smartgen
87
87
 
88
88
  nil
89
89
  end
90
+
91
+ def filename_for(path)
92
+ File.basename(File.basename(path, @extension), '.html')
93
+ end
90
94
  end
91
95
  end
@@ -11,21 +11,31 @@ module Smartgen
11
11
  def dup
12
12
  Smartgen::ObjectHash.new(self)
13
13
  end
14
-
14
+
15
15
  def respond_to?(method)
16
- has_key?(method) or super
16
+ has_key?(method) || (setter?(method) && has_key?(method.to_s.chop)) || super
17
+ end
18
+
19
+ def inspect
20
+ "ObjectHash(#{super})"
17
21
  end
18
-
22
+
19
23
  protected
20
24
  def method_missing(name, *args)
21
25
  if has_key?(name)
22
26
  self[name]
27
+ elsif setter?(name)
28
+ self[name.to_s.chop] = args.first
23
29
  else
24
- puts "warning: key #{name} not found on #{inspect}"
30
+ $stderr.puts "warning: key #{name} not found on #{inspect}"
25
31
  Smartgen::ObjectHash.new
26
32
  end
27
33
  end
28
-
34
+
35
+ def setter?(method)
36
+ method.to_s.end_with?('=')
37
+ end
38
+
29
39
  def convert_value(value)
30
40
  case value
31
41
  when Hash
@@ -20,15 +20,31 @@ module Smartgen
20
20
  #
21
21
  # It yields a Configuration, in fact it calls Resource#configure, so you
22
22
  # can use any of the configurations here.
23
+ #
24
+ # You may also use an existing configuration, while still having a different
25
+ # task name:
26
+ # Smartgen[:my_config] do |config|
27
+ # config.layout = 'layout.html.erb'
28
+ # end
29
+ #
30
+ # Smartgen::RakeTask.new :watcher, :my_config do |config|
31
+ # config.src_files = ['doc/**/*']
32
+ # config.output_folder = 'public/doc'
33
+ # end
34
+ #
35
+ # This will use Smartgen[:generate_doc] config, but you will call it with:
36
+ #
37
+ # rake watcher
23
38
  class RakeTask < ::Rake::TaskLib
24
- def initialize(name=nil, &block)
25
- name = name || :smartgen
39
+ def initialize(resource_or_task_name=nil, resource_name=nil, &block)
40
+ task_name = resource_or_task_name || :smartgen
41
+ resource_name = resource_name || task_name
26
42
 
27
- Smartgen[name].configure(&block)
43
+ Smartgen[resource_name].configure(&block)
28
44
 
29
45
  desc("Generate smartgen files") unless ::Rake.application.last_comment
30
- task name do
31
- Smartgen[name].generate!
46
+ task task_name do
47
+ Smartgen[resource_name].generate!
32
48
  end
33
49
  end
34
50
  end
@@ -6,10 +6,7 @@ module Smartgen
6
6
  #
7
7
  # It exposes +markup_file+ variable and its +metadata+ to the ERB layout.
8
8
  def render(layout, markup_file, metadata={})
9
- metadata = Smartgen::ObjectHash.new(metadata)
10
-
11
- template = ::ERB.new(layout)
12
- template.result(binding)
9
+ ::ERB.new(layout).result(binding)
13
10
  end
14
11
  end
15
12
  end
@@ -31,19 +31,11 @@ module Smartgen
31
31
 
32
32
  private
33
33
  def generator
34
- Smartgen::Generator.new(arguments, options)
34
+ Smartgen::Generator.new(arguments, config)
35
35
  end
36
36
 
37
37
  def arguments
38
38
  [config.src_files, config.output_folder]
39
39
  end
40
-
41
- def options
42
- {
43
- :metadata_file => config.metadata_file,
44
- :layout => config.layout,
45
- :assets => config.assets
46
- }
47
- end
48
40
  end
49
41
  end
@@ -1,4 +1,4 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module Smartgen
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0"
4
4
  end
@@ -0,0 +1,13 @@
1
+ <h1>Here is some header</h1>
2
+
3
+ <p>And here is a paragraph</p>
4
+
5
+ <ul>
6
+ <li>some bullet lists with <strong>style</strong></li>
7
+ <li>some bullet lists with <em>style</em></li>
8
+ </ul>
9
+
10
+
11
+ <h2>Another header</h2>
12
+
13
+ <p>With some text</p>
@@ -0,0 +1,8 @@
1
+ <h1>Here is some header</h1>
2
+ <p>And here is a paragraph</p>
3
+ <ul>
4
+ <li>some bullet lists with <strong>style</strong></li>
5
+ <li>some bullet lists with <em>style</em></li>
6
+ </ul>
7
+ <h2>Another header</h2>
8
+ <p>With some text</p>
@@ -0,0 +1,13 @@
1
+ <h1>Here is some header</h1>
2
+
3
+ <p>And here is a paragraph</p>
4
+
5
+ <ul>
6
+ <li>some bullet lists with <strong>style</strong></li>
7
+ <li>some bullet lists with <em>style</em></li>
8
+ </ul>
9
+
10
+
11
+ <h2>Another header</h2>
12
+
13
+ <p>With some text</p>