sitebuilder 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +3 -0
- data/README.rdoc +0 -1
- data/TODO.rdoc +2 -1
- data/doc/demo.rdoc +45 -41
- data/doc/demo.script +29 -23
- data/lib/sitebuilder/actions.rb +21 -0
- data/lib/sitebuilder/sitegenerator.rb +14 -12
- data/test/filesystem_test.rb +1 -0
- data/test/sitegenerator_test.rb +49 -0
- metadata +15 -3
- data/doc/complex.script +0 -42
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
== 0.0.5
|
2
|
+
2010-01-28: refactored use of procs into explicit actions
|
3
|
+
2009-12-19:simplified initiation of sitebuilder - just call "generate" method on a sitebuilder object
|
1
4
|
== 0.0.4
|
2
5
|
2009-12-13:added spike of how to use erb and semantictext gem
|
3
6
|
2009-12-13:added explicit runtime dependency on semantictext
|
data/README.rdoc
CHANGED
@@ -14,7 +14,6 @@ a subdirectory of a destination directory.
|
|
14
14
|
* Install with:
|
15
15
|
gem install sitebuilder
|
16
16
|
* Basic operation can be seen in demo.rdoc
|
17
|
-
* Just a core object model & tests right now... needs to be completed.
|
18
17
|
* *rdoc* http://www.greenbarsoft.co.uk/software/sitebuilder/rdoc/
|
19
18
|
* *source* http://github.com/dafydd/sitebuilder
|
20
19
|
* To build me, set an environment variable called *SANDBOX* to the directory above your sitebuilder directory. The tests need this pathname to access test data.
|
data/TODO.rdoc
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
== todo
|
2
2
|
* make template action - with erb and semantictext
|
3
3
|
* merge a text formatter into template action
|
4
|
-
* work out how to map file paths to URLs
|
5
4
|
* make copy action
|
5
|
+
* work out how to map file paths to URLs
|
6
6
|
* make index action
|
7
7
|
* work out how to handle cross references
|
8
8
|
* work out how to handle non-fatal errors
|
@@ -10,4 +10,5 @@
|
|
10
10
|
* integrate SemanticText action
|
11
11
|
|
12
12
|
== DONE
|
13
|
+
* acquire test coverage on SiteBuilder::SiteGenerator#traverse_dir
|
13
14
|
* fix "warning: already initialized constant"
|
data/doc/demo.rdoc
CHANGED
@@ -17,50 +17,54 @@ If using sitebuilder from a gem, remember to "require 'rubygems'"...
|
|
17
17
|
demo.script(main):010:1> end
|
18
18
|
=> nil
|
19
19
|
demo.script(main):011:0>
|
20
|
-
demo.script(main):012:0*
|
21
|
-
demo.script(main):013:
|
22
|
-
demo.script(main):014:1> File.open(tmpl) do |f|
|
23
|
-
demo.script(main):015:2* f.readlines.each {|l| template += l }
|
24
|
-
demo.script(main):016:2> end
|
25
|
-
demo.script(main):017:1> content = ''
|
26
|
-
demo.script(main):018:1> File.open(src) do |c|
|
27
|
-
demo.script(main):019:2* c.readlines.each {|l| content += l }
|
28
|
-
demo.script(main):020:2> end
|
29
|
-
demo.script(main):021:1> e = ERB.new template
|
30
|
-
demo.script(main):022:1> document = Document.new(content)
|
31
|
-
demo.script(main):023:1> File.open(dst,'w') do |f|
|
32
|
-
demo.script(main):024:2* f.puts e.result(binding)
|
33
|
-
demo.script(main):025:2> end
|
34
|
-
demo.script(main):026:1> end
|
35
|
-
=> nil
|
36
|
-
demo.script(main):027:0> templatepath = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','template.rhtml')
|
37
|
-
=> "/Users/daf/macbook/workspace/sitebuilder/examples/homepage/template.rhtml"
|
38
|
-
demo.script(main):028:0> swapout = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','source')
|
20
|
+
demo.script(main):012:0* @templatepath =
|
21
|
+
demo.script(main):013:0* swapout = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','source')
|
39
22
|
=> "/Users/daf/macbook/workspace/sitebuilder/examples/homepage/source"
|
40
|
-
demo.script(main):
|
23
|
+
demo.script(main):014:0> replace = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','dest')
|
41
24
|
=> "/Users/daf/macbook/workspace/sitebuilder/examples/homepage/dest"
|
42
|
-
demo.script(main):
|
43
|
-
demo.script(main):
|
44
|
-
|
45
|
-
demo.script(main):
|
46
|
-
demo.script(main):
|
47
|
-
demo.script(main):
|
48
|
-
|
49
|
-
demo.script(main):
|
50
|
-
demo.script(main):
|
51
|
-
|
52
|
-
demo.script(main):
|
53
|
-
|
54
|
-
demo.script(main):
|
55
|
-
|
25
|
+
demo.script(main):015:0>
|
26
|
+
demo.script(main):016:0* #This is just a templating action - for real use, you'd need to process markup from "content" as well...
|
27
|
+
demo.script(main):017:0* class TemplateAction < SiteBuilder::Action
|
28
|
+
demo.script(main):018:1> def mapit(src, tmpl, dst)
|
29
|
+
demo.script(main):019:2> template = ''
|
30
|
+
demo.script(main):020:2> File.open(tmpl) do |f|
|
31
|
+
demo.script(main):021:3* f.readlines.each {|l| template += l }
|
32
|
+
demo.script(main):022:3> end
|
33
|
+
demo.script(main):023:2> content = ''
|
34
|
+
demo.script(main):024:2> File.open(src) do |c|
|
35
|
+
demo.script(main):025:3* c.readlines.each {|l| content += l }
|
36
|
+
demo.script(main):026:3> end
|
37
|
+
demo.script(main):027:2> e = ERB.new template
|
38
|
+
demo.script(main):028:2> document = Document.new(content)
|
39
|
+
demo.script(main):029:2> File.open(dst,'w') do |f|
|
40
|
+
demo.script(main):030:3* f.puts e.result(binding)
|
41
|
+
demo.script(main):031:3> end
|
42
|
+
demo.script(main):032:2> end
|
43
|
+
demo.script(main):033:1>
|
44
|
+
demo.script(main):034:1* def convert(s, r)
|
45
|
+
demo.script(main):035:2> templatepath = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','template.rhtml')
|
46
|
+
demo.script(main):036:2> mapit(s.path, templatepath, File.join(r,s.extnless+'.html'))
|
47
|
+
demo.script(main):037:2> end
|
48
|
+
demo.script(main):038:1> end
|
49
|
+
=> nil
|
56
50
|
demo.script(main):039:0>
|
57
|
-
demo.script(main):040:0* SiteBuilder::
|
58
|
-
|
59
|
-
|
60
|
-
=> #<
|
61
|
-
demo.script(main):
|
62
|
-
demo.script(main):
|
51
|
+
demo.script(main):040:0* s = SiteBuilder::SiteGenerator.new(swapout,replace)
|
52
|
+
=> #<SiteBuilder::SiteGenerator:0x63c61c @swapout="/Users/daf/macbook/workspace/sitebuilder/examples/homepage/source", @actions={}, @replace="/Users/daf/macbook/workspace/sitebuilder/examples/homepage/dest">
|
53
|
+
demo.script(main):041:0> s.add_action('.art', TemplateAction.new)
|
54
|
+
=> #<TemplateAction:0x6336e8>
|
55
|
+
demo.script(main):042:0>
|
56
|
+
demo.script(main):043:0* s.add_action('.idx', SiteBuilder::CopyAction.new)
|
57
|
+
=> #<SiteBuilder::CopyAction:0x627938>
|
58
|
+
demo.script(main):044:0> s.add_action('.png', SiteBuilder::CopyAction.new)
|
59
|
+
=> #<SiteBuilder::CopyAction:0x620994>
|
60
|
+
demo.script(main):045:0> s.add_action('.css', SiteBuilder::CopyAction.new)
|
61
|
+
=> #<SiteBuilder::CopyAction:0x618384>
|
62
|
+
demo.script(main):046:0> s.generate
|
63
|
+
cp /Users/daf/macbook/workspace/sitebuilder/examples/homepage/source/homepage.css /Users/daf/macbook/workspace/sitebuilder/examples/homepage/dest
|
64
|
+
=> #<Dir:0x615a94>
|
65
|
+
demo.script(main):047:0>
|
66
|
+
demo.script(main):048:0* demo.script(main):048:0>
|
63
67
|
|
64
68
|
|
65
|
-
Sitebuilder 0.0.
|
69
|
+
Sitebuilder 0.0.4
|
66
70
|
|
data/doc/demo.script
CHANGED
@@ -9,33 +9,39 @@ class Document
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
@templatepath =
|
13
|
+
swapout = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','source')
|
14
|
+
replace = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','dest')
|
15
|
+
|
16
|
+
#This is just a templating action - for real use, you'd need to process markup from "content" as well...
|
17
|
+
class TemplateAction < SiteBuilder::Action
|
18
|
+
def mapit(src, tmpl, dst)
|
19
|
+
template = ''
|
20
|
+
File.open(tmpl) do |f|
|
21
|
+
f.readlines.each {|l| template += l }
|
22
|
+
end
|
23
|
+
content = ''
|
24
|
+
File.open(src) do |c|
|
25
|
+
c.readlines.each {|l| content += l }
|
26
|
+
end
|
27
|
+
e = ERB.new template
|
28
|
+
document = Document.new(content)
|
29
|
+
File.open(dst,'w') do |f|
|
30
|
+
f.puts e.result(binding)
|
31
|
+
end
|
20
32
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
33
|
+
|
34
|
+
def convert(s, r)
|
35
|
+
templatepath = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','template.rhtml')
|
36
|
+
mapit(s.path, templatepath, File.join(r,s.extnless+'.html'))
|
25
37
|
end
|
26
38
|
end
|
27
|
-
templatepath = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','template.rhtml')
|
28
|
-
swapout = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','source')
|
29
|
-
replace = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','dest')
|
30
39
|
|
31
40
|
s = SiteBuilder::SiteGenerator.new(swapout,replace)
|
32
|
-
s.add_action('.art'
|
33
|
-
mapit(s.path,templatepath,File.join(r,s.extnless+'.html'))
|
34
|
-
end
|
35
|
-
|
36
|
-
s.add_action('.idx') {|s,r| `cp #{s.path} #{r}`; puts "index template #{s.path}\n\t\t #{r}"}
|
37
|
-
s.add_action('.png') {|s,r| `cp #{s.path} #{r}`; puts "png copy #{s.path}\n\t\t #{r}"}
|
38
|
-
s.add_action('.css') {|s,r| `cp #{s.path} #{r}`; puts "css copy #{s.path}\n\t\t #{r}"}
|
41
|
+
s.add_action('.art', TemplateAction.new)
|
39
42
|
|
40
|
-
SiteBuilder::
|
43
|
+
s.add_action('.idx', SiteBuilder::CopyAction.new)
|
44
|
+
s.add_action('.png', SiteBuilder::CopyAction.new)
|
45
|
+
s.add_action('.css', SiteBuilder::CopyAction.new)
|
46
|
+
s.generate
|
41
47
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module SiteBuilder
|
2
|
+
class Action
|
3
|
+
def convert(source, destination)
|
4
|
+
throw Exception.new("should implement Action#convert")
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class CopyAction < Action
|
9
|
+
def convert(source, destination)
|
10
|
+
`cp #{source.path} #{destination}`
|
11
|
+
puts "cp #{source.path} #{destination}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class NullAction < Action
|
16
|
+
def convert(source, destionation)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'sitebuilder/filesystem'
|
2
2
|
require 'sitebuilder/string'
|
3
|
+
require 'sitebuilder/actions'
|
4
|
+
require 'fileutils'
|
3
5
|
|
4
6
|
module SiteBuilder
|
5
7
|
|
@@ -9,18 +11,18 @@ module SiteBuilder
|
|
9
11
|
class SiteGenerator < Traverser
|
10
12
|
|
11
13
|
# I set up the source website directory and the destination website directory.
|
12
|
-
def initialize(source, destination)
|
14
|
+
def initialize(source, destination, default_action=NullAction.new)
|
13
15
|
@swapout = source
|
14
16
|
@replace = destination
|
15
17
|
@actions = {}
|
16
|
-
@actions.default=
|
18
|
+
@actions.default = default_action
|
17
19
|
end
|
18
20
|
|
19
21
|
# internal callback used to handle a source directory
|
20
22
|
def traverse_dir(dir_entry)
|
21
23
|
converted_path = dir_entry.path.clone
|
22
24
|
converted_path.substitute_prefix!(@swapout, @replace)
|
23
|
-
|
25
|
+
FileUtils.mkdir_p(converted_path)
|
24
26
|
end
|
25
27
|
|
26
28
|
# internal callback used to handle a source file
|
@@ -28,17 +30,17 @@ module SiteBuilder
|
|
28
30
|
if !file_entry.path.index('.svn')
|
29
31
|
converted_path = file_entry.dirname
|
30
32
|
converted_path.substitute_prefix!(@swapout, @replace) #BUG? - no clone here?
|
31
|
-
@actions[file_entry.extname].
|
33
|
+
@actions[file_entry.extname].convert(file_entry, converted_path)
|
32
34
|
end
|
33
35
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
#
|
40
|
-
def
|
41
|
-
@
|
36
|
+
|
37
|
+
def add_action(extension, action)
|
38
|
+
@actions[extension]=action
|
39
|
+
end
|
40
|
+
|
41
|
+
# Initiate site generation
|
42
|
+
def generate
|
43
|
+
DirEntry.new(@swapout).traverse(self)
|
42
44
|
end
|
43
45
|
end
|
44
46
|
|
data/test/filesystem_test.rb
CHANGED
@@ -58,6 +58,7 @@ end
|
|
58
58
|
def test_fs_entry_from
|
59
59
|
assert_equal SiteBuilder::FileEntry, SiteBuilder::FsEntry.fs_entry_from(TEST_FILEPATH).class
|
60
60
|
assert_equal SiteBuilder::DirEntry, SiteBuilder::FsEntry.fs_entry_from(TESTDATA_DIR).class
|
61
|
+
assert_equal SiteBuilder::UnknownEntry, SiteBuilder::FsEntry.fs_entry_from('/dev/null').class
|
61
62
|
end
|
62
63
|
|
63
64
|
def test_instance_fs_entry_from
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'sitebuilder/sitegenerator'
|
2
|
+
require 'sitebuilder/filesystem'
|
3
|
+
require 'sitebuilder/actions'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'test/unit'
|
6
|
+
require 'mocha'
|
7
|
+
require 'fileutils'
|
8
|
+
|
9
|
+
class SitebuilderTest< Test::Unit::TestCase
|
10
|
+
|
11
|
+
def test_traverse_file_traverses_on_matching_file_extension
|
12
|
+
mock_action = mock("an action")
|
13
|
+
fixture_file_entry = SiteBuilder::FileEntry.new('/path/to/source/foo/testfilename.test')
|
14
|
+
mock_action.expects(:convert).once().with(fixture_file_entry, '/path/to/dest/foo')
|
15
|
+
|
16
|
+
unit = SiteBuilder::SiteGenerator.new('/path/to/source','/path/to/dest')
|
17
|
+
unit.add_action('.test', mock_action)
|
18
|
+
unit.traverse_file(fixture_file_entry)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_traverse_file_doesnt_traverse_on_nonmatching_file_extension
|
22
|
+
fixture_file_entry = SiteBuilder::FileEntry.new('/path/to/source/foo/testfilename.nomatch')
|
23
|
+
mock_default_action_to_be_called = mock("default action")
|
24
|
+
mock_default_action_to_be_called.expects(:convert).once().with(fixture_file_entry, '/path/to/dest/foo')
|
25
|
+
mock_action_not_to_be_called = mock("an action")
|
26
|
+
|
27
|
+
unit = SiteBuilder::SiteGenerator.new('/path/to/source','/path/to/dest', mock_default_action_to_be_called)
|
28
|
+
|
29
|
+
unit.add_action('.test', mock_action_not_to_be_called)
|
30
|
+
unit.traverse_file(fixture_file_entry)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_traverse_dir_creates_corresponding_directory
|
34
|
+
FileUtils.expects(:mkdir_p).once().with('/path/to/dest/foo')
|
35
|
+
fixture_dir_entry = SiteBuilder::DirEntry.new('/path/to/source/foo')
|
36
|
+
unit = SiteBuilder::SiteGenerator.new('/path/to/source','/path/to/dest')
|
37
|
+
unit.traverse_dir(fixture_dir_entry)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_generate_initiates_sitebuilder_conversion
|
41
|
+
unit = SiteBuilder::SiteGenerator.new('/path/to/source','/path/to/dest')
|
42
|
+
mock_dir_entry = mock("a mock DirEntry")
|
43
|
+
mock_dir_entry.expects(:traverse).once().with(unit)
|
44
|
+
SiteBuilder::DirEntry.expects(:new).once().with('/path/to/source').returns(mock_dir_entry)
|
45
|
+
|
46
|
+
unit.generate
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sitebuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dafydd Rees
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-28 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,6 +32,16 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 0.9.8
|
34
34
|
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rcov
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.9.6
|
44
|
+
version:
|
35
45
|
description: Static website generator using rule-based translation.
|
36
46
|
email: os@greenbarsoft.co.uk
|
37
47
|
executables: []
|
@@ -45,8 +55,8 @@ extra_rdoc_files:
|
|
45
55
|
- doc/demo.rdoc
|
46
56
|
- TODO.rdoc
|
47
57
|
files:
|
48
|
-
- doc/complex.script
|
49
58
|
- doc/demo.script
|
59
|
+
- lib/sitebuilder/actions.rb
|
50
60
|
- lib/sitebuilder/array.rb
|
51
61
|
- lib/sitebuilder/filesystem.rb
|
52
62
|
- lib/sitebuilder/sitegenerator.rb
|
@@ -55,6 +65,7 @@ files:
|
|
55
65
|
- test/array_test.rb
|
56
66
|
- test/data/testfile.txt
|
57
67
|
- test/filesystem_test.rb
|
68
|
+
- test/sitegenerator_test.rb
|
58
69
|
- test/string_test.rb
|
59
70
|
- CHANGELOG.rdoc
|
60
71
|
- COPYING
|
@@ -92,4 +103,5 @@ summary: Static site generator
|
|
92
103
|
test_files:
|
93
104
|
- ./test/array_test.rb
|
94
105
|
- ./test/filesystem_test.rb
|
106
|
+
- ./test/sitegenerator_test.rb
|
95
107
|
- ./test/string_test.rb
|
data/doc/complex.script
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'sitebuilder'
|
2
|
-
require 'rubygems'
|
3
|
-
require 'semantictext'
|
4
|
-
require 'erb'
|
5
|
-
|
6
|
-
class Document
|
7
|
-
attr_reader :content
|
8
|
-
def initialize(c)
|
9
|
-
@content=c
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def mapit(src, tmpl, dst)
|
14
|
-
template = ''
|
15
|
-
File.open(tmpl) do |f|
|
16
|
-
f.readlines.each {|l| template += l }
|
17
|
-
end
|
18
|
-
content = ''
|
19
|
-
File.open(src) do |c|
|
20
|
-
c.readlines.each {|l| content += l }
|
21
|
-
end
|
22
|
-
e = ERB.new template
|
23
|
-
document = Document.new(content)
|
24
|
-
File.open(dst,'w') do |f|
|
25
|
-
f.puts e.result(binding)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
templatepath = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','template.rhtml')
|
29
|
-
swapout = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','source')
|
30
|
-
replace = File.join(ENV['SANDBOX'],'sitebuilder','examples','homepage','dest')
|
31
|
-
|
32
|
-
s = SiteBuilder::SiteGenerator.new(swapout,replace)
|
33
|
-
s.add_action('.art') do |s,r|
|
34
|
-
mapit(s.path,templatepath,File.join(r,s.extnless+'.html'))
|
35
|
-
end
|
36
|
-
|
37
|
-
s.add_action('.idx') {|s,r| `cp #{s.path} #{r}`; puts "index template #{s.path}\n\t\t #{r}"}
|
38
|
-
s.add_action('.png') {|s,r| `cp #{s.path} #{r}`; puts "png copy #{s.path}\n\t\t #{r}"}
|
39
|
-
s.add_action('.css') {|s,r| `cp #{s.path} #{r}`; puts "css copy #{s.path}\n\t\t #{r}"}
|
40
|
-
|
41
|
-
SiteBuilder::DirEntry.new(swapout).traverse(s)
|
42
|
-
|