bluemark-smallcage 0.1.3

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 (79) hide show
  1. data/History.txt +48 -0
  2. data/License.txt +20 -0
  3. data/README.txt +1 -0
  4. data/Rakefile +140 -0
  5. data/bin/smc +16 -0
  6. data/lib/smallcage.rb +18 -0
  7. data/lib/smallcage/application.rb +164 -0
  8. data/lib/smallcage/commands/auto.rb +158 -0
  9. data/lib/smallcage/commands/base.rb +19 -0
  10. data/lib/smallcage/commands/clean.rb +32 -0
  11. data/lib/smallcage/commands/export.rb +41 -0
  12. data/lib/smallcage/commands/import.rb +217 -0
  13. data/lib/smallcage/commands/manifest.rb +39 -0
  14. data/lib/smallcage/commands/server.rb +15 -0
  15. data/lib/smallcage/commands/update.rb +121 -0
  16. data/lib/smallcage/document_path.rb +46 -0
  17. data/lib/smallcage/erb_base.rb +16 -0
  18. data/lib/smallcage/http_server.rb +66 -0
  19. data/lib/smallcage/loader.rb +278 -0
  20. data/lib/smallcage/misc.rb +13 -0
  21. data/lib/smallcage/renderer.rb +19 -0
  22. data/lib/smallcage/resources/Manifest.erb +19 -0
  23. data/lib/smallcage/resources/auto.html +119 -0
  24. data/lib/smallcage/runner.rb +51 -0
  25. data/lib/smallcage/version.rb +9 -0
  26. data/project/base/_smc/helpers/base_helper.rb +41 -0
  27. data/project/base/_smc/helpers/site_helper.rb +5 -0
  28. data/project/base/_smc/templates/default.rhtml +5 -0
  29. data/project/base/_smc/templates/footer.rhtml +0 -0
  30. data/project/base/_smc/templates/header.rhtml +0 -0
  31. data/project/bluecloth/_smc/helpers/blue_cloth_helper.rb +10 -0
  32. data/project/bluecloth/_smc/templates/markdown.rhtml +5 -0
  33. data/project/lang/_smc/helpers/lang_helper.rb +19 -0
  34. data/project/lang/_smc/templates/other_lang.rhtml +6 -0
  35. data/project/news/_smc/helpers/news_helper.rb +36 -0
  36. data/project/nkf/_smc/filters/filters.yml +3 -0
  37. data/project/nkf/_smc/filters/nkf_filter.rb +15 -0
  38. data/project/rake/_smc/Rakefile +68 -0
  39. data/project/redcloth/_smc/helpers/red_cloth_helper.rb +10 -0
  40. data/project/redcloth/_smc/templates/textile.rhtml +5 -0
  41. data/project/relpath/_smc/filters/filters.yml +2 -0
  42. data/project/relpath/_smc/filters/relpath_filter.rb +13 -0
  43. data/project/standard/_dir.smc +2 -0
  44. data/project/standard/_smc/helpers/base_helper.rb +34 -0
  45. data/project/standard/_smc/helpers/menu_helper.rb +23 -0
  46. data/project/standard/_smc/templates/default.rhtml +5 -0
  47. data/project/standard/_smc/templates/footer.rhtml +13 -0
  48. data/project/standard/_smc/templates/header.rhtml +37 -0
  49. data/project/standard/_smc/templates/menu.rhtml +6 -0
  50. data/project/standard/_smc/templates/redirect.rhtml +13 -0
  51. data/project/standard/_smc/templates/sidebar.rhtml +7 -0
  52. data/project/standard/_smc/templates/topic_path.rhtml +6 -0
  53. data/project/standard/common/css/default.css +145 -0
  54. data/project/standard/common/css/print.css +0 -0
  55. data/project/standard/index.html.smc +3 -0
  56. data/project/standard/sample/_dir.smc +1 -0
  57. data/project/standard/sample/index.html.smc +7 -0
  58. data/project/standard/sample/redirect.html.smc +2 -0
  59. data/project/standard/sample/sub/_dir.smc +1 -0
  60. data/project/standard/sample/sub/contents.html.smc +3 -0
  61. data/project/standard/sample/sub/index.html.smc +7 -0
  62. data/spec/data/htdocs1/_dir.smc +0 -0
  63. data/spec/data/htdocs1/a/b/c/index.html.smc +6 -0
  64. data/spec/data/htdocs2/_smc/templates/dummy.rhtml +0 -0
  65. data/spec/data/htdocs2/a/b/c/test.html +1 -0
  66. data/spec/data/htdocs2/a/b/test.html +1 -0
  67. data/spec/data/htdocs2/a/test.html.smc +2 -0
  68. data/spec/document_path_spec.rb +42 -0
  69. data/spec/export_spec.rb +45 -0
  70. data/spec/import_spec.rb +20 -0
  71. data/spec/loader_spec.rb +55 -0
  72. data/spec/manifest_spec.rb +39 -0
  73. data/spec/misc_spec.rb +25 -0
  74. data/spec/smallcage_spec.rb +40 -0
  75. data/spec/spec.opts +1 -0
  76. data/spec/spec_helper.rb +9 -0
  77. data/test/test_helper.rb +2 -0
  78. data/test/test_smallcage.rb +11 -0
  79. metadata +193 -0
data/History.txt ADDED
@@ -0,0 +1,48 @@
1
+ == 0.1.3 2009-05-01
2
+
3
+ * stop using newgem and generate Rakefile using cutagem.
4
+ * fix svnignore_reset bug.
5
+
6
+ == 0.1.2 2009-01-16
7
+
8
+ * stop using /dev/null for WEBrick access log.
9
+
10
+ == 0.1.1 2008-09-22
11
+
12
+ * fix permissions.
13
+ * remove render_markdown method from red_cloth_helper.rb. RedCloth can't format markdown.
14
+ * add BlueCloth project template.
15
+ * add news project template.
16
+ * refine default project template.
17
+
18
+ == 0.1.0 2008-05-26
19
+
20
+ * to avoid namespace polution, the helpers and filters loaded into an anonymous module.
21
+ * fix signal handler bug.
22
+ * change base helper _glob method.
23
+ * refine default project template.
24
+
25
+ == 0.0.9 2008-04-21
26
+
27
+ * fix smc auto command bug.
28
+ * add RedCloth project template (redcloth).
29
+ * add multi language project template (lang).
30
+ * add auto navigation servlet to the HTTP server.
31
+ * add export command.
32
+ * delete output file when smc source file does not exist.
33
+
34
+ == 0.0.6 2007-11-04
35
+
36
+ * smcオブジェクトのpathがStringだったのをPathnameを保持するように修正。ファイルアクセスで使う値なのでPathnameの方が良いと判断しました。
37
+ * updateで拡張子smcを省略するとエラーになる問題を修正。
38
+ * ドキュメントルートが見つからない場合にループしてしまう問題を修正。
39
+ * ドキュメントルート以下に移動してupdateするとエラーになる問題を修正。
40
+
41
+ == 0.0.5 2007-11-01
42
+
43
+ * smcファイル内でerbを使うためにRendererにメソッドを追加。
44
+
45
+ == 0.0.1 2007-08-22
46
+
47
+ * 1 major enhancement:
48
+ * Initial release
data/License.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2007 FIXME full name
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.txt ADDED
@@ -0,0 +1 @@
1
+ README
data/Rakefile ADDED
@@ -0,0 +1,140 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/testtask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'rake/rdoctask'
8
+ require 'rake/contrib/rubyforgepublisher'
9
+ require 'rake/contrib/sshpublisher'
10
+ require 'fileutils'
11
+ require 'lib/smallcage'
12
+ include FileUtils
13
+
14
+ NAME = "smallcage"
15
+ AUTHORS = ["SAITO Toshihiro", "gom", "KOSEKI Kengo"]
16
+ EMAIL = "smallcage@googlegroups.com"
17
+ DESCRIPTION = "Lightweight CMS package."
18
+ RUBYFORGE_PROJECT = "smallcage"
19
+ HOMEPATH = "http://www.smallcage.org"
20
+ BIN_FILES = %w(smc)
21
+
22
+ VERS = SmallCage::VERSION::STRING
23
+ REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
24
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config']
25
+ RDOC_OPTS = [
26
+ '--title', "#{NAME} documentation",
27
+ "--charset", "utf-8",
28
+ "--opname", "index.html",
29
+ "--line-numbers",
30
+ "--main", "README.txt",
31
+ "--inline-source",
32
+ ]
33
+
34
+ task :default => [:test]
35
+ task :package => [:clean]
36
+
37
+ Rake::TestTask.new("test") do |t|
38
+ t.libs << "test"
39
+ t.pattern = "test/**/*_test.rb"
40
+ t.verbose = true
41
+ end
42
+
43
+ spec = Gem::Specification.new do |s|
44
+ s.name = NAME
45
+ s.version = VERS
46
+ s.platform = Gem::Platform::RUBY
47
+ s.has_rdoc = true
48
+ s.extra_rdoc_files = ["README.txt", "History.txt"]
49
+ s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
50
+ s.summary = DESCRIPTION
51
+ s.description = DESCRIPTION
52
+ s.authors = AUTHORS
53
+ s.email = EMAIL
54
+ s.homepage = HOMEPATH
55
+ s.executables = BIN_FILES
56
+ s.rubyforge_project = RUBYFORGE_PROJECT
57
+ s.bindir = "bin"
58
+ s.require_path = "lib"
59
+ #s.autorequire = ""
60
+ s.test_files = Dir["test/*_test.rb"]
61
+
62
+ #s.add_dependency('activesupport', '>=1.3.1')
63
+ #s.required_ruby_version = '>= 1.8.2'
64
+
65
+ s.files = %w(Rakefile README.txt History.txt License.txt) +
66
+ Dir.glob("{bin,doc,lib,test,project,spec}/**/*")
67
+
68
+ s.extensions = FileList["ext/**/extconf.rb"].to_a
69
+ end
70
+
71
+ Rake::GemPackageTask.new(spec) do |p|
72
+ p.need_tar = true
73
+ p.gem_spec = spec
74
+ end
75
+
76
+ task :install do
77
+ name = "#{NAME}-#{VERS}.gem"
78
+ sh %{rake package}
79
+ sh %{sudo gem install pkg/#{name}}
80
+ end
81
+
82
+ task :uninstall => [:clean] do
83
+ sh %{sudo gem uninstall #{NAME}}
84
+ end
85
+
86
+
87
+ Rake::RDocTask.new do |rdoc|
88
+ rdoc.rdoc_dir = 'html'
89
+ rdoc.options += RDOC_OPTS
90
+ rdoc.template = "resh"
91
+ #rdoc.template = "#{ENV['template']}.rb" if ENV['template']
92
+ if ENV['DOC_FILES']
93
+ rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
94
+ else
95
+ rdoc.rdoc_files.include('README.txt', 'History.txt')
96
+ rdoc.rdoc_files.include('lib/**/*.rb')
97
+ rdoc.rdoc_files.include('ext/**/*.c')
98
+ end
99
+ end
100
+
101
+ desc "Publish to RubyForge"
102
+ task :rubyforge => [:rdoc, :package] do
103
+ require 'rubyforge'
104
+ Rake::RubyForgePublisher.new(RUBYFORGE_PROJECT, 'bluemark').upload
105
+ end
106
+
107
+ desc 'Package and upload the release to rubyforge.'
108
+ task :release => [:clean, :package] do |t|
109
+ v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
110
+ abort "Versions don't match #{v} vs #{VERS}" unless v == VERS
111
+ pkg = "pkg/#{NAME}-#{VERS}"
112
+
113
+ require 'rubyforge'
114
+ rf = RubyForge.new.configure
115
+ puts "Logging in"
116
+ rf.login
117
+
118
+ c = rf.userconfig
119
+ # c["release_notes"] = description if description
120
+ # c["release_changes"] = changes if changes
121
+ c["preformatted"] = true
122
+
123
+ files = [
124
+ "#{pkg}.tgz",
125
+ "#{pkg}.gem"
126
+ ].compact
127
+
128
+ puts "Releasing #{NAME} v. #{VERS}"
129
+ rf.add_release RUBYFORGE_PROJECT, NAME, VERS, *files
130
+ end
131
+
132
+ desc 'Show information about the gem.'
133
+ task :debug_gem do
134
+ puts spec.to_ruby
135
+ end
136
+
137
+ desc 'Update gem spec'
138
+ task :gemspec do
139
+ open("#{NAME}.gemspec", 'w').write spec.to_ruby
140
+ end
data/bin/smc ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created on 2007-8-22.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+ unless defined? Gem
7
+ $:.unshift File.dirname(__FILE__) + "/../lib"
8
+ end
9
+
10
+ begin
11
+ require 'rubygems'
12
+ require 'smallcage'
13
+ SmallCage::Application.execute
14
+ rescue LoadError
15
+ end
16
+
data/lib/smallcage.rb ADDED
@@ -0,0 +1,18 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'yaml'
4
+ require 'erb'
5
+ require 'pathname'
6
+ require 'open-uri'
7
+ require 'fileutils'
8
+ require 'delegate'
9
+
10
+ require 'smallcage/version'
11
+ require 'smallcage/misc'
12
+ require 'smallcage/loader'
13
+ require 'smallcage/erb_base'
14
+ require 'smallcage/renderer'
15
+ require 'smallcage/runner'
16
+ require 'smallcage/document_path'
17
+ require 'smallcage/http_server'
18
+ require 'smallcage/application'
@@ -0,0 +1,164 @@
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 = nil
10
+
11
+ def self.init_signal_handlers
12
+ @@signal_handlers = {
13
+ "INT" => [],
14
+ "TERM" => []
15
+ }
16
+
17
+ @@signal_handlers.keys.each do |signal|
18
+ Signal.trap(signal) do
19
+ @@signal_handlers[signal].each do |proc|
20
+ proc.call(signal)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ def self.add_signal_handler(signal, handler)
27
+ init_signal_handlers if @@signal_handlers.nil?
28
+ signal.to_a.each do |s|
29
+ @@signal_handlers[s] << handler
30
+ end
31
+ end
32
+
33
+ def self.execute
34
+
35
+ STDOUT.sync = true
36
+
37
+ OptionParser.new do |opts|
38
+
39
+ opts.banner =<<BANNER
40
+ Usage: #{File.basename($0)} <subcommand> [options]
41
+ #{VERSION_NOTE}
42
+ Subcommands are:
43
+ update [path] Build smc contents.
44
+ clean [path] Remove files generated from *.smc source.
45
+ server [path] [port] Start HTTP server.
46
+ auto [path] [port] Start auto update daemon.
47
+ import [name|uri] Import project.
48
+ export [path] [outputpath] Export project.
49
+ manifest [path] Generate Manifest.html file.
50
+
51
+ Options are:
52
+ BANNER
53
+
54
+ opts.separator ""
55
+ opts.on("-h", "--help", "Show this help message.") do
56
+ puts opts
57
+ exit
58
+ end
59
+ opts.on("-v", "--version", "Show version info.") do
60
+ puts VERSION_NOTE
61
+ exit
62
+ end
63
+
64
+ subparsers = Hash.new do |h,k|
65
+ $stderr.puts "no such subcommand: #{k}"
66
+ exit 1
67
+ end
68
+
69
+ subparsers[:update] = OptionParser.new do |subp|
70
+ subp.banner =<<EOT
71
+ Usage: update [PATH]
72
+ EOT
73
+ end
74
+
75
+ subparsers[:server] = OptionParser.new do |subp|
76
+ subp.banner =<<EOT
77
+ Usage: server [PATH] [PORT]
78
+ EOT
79
+ end
80
+
81
+ subparsers[:auto] = OptionParser.new do |subp|
82
+ subp.banner =<<EOT
83
+ Usage: auto [PATH]
84
+ EOT
85
+ end
86
+
87
+ subparsers[:generate] = OptionParser.new do |subp|
88
+ end
89
+ subparsers[:release] = OptionParser.new do |subp|
90
+ end
91
+ subparsers[:help] = OptionParser.new do |subp|
92
+ end
93
+ subparsers[:import] = OptionParser.new do |subp|
94
+ end
95
+ subparsers[:export] = OptionParser.new do |subp|
96
+ end
97
+ subparsers[:manifest] = OptionParser.new do |subp|
98
+ end
99
+ subparsers[:clean] = OptionParser.new do |subp|
100
+ end
101
+
102
+ commands = Hash.new {|h,k| k}
103
+ commands.merge!({
104
+ :up => :update,
105
+ :sv => :server,
106
+ :au => :auto,
107
+ :gen => :generate,
108
+ :rel => :release,
109
+ :st => :status,
110
+ })
111
+
112
+ opts.order!(ARGV)
113
+ unless ARGV.empty?
114
+ OPTIONS[:command] = commands[ARGV.shift.to_sym]
115
+ subparsers[OPTIONS[:command]].parse!(ARGV)
116
+ end
117
+
118
+ if OPTIONS[:command].nil?
119
+ puts opts
120
+ exit
121
+ elsif OPTIONS[:command] == :help
122
+ subcmd = ARGV.shift
123
+ if subcmd.nil?
124
+ puts opts
125
+ else
126
+ puts subparsers[subcmd.to_sym]
127
+ end
128
+ exit
129
+ elsif OPTIONS[:command] == :update
130
+ OPTIONS[:path] = ARGV.shift
131
+ OPTIONS[:path] ||= "."
132
+ elsif OPTIONS[:command] == :server
133
+ OPTIONS[:path] = ARGV.shift
134
+ OPTIONS[:port] = ARGV.shift
135
+ OPTIONS[:path] ||= "."
136
+ OPTIONS[:port] ||= 80
137
+ elsif OPTIONS[:command] == :auto
138
+ OPTIONS[:path] = ARGV.shift
139
+ OPTIONS[:path] ||= "."
140
+ OPTIONS[:port] = ARGV.shift
141
+ elsif OPTIONS[:command] == :import
142
+ OPTIONS[:from] = ARGV.shift
143
+ OPTIONS[:from] ||= "default"
144
+
145
+ OPTIONS[:to] = ARGV.shift
146
+ OPTIONS[:to] ||= "."
147
+ elsif OPTIONS[:command] == :export
148
+ OPTIONS[:path] = ARGV.shift
149
+ OPTIONS[:path] ||= "."
150
+
151
+ OPTIONS[:out] = ARGV.shift
152
+ elsif OPTIONS[:command] == :manifest
153
+ OPTIONS[:path] = ARGV.shift
154
+ OPTIONS[:path] ||= "."
155
+ elsif OPTIONS[:command] == :clean
156
+ OPTIONS[:path] = ARGV.shift
157
+ OPTIONS[:path] ||= "."
158
+ end
159
+ end
160
+
161
+ SmallCage::Runner.run(OPTIONS)
162
+
163
+ end
164
+ end
@@ -0,0 +1,158 @@
1
+ module SmallCage::Commands
2
+ class Auto < SmallCage::Commands::Base
3
+
4
+ def initialize(opts)
5
+ super(opts)
6
+ @target = Pathname.new(opts[:path])
7
+ @port = opts[:port]
8
+ @sleep = 1
9
+ @mtimes = {}
10
+ end
11
+
12
+ def execute
13
+ puts_banner
14
+
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
28
+ end
29
+ sleep @sleep
30
+ end
31
+ end
32
+
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
40
+ mtime = File.stat(f).mtime
41
+ if @mtimes[f] != mtime
42
+ @mtimes[f] = mtime
43
+ result << f
44
+ end
45
+ end
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
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
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
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
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
154
+ end
155
+ private :start_http_server
156
+
157
+ end
158
+ end