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.
- data/History.txt +48 -0
- data/License.txt +20 -0
- data/README.txt +1 -0
- data/Rakefile +140 -0
- data/bin/smc +16 -0
- data/lib/smallcage.rb +18 -0
- data/lib/smallcage/application.rb +164 -0
- data/lib/smallcage/commands/auto.rb +158 -0
- data/lib/smallcage/commands/base.rb +19 -0
- data/lib/smallcage/commands/clean.rb +32 -0
- data/lib/smallcage/commands/export.rb +41 -0
- data/lib/smallcage/commands/import.rb +217 -0
- data/lib/smallcage/commands/manifest.rb +39 -0
- data/lib/smallcage/commands/server.rb +15 -0
- data/lib/smallcage/commands/update.rb +121 -0
- data/lib/smallcage/document_path.rb +46 -0
- data/lib/smallcage/erb_base.rb +16 -0
- data/lib/smallcage/http_server.rb +66 -0
- data/lib/smallcage/loader.rb +278 -0
- data/lib/smallcage/misc.rb +13 -0
- data/lib/smallcage/renderer.rb +19 -0
- data/lib/smallcage/resources/Manifest.erb +19 -0
- data/lib/smallcage/resources/auto.html +119 -0
- data/lib/smallcage/runner.rb +51 -0
- data/lib/smallcage/version.rb +9 -0
- data/project/base/_smc/helpers/base_helper.rb +41 -0
- data/project/base/_smc/helpers/site_helper.rb +5 -0
- data/project/base/_smc/templates/default.rhtml +5 -0
- data/project/base/_smc/templates/footer.rhtml +0 -0
- data/project/base/_smc/templates/header.rhtml +0 -0
- data/project/bluecloth/_smc/helpers/blue_cloth_helper.rb +10 -0
- data/project/bluecloth/_smc/templates/markdown.rhtml +5 -0
- data/project/lang/_smc/helpers/lang_helper.rb +19 -0
- data/project/lang/_smc/templates/other_lang.rhtml +6 -0
- data/project/news/_smc/helpers/news_helper.rb +36 -0
- data/project/nkf/_smc/filters/filters.yml +3 -0
- data/project/nkf/_smc/filters/nkf_filter.rb +15 -0
- data/project/rake/_smc/Rakefile +68 -0
- data/project/redcloth/_smc/helpers/red_cloth_helper.rb +10 -0
- data/project/redcloth/_smc/templates/textile.rhtml +5 -0
- data/project/relpath/_smc/filters/filters.yml +2 -0
- data/project/relpath/_smc/filters/relpath_filter.rb +13 -0
- data/project/standard/_dir.smc +2 -0
- data/project/standard/_smc/helpers/base_helper.rb +34 -0
- data/project/standard/_smc/helpers/menu_helper.rb +23 -0
- data/project/standard/_smc/templates/default.rhtml +5 -0
- data/project/standard/_smc/templates/footer.rhtml +13 -0
- data/project/standard/_smc/templates/header.rhtml +37 -0
- data/project/standard/_smc/templates/menu.rhtml +6 -0
- data/project/standard/_smc/templates/redirect.rhtml +13 -0
- data/project/standard/_smc/templates/sidebar.rhtml +7 -0
- data/project/standard/_smc/templates/topic_path.rhtml +6 -0
- data/project/standard/common/css/default.css +145 -0
- data/project/standard/common/css/print.css +0 -0
- data/project/standard/index.html.smc +3 -0
- data/project/standard/sample/_dir.smc +1 -0
- data/project/standard/sample/index.html.smc +7 -0
- data/project/standard/sample/redirect.html.smc +2 -0
- data/project/standard/sample/sub/_dir.smc +1 -0
- data/project/standard/sample/sub/contents.html.smc +3 -0
- data/project/standard/sample/sub/index.html.smc +7 -0
- data/spec/data/htdocs1/_dir.smc +0 -0
- data/spec/data/htdocs1/a/b/c/index.html.smc +6 -0
- data/spec/data/htdocs2/_smc/templates/dummy.rhtml +0 -0
- data/spec/data/htdocs2/a/b/c/test.html +1 -0
- data/spec/data/htdocs2/a/b/test.html +1 -0
- data/spec/data/htdocs2/a/test.html.smc +2 -0
- data/spec/document_path_spec.rb +42 -0
- data/spec/export_spec.rb +45 -0
- data/spec/import_spec.rb +20 -0
- data/spec/loader_spec.rb +55 -0
- data/spec/manifest_spec.rb +39 -0
- data/spec/misc_spec.rb +25 -0
- data/spec/smallcage_spec.rb +40 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- data/test/test_helper.rb +2 -0
- data/test/test_smallcage.rb +11 -0
- 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
|