smallcage 0.0.8 → 0.0.9

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.
Files changed (47) hide show
  1. data/History.txt +10 -0
  2. data/Manifest.txt +23 -7
  3. data/bin/smc +6 -126
  4. data/lib/smallcage.rb +4 -8
  5. data/lib/smallcage/application.rb +159 -0
  6. data/lib/smallcage/commands/auto.rb +133 -27
  7. data/lib/smallcage/commands/base.rb +19 -0
  8. data/lib/smallcage/commands/clean.rb +10 -2
  9. data/lib/smallcage/commands/export.rb +41 -0
  10. data/lib/smallcage/commands/import.rb +12 -7
  11. data/lib/smallcage/commands/manifest.rb +1 -1
  12. data/lib/smallcage/commands/server.rb +5 -14
  13. data/lib/smallcage/commands/update.rb +92 -11
  14. data/lib/smallcage/document_path.rb +46 -0
  15. data/lib/smallcage/http_server.rb +66 -0
  16. data/lib/smallcage/loader.rb +37 -26
  17. data/lib/smallcage/{commands → resources}/Manifest.erb +0 -0
  18. data/lib/smallcage/resources/auto.html +119 -0
  19. data/lib/smallcage/runner.rb +15 -0
  20. data/lib/smallcage/version.rb +1 -1
  21. data/project/{default → base}/_smc/helpers/base_helper.rb +0 -0
  22. data/project/{default → base}/_smc/helpers/site_helper.rb +0 -0
  23. data/project/{default → base}/_smc/templates/default.rhtml +0 -0
  24. data/project/{default → base}/_smc/templates/footer.rhtml +0 -0
  25. data/project/{default → base}/_smc/templates/header.rhtml +0 -0
  26. data/project/lang/_smc/helpers/lang_helper.rb +19 -0
  27. data/project/lang/_smc/templates/other_lang.rhtml +6 -0
  28. data/project/redcloth/_smc/helpers/red_cloth_helper.rb +14 -0
  29. data/project/redcloth/_smc/templates/markdown.rhtml +5 -0
  30. data/project/redcloth/_smc/templates/textile.rhtml +5 -0
  31. data/project/standard/_smc/helpers/menu_helper.rb +2 -2
  32. data/project/standard/about/index.html.smc +1 -1
  33. data/project/standard/index.html.smc +1 -1
  34. data/project/standard/sample1/index.html.smc +1 -1
  35. data/project/standard/sample1/index2.html.smc +1 -1
  36. data/project/standard/sample2/index.html.smc +1 -1
  37. data/spec/data/htdocs1/a/b/c/index.html.smc +6 -1
  38. data/{log/debug.log → spec/data/htdocs2/_smc/templates/dummy.rhtml} +0 -0
  39. data/spec/data/htdocs2/a/b/c/test.html +1 -0
  40. data/spec/data/htdocs2/a/b/test.html +1 -0
  41. data/spec/data/htdocs2/a/test.html.smc +2 -0
  42. data/spec/document_path_spec.rb +42 -0
  43. data/spec/export_spec.rb +45 -0
  44. data/spec/loader_spec.rb +20 -6
  45. data/spec/manifest_spec.rb +18 -11
  46. data/spec/smallcage_spec.rb +17 -11
  47. metadata +25 -9
@@ -1,3 +1,13 @@
1
+ == 0.0.9 2008-04-21
2
+
3
+ * fix smc auto command bug.
4
+ * add RedCloth project template (redcloth).
5
+ * add multi language project template (lang).
6
+
7
+ * add auto navigation servlet to the HTTP server.
8
+ * add export command.
9
+ * delete output file when smc source file does not exist.
10
+
1
11
  == 0.0.6 2007-11-04
2
12
 
3
13
  * smcオブジェクトのpathがStringだったのをPathnameを保持するように修正。ファイルアクセスで使う値なのでPathnameの方が良いと判断しました。
@@ -7,27 +7,37 @@ bin/smc
7
7
  config/hoe.rb
8
8
  config/requirements.rb
9
9
  lib/smallcage.rb
10
- lib/smallcage/commands/Manifest.erb
10
+ lib/smallcage/application.rb
11
11
  lib/smallcage/commands/auto.rb
12
+ lib/smallcage/commands/base.rb
12
13
  lib/smallcage/commands/clean.rb
14
+ lib/smallcage/commands/export.rb
13
15
  lib/smallcage/commands/import.rb
14
16
  lib/smallcage/commands/manifest.rb
15
17
  lib/smallcage/commands/server.rb
16
18
  lib/smallcage/commands/update.rb
19
+ lib/smallcage/document_path.rb
17
20
  lib/smallcage/erb_base.rb
21
+ lib/smallcage/http_server.rb
18
22
  lib/smallcage/loader.rb
19
23
  lib/smallcage/misc.rb
20
24
  lib/smallcage/renderer.rb
25
+ lib/smallcage/resources/Manifest.erb
26
+ lib/smallcage/resources/auto.html
21
27
  lib/smallcage/runner.rb
22
28
  lib/smallcage/version.rb
23
- log/debug.log
24
- project/default/_smc/helpers/base_helper.rb
25
- project/default/_smc/helpers/site_helper.rb
26
- project/default/_smc/templates/default.rhtml
27
- project/default/_smc/templates/footer.rhtml
28
- project/default/_smc/templates/header.rhtml
29
+ project/base/_smc/helpers/base_helper.rb
30
+ project/base/_smc/helpers/site_helper.rb
31
+ project/base/_smc/templates/default.rhtml
32
+ project/base/_smc/templates/footer.rhtml
33
+ project/base/_smc/templates/header.rhtml
34
+ project/lang/_smc/helpers/lang_helper.rb
35
+ project/lang/_smc/templates/other_lang.rhtml
29
36
  project/nkf/_smc/filters/filters.yml
30
37
  project/nkf/_smc/filters/nkf_filter.rb
38
+ project/redcloth/_smc/helpers/red_cloth_helper.rb
39
+ project/redcloth/_smc/templates/markdown.rhtml
40
+ project/redcloth/_smc/templates/textile.rhtml
31
41
  project/relpath/_smc/filters/filters.yml
32
42
  project/relpath/_smc/filters/relpath_filter.rb
33
43
  project/standard/_dir.smc
@@ -55,6 +65,12 @@ script/generate.cmd
55
65
  setup.rb
56
66
  spec/data/htdocs1/_dir.smc
57
67
  spec/data/htdocs1/a/b/c/index.html.smc
68
+ spec/data/htdocs2/_smc/templates/dummy.rhtml
69
+ spec/data/htdocs2/a/b/c/test.html
70
+ spec/data/htdocs2/a/b/test.html
71
+ spec/data/htdocs2/a/test.html.smc
72
+ spec/document_path_spec.rb
73
+ spec/export_spec.rb
58
74
  spec/import_spec.rb
59
75
  spec/loader_spec.rb
60
76
  spec/manifest_spec.rb
data/bin/smc CHANGED
@@ -3,134 +3,14 @@
3
3
  # Created on 2007-8-22.
4
4
  # Copyright (c) 2007. All rights reserved.
5
5
 
6
+ unless defined? Gem
7
+ $:.unshift File.dirname(__FILE__) + "/../lib"
8
+ end
9
+
6
10
  begin
7
11
  require 'rubygems'
12
+ require 'smallcage'
13
+ SmallCage::Application.execute
8
14
  rescue LoadError
9
- # no rubygems to load, so we fail silently
10
- end
11
-
12
- require 'smallcage'
13
- require 'optparse'
14
-
15
- STDOUT.sync = true
16
-
17
- VERSION_NOTE = "SmallCage #{SmallCage::VERSION::STRING} - Lightweight CMS Package."
18
- OPTIONS = {}
19
- OPTIONS[:original_argv] = ARGV.clone
20
-
21
- OptionParser.new do |opts|
22
-
23
- opts.banner =<<BANNER
24
- Usage: #{File.basename($0)} <subcommand> [options]
25
- #{VERSION_NOTE}
26
- Subcommands are:
27
- update [path] Build smc contents.
28
- clean [path] Remove files generated from *.smc source.
29
- server [path] [port] Start HTTP server.
30
- auto [path] Start auto update daemon.
31
- import [name|uri] Import project.
32
- manifest [path] Generate Manifest.html file.
33
-
34
- Options are:
35
- BANNER
36
-
37
- opts.separator ""
38
- opts.on("-h", "--help", "Show this help message.") do
39
- puts opts
40
- exit
41
- end
42
- opts.on("-v", "--version", "Show version info.") do
43
- puts VERSION_NOTE
44
- exit
45
- end
46
-
47
- subparsers = Hash.new do |h,k|
48
- $stderr.puts "no such subcommand: #{k}"
49
- exit 1
50
- end
51
-
52
- subparsers[:update] = OptionParser.new do |subp|
53
- subp.banner =<<EOT
54
- Usage: update [PATH]
55
- EOT
56
- end
57
-
58
- subparsers[:server] = OptionParser.new do |subp|
59
- subp.banner =<<EOT
60
- Usage: server [PATH] [PORT]
61
- EOT
62
- end
63
-
64
- subparsers[:auto] = OptionParser.new do |subp|
65
- subp.banner =<<EOT
66
- Usage: auto [PATH]
67
- EOT
68
- end
69
-
70
- subparsers[:generate] = OptionParser.new do |subp|
71
- end
72
- subparsers[:release] = OptionParser.new do |subp|
73
- end
74
- subparsers[:help] = OptionParser.new do |subp|
75
- end
76
- subparsers[:import] = OptionParser.new do |subp|
77
- end
78
- subparsers[:manifest] = OptionParser.new do |subp|
79
- end
80
- subparsers[:clean] = OptionParser.new do |subp|
81
- end
82
-
83
- commands = Hash.new {|h,k| k}
84
- commands.merge!({
85
- :up => :update,
86
- :sv => :server,
87
- :au => :auto,
88
- :gen => :generate,
89
- :rel => :release,
90
- :st => :status,
91
- })
92
-
93
- opts.order!(ARGV)
94
- unless ARGV.empty?
95
- OPTIONS[:command] = commands[ARGV.shift.to_sym]
96
- subparsers[OPTIONS[:command]].parse!(ARGV)
97
- end
98
-
99
- if OPTIONS[:command].nil?
100
- puts opts
101
- exit
102
- elsif OPTIONS[:command] == :help
103
- subcmd = ARGV.shift
104
- if subcmd.nil?
105
- puts opts
106
- else
107
- puts subparsers[subcmd.to_sym]
108
- end
109
- exit
110
- elsif OPTIONS[:command] == :update
111
- OPTIONS[:path] = ARGV.shift
112
- OPTIONS[:path] ||= "."
113
- elsif OPTIONS[:command] == :server
114
- OPTIONS[:path] = ARGV.shift
115
- OPTIONS[:port] = ARGV.shift
116
- OPTIONS[:path] ||= "."
117
- OPTIONS[:port] ||= 80
118
- elsif OPTIONS[:command] == :auto
119
- OPTIONS[:path] = ARGV.shift
120
- OPTIONS[:path] ||= "."
121
- elsif OPTIONS[:command] == :import
122
- OPTIONS[:from] = ARGV.shift
123
- OPTIONS[:from] ||= "default"
124
-
125
- OPTIONS[:to] = ARGV.shift
126
- OPTIONS[:to] ||= "."
127
- elsif OPTIONS[:command] == :manifest
128
- OPTIONS[:path] = ARGV.shift
129
- OPTIONS[:path] ||= "."
130
- elsif OPTIONS[:command] == :clean
131
- OPTIONS[:path] = ARGV.shift
132
- OPTIONS[:path] ||= "."
133
- end
134
15
  end
135
16
 
136
- SmallCage::Runner.run(OPTIONS)
@@ -5,6 +5,7 @@ require 'erb'
5
5
  require 'pathname'
6
6
  require 'open-uri'
7
7
  require 'fileutils'
8
+ require 'delegate'
8
9
 
9
10
  require 'smallcage/version'
10
11
  require 'smallcage/misc'
@@ -12,11 +13,6 @@ require 'smallcage/loader'
12
13
  require 'smallcage/erb_base'
13
14
  require 'smallcage/renderer'
14
15
  require 'smallcage/runner'
15
-
16
- require 'smallcage/commands/update'
17
- require 'smallcage/commands/clean'
18
- require 'smallcage/commands/server'
19
- require 'smallcage/commands/auto'
20
- require 'smallcage/commands/import'
21
- require 'smallcage/commands/manifest'
22
-
16
+ require 'smallcage/document_path'
17
+ require 'smallcage/http_server'
18
+ require 'smallcage/application'
@@ -0,0 +1,159 @@
1
+
2
+ VERSION_NOTE = "SmallCage #{SmallCage::VERSION::STRING} - Lightweight CMS Package."
3
+ OPTIONS = {}
4
+ OPTIONS[:original_argv] = ARGV.clone
5
+
6
+ class SmallCage::Application
7
+ require 'optparse'
8
+
9
+ @@signal_handlers = {
10
+ "INT" => [],
11
+ "TERM" => []
12
+ }
13
+
14
+ @@signal_handlers.keys.each do |signal|
15
+ Signal.trap(signal) do
16
+ @@signal_handlers[signal].each do |proc|
17
+ proc.call(signal)
18
+ end
19
+ end
20
+ end
21
+
22
+ def self.add_signal_handler(signal, handler)
23
+ signal.to_a.each do |s|
24
+ @@signal_handlers[s] << handler
25
+ end
26
+ end
27
+
28
+ def self.execute
29
+
30
+ STDOUT.sync = true
31
+
32
+ OptionParser.new do |opts|
33
+
34
+ opts.banner =<<BANNER
35
+ Usage: #{File.basename($0)} <subcommand> [options]
36
+ #{VERSION_NOTE}
37
+ Subcommands are:
38
+ update [path] Build smc contents.
39
+ clean [path] Remove files generated from *.smc source.
40
+ server [path] [port] Start HTTP server.
41
+ auto [path] [port] Start auto update daemon.
42
+ import [name|uri] Import project.
43
+ export [path] [outputpath] Export project.
44
+ manifest [path] Generate Manifest.html file.
45
+
46
+ Options are:
47
+ BANNER
48
+
49
+ opts.separator ""
50
+ opts.on("-h", "--help", "Show this help message.") do
51
+ puts opts
52
+ exit
53
+ end
54
+ opts.on("-v", "--version", "Show version info.") do
55
+ puts VERSION_NOTE
56
+ exit
57
+ end
58
+
59
+ subparsers = Hash.new do |h,k|
60
+ $stderr.puts "no such subcommand: #{k}"
61
+ exit 1
62
+ end
63
+
64
+ subparsers[:update] = OptionParser.new do |subp|
65
+ subp.banner =<<EOT
66
+ Usage: update [PATH]
67
+ EOT
68
+ end
69
+
70
+ subparsers[:server] = OptionParser.new do |subp|
71
+ subp.banner =<<EOT
72
+ Usage: server [PATH] [PORT]
73
+ EOT
74
+ end
75
+
76
+ subparsers[:auto] = OptionParser.new do |subp|
77
+ subp.banner =<<EOT
78
+ Usage: auto [PATH]
79
+ EOT
80
+ end
81
+
82
+ subparsers[:generate] = OptionParser.new do |subp|
83
+ end
84
+ subparsers[:release] = OptionParser.new do |subp|
85
+ end
86
+ subparsers[:help] = OptionParser.new do |subp|
87
+ end
88
+ subparsers[:import] = OptionParser.new do |subp|
89
+ end
90
+ subparsers[:export] = OptionParser.new do |subp|
91
+ end
92
+ subparsers[:manifest] = OptionParser.new do |subp|
93
+ end
94
+ subparsers[:clean] = OptionParser.new do |subp|
95
+ end
96
+
97
+ commands = Hash.new {|h,k| k}
98
+ commands.merge!({
99
+ :up => :update,
100
+ :sv => :server,
101
+ :au => :auto,
102
+ :gen => :generate,
103
+ :rel => :release,
104
+ :st => :status,
105
+ })
106
+
107
+ opts.order!(ARGV)
108
+ unless ARGV.empty?
109
+ OPTIONS[:command] = commands[ARGV.shift.to_sym]
110
+ subparsers[OPTIONS[:command]].parse!(ARGV)
111
+ end
112
+
113
+ if OPTIONS[:command].nil?
114
+ puts opts
115
+ exit
116
+ elsif OPTIONS[:command] == :help
117
+ subcmd = ARGV.shift
118
+ if subcmd.nil?
119
+ puts opts
120
+ else
121
+ puts subparsers[subcmd.to_sym]
122
+ end
123
+ exit
124
+ elsif OPTIONS[:command] == :update
125
+ OPTIONS[:path] = ARGV.shift
126
+ OPTIONS[:path] ||= "."
127
+ elsif OPTIONS[:command] == :server
128
+ OPTIONS[:path] = ARGV.shift
129
+ OPTIONS[:port] = ARGV.shift
130
+ OPTIONS[:path] ||= "."
131
+ OPTIONS[:port] ||= 80
132
+ elsif OPTIONS[:command] == :auto
133
+ OPTIONS[:path] = ARGV.shift
134
+ OPTIONS[:path] ||= "."
135
+ OPTIONS[:port] = ARGV.shift
136
+ elsif OPTIONS[:command] == :import
137
+ OPTIONS[:from] = ARGV.shift
138
+ OPTIONS[:from] ||= "default"
139
+
140
+ OPTIONS[:to] = ARGV.shift
141
+ OPTIONS[:to] ||= "."
142
+ elsif OPTIONS[:command] == :export
143
+ OPTIONS[:path] = ARGV.shift
144
+ OPTIONS[:path] ||= "."
145
+
146
+ OPTIONS[:out] = ARGV.shift
147
+ elsif OPTIONS[:command] == :manifest
148
+ OPTIONS[:path] = ARGV.shift
149
+ OPTIONS[:path] ||= "."
150
+ elsif OPTIONS[:command] == :clean
151
+ OPTIONS[:path] = ARGV.shift
152
+ OPTIONS[:path] ||= "."
153
+ end
154
+ end
155
+
156
+ SmallCage::Runner.run(OPTIONS)
157
+
158
+ end
159
+ end
@@ -1,52 +1,158 @@
1
1
  module SmallCage::Commands
2
- class Auto
3
- def self.execute(opts)
4
- self.new(opts).execute
5
- end
2
+ class Auto < SmallCage::Commands::Base
6
3
 
7
4
  def initialize(opts)
8
- @opts = opts
5
+ super(opts)
9
6
  @target = Pathname.new(opts[:path])
7
+ @port = opts[:port]
10
8
  @sleep = 1
11
9
  @mtimes = {}
12
10
  end
13
-
11
+
14
12
  def execute
15
- puts "SmallCage Auto Update"
16
- puts "-" * 60
13
+ puts_banner
17
14
 
18
- ['INT', 'TERM'].each do |signal|
19
- Signal.trap(signal) do
20
- puts
21
- puts "exit."
22
- exit
15
+ start_http_server unless @port.nil?
16
+ init_sig_handler
17
+
18
+ @loader = SmallCage::Loader.new(@target)
19
+
20
+ first_loop = true
21
+ @update_loop = true
22
+ while @update_loop
23
+ if first_loop
24
+ first_loop = false
25
+ update_target
26
+ else
27
+ update_modified_files
23
28
  end
29
+ sleep @sleep
24
30
  end
31
+ end
25
32
 
26
- loop do
27
- sleep @sleep
28
-
29
- loader = SmallCage::Loader.new(@target)
30
-
31
- do_update = false
32
- loader.each_smc_file do |f|
33
+ def modified_special_files
34
+ root = @loader.root
35
+
36
+ result = []
37
+ Dir.chdir(root) do
38
+ Dir.glob("_smc/{templates,filters,helpers}/*") do |f|
39
+ f = root + f
33
40
  mtime = File.stat(f).mtime
34
41
  if @mtimes[f] != mtime
35
42
  @mtimes[f] = mtime
36
- do_update = true
43
+ result << f
37
44
  end
38
45
  end
39
-
40
- if do_update
41
- runner = SmallCage::Runner.new({ :path => @target })
42
- runner.update
43
- print "\a"
44
- puts "-" * 60
46
+ end
47
+
48
+ return result
49
+ end
50
+ private :modified_special_files
51
+
52
+ def modified_files
53
+ result = []
54
+ @loader.each_smc_file do |f|
55
+ mtime = File.stat(f).mtime
56
+ if @mtimes[f] != mtime
57
+ @mtimes[f] = mtime
58
+ result << f
45
59
  end
60
+ end
61
+ return result
62
+ end
63
+ private :modified_files
64
+
65
+ def update_target
66
+ # load @mtimes
67
+ modified_special_files
68
+ target_files = modified_files
69
+
70
+ runner = SmallCage::Runner.new({ :path => @target })
71
+ runner.update
72
+
73
+ update_http_server(target_files)
74
+ puts_line
75
+ end
76
+ private :update_target
46
77
 
78
+ def update_modified_files
79
+ reload = false
80
+ if modified_special_files.empty?
81
+ target_files = modified_files
82
+ else
83
+ # update root directory.
84
+ target_files = [@loader.root + "./_dir.smc"]
85
+ reload = true
86
+ end
87
+
88
+ return if target_files.empty?
89
+ target_files.each do |tf|
90
+ if tf.basename.to_s == "_dir.smc"
91
+ runner = SmallCage::Runner.new({ :path => tf.parent })
92
+ else
93
+ runner = SmallCage::Runner.new({ :path => tf })
94
+ end
95
+ runner.update
47
96
  end
97
+
98
+ if reload
99
+ @http_server.reload
100
+ else
101
+ update_http_server(target_files)
102
+ end
103
+ puts_line
104
+ end
105
+ private :update_modified_files
48
106
 
107
+ def puts_banner
108
+ return if quiet?
109
+ puts "SmallCage Auto Update"
110
+ puts "http://localhost:#{@port}/_smc/auto" unless @port.nil?
111
+ puts
112
+ end
113
+ private :puts_banner
114
+
115
+ def puts_line
116
+ return if quiet?
117
+ puts "-" * 60
118
+ print "\a" # Bell
119
+ end
120
+ private :puts_line
121
+
122
+ def update_http_server(target_files)
123
+ return unless @http_server
124
+ path = target_files.find {|p| p.basename.to_s != "_dir.smc" }
125
+ if path.nil?
126
+ dir = target_files.shift
127
+ dpath = SmallCage::DocumentPath.new(@loader.root, dir.parent)
128
+ @http_server.updated_uri = dpath.uri
129
+ else
130
+ dpath = SmallCage::DocumentPath.new(@loader.root, path)
131
+ @http_server.updated_uri = dpath.outuri
132
+ end
133
+ end
134
+ private :update_http_server
135
+
136
+ def init_sig_handler
137
+ shutdown_handler = Proc.new do |signal|
138
+ @http_server.shutdown unless @http_server.nil?
139
+ @update_loop = false
140
+ end
141
+ SmallCage::Application.add_signal_handler(["INT", "TERM"], shutdown_handler)
142
+ end
143
+ private :init_sig_handler
144
+
145
+ def start_http_server
146
+ document_root = @opts[:path]
147
+ port = @opts[:port]
148
+
149
+ @http_server = SmallCage::HTTPServer.new(document_root, port)
150
+
151
+ Thread.new do
152
+ @http_server.start
153
+ end
49
154
  end
155
+ private :start_http_server
50
156
 
51
157
  end
52
158
  end