epubforge 0.0.5
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/Gemfile +26 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +26 -0
- data/Rakefile +71 -0
- data/VERSION +1 -0
- data/bin/epubforge +10 -0
- data/config/actions/book_to_epub.rb +20 -0
- data/config/actions/generate.rb +24 -0
- data/config/actions/generate_chapter.rb +26 -0
- data/config/actions/git_backup.rb +23 -0
- data/config/actions/gitify.rb +72 -0
- data/config/actions/globals.rb +77 -0
- data/config/actions/help.rb +21 -0
- data/config/actions/init.rb +137 -0
- data/config/actions/kindle.rb +68 -0
- data/config/actions/notes_to_epub.rb +20 -0
- data/config/actions/notes_to_kindle.rb +17 -0
- data/config/actions/word_count.rb +126 -0
- data/config/actions/wrap_scene_notes_in_hidden_div.rb +118 -0
- data/config/htmlizers.rb +62 -0
- data/lib/action/actions_lookup.rb +41 -0
- data/lib/action/cli_command.rb +72 -0
- data/lib/action/cli_sequence.rb +55 -0
- data/lib/action/file_transformer.rb +59 -0
- data/lib/action/run_description.rb +24 -0
- data/lib/action/runner.rb +122 -0
- data/lib/action/thor_action.rb +149 -0
- data/lib/core_extensions/array.rb +5 -0
- data/lib/core_extensions/kernel.rb +42 -0
- data/lib/core_extensions/nil_class.rb +5 -0
- data/lib/core_extensions/object.rb +5 -0
- data/lib/core_extensions/string.rb +37 -0
- data/lib/custom_helpers.rb +60 -0
- data/lib/epub/assets/asset.rb +11 -0
- data/lib/epub/assets/html.rb +8 -0
- data/lib/epub/assets/image.rb +18 -0
- data/lib/epub/assets/markdown.rb +8 -0
- data/lib/epub/assets/page.rb +32 -0
- data/lib/epub/assets/stylesheet.rb +22 -0
- data/lib/epub/assets/textile.rb +8 -0
- data/lib/epub/builder.rb +270 -0
- data/lib/epub/packager.rb +16 -0
- data/lib/epubforge.rb +97 -0
- data/lib/errors.rb +8 -0
- data/lib/project/project.rb +65 -0
- data/lib/utils/action_loader.rb +7 -0
- data/lib/utils/class_loader.rb +83 -0
- data/lib/utils/directory_builder.rb +181 -0
- data/lib/utils/downloader.rb +58 -0
- data/lib/utils/file_orderer.rb +45 -0
- data/lib/utils/file_path.rb +152 -0
- data/lib/utils/html_translator.rb +99 -0
- data/lib/utils/html_translator_queue.rb +70 -0
- data/lib/utils/htmlizer.rb +92 -0
- data/lib/utils/misc.rb +20 -0
- data/lib/utils/root_path.rb +20 -0
- data/lib/utils/settings.rb +146 -0
- data/lib/utils/template_evaluator.rb +20 -0
- data/templates/default/book/afterword.markdown.template +4 -0
- data/templates/default/book/chapter-%i%.markdown.sequence +4 -0
- data/templates/default/book/foreword.markdown.template +6 -0
- data/templates/default/book/images/cover.png +0 -0
- data/templates/default/book/stylesheets/stylesheet.css.template +2 -0
- data/templates/default/book/title_page.markdown.template +4 -0
- data/templates/default/notes/character.named.markdown.template +4 -0
- data/templates/default/notes/stylesheets/stylesheet.css.template +2 -0
- data/templates/default/payload.rb +65 -0
- data/templates/default/settings/actions/local_action.rb.example +14 -0
- data/templates/default/settings/config.rb.form +55 -0
- data/templates/default/settings/htmlizers.rb +0 -0
- data/templates/default/settings/wordcount.template +6 -0
- data/test/helper.rb +22 -0
- data/test/misc/config.rb +7 -0
- data/test/sample_text/sample.markdown +30 -0
- data/test/sample_text/sample.textile +24 -0
- data/test/test_custom_helpers.rb +22 -0
- data/test/test_directory_builder.rb +141 -0
- data/test/test_epf_root.rb +9 -0
- data/test/test_epubforge.rb +164 -0
- data/test/test_htmlizers.rb +24 -0
- data/test/test_runner.rb +15 -0
- data/test/test_utils.rb +39 -0
- metadata +328 -0
data/lib/utils/misc.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module EpubForge
|
2
|
+
module Utils
|
3
|
+
class Misc
|
4
|
+
# stolen from Rails constantize method, via StackOverflow
|
5
|
+
# http://stackoverflow.com/questions/3314475/how-do-i-get-class-object-from-string-abc-in-ruby
|
6
|
+
def self.constantize( str )
|
7
|
+
names = str.split('::')
|
8
|
+
names.shift if names.empty? || names.first.empty?
|
9
|
+
|
10
|
+
constant = Object
|
11
|
+
|
12
|
+
names.each do |name|
|
13
|
+
constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
constant
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EpubForge
|
2
|
+
module Utils
|
3
|
+
module RootPath
|
4
|
+
def root( *args )
|
5
|
+
if args.length > 0
|
6
|
+
args.unshift( @root_path )
|
7
|
+
FilePath.new( *args )
|
8
|
+
else
|
9
|
+
FilePath.new( @root_path )
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def set_root_path( path )
|
14
|
+
@root_path = FilePath.new( path )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
EpubForge.extend EpubForge::Utils::RootPath
|
@@ -0,0 +1,146 @@
|
|
1
|
+
# have to make a tweak to configurator to allow it to work with project class instances
|
2
|
+
module Configurator
|
3
|
+
def self.extended(base)
|
4
|
+
if base.respond_to?(:class_eval)
|
5
|
+
base.class_eval { remove_instance_variable(:@configuration) if defined? @configuration }
|
6
|
+
else
|
7
|
+
puts "EXTENDING #{base} AS WE SPEAK"
|
8
|
+
base.instance_variable_set( :@got_extended, true )
|
9
|
+
# base.instance_variable_set( :@configuration, nil )
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module EpubForge
|
15
|
+
module Utils
|
16
|
+
class Settings
|
17
|
+
def self.thing_to_configure( *args )
|
18
|
+
if( args.length >= 1 )
|
19
|
+
@thing_to_configure = args.first
|
20
|
+
end
|
21
|
+
@thing_to_configure
|
22
|
+
end
|
23
|
+
|
24
|
+
# Takes a configurator object and (optionally) a settings file to write it out to.
|
25
|
+
def initialize( configable, file = nil )
|
26
|
+
@configable = configable
|
27
|
+
@file = file.fwf_filepath.expand if file
|
28
|
+
install_configuration
|
29
|
+
end
|
30
|
+
|
31
|
+
def act_on_string( keqv, set = :set )
|
32
|
+
k,v = parse_kv( keqv )
|
33
|
+
if set == :unset
|
34
|
+
unset( k )
|
35
|
+
elsif set == :set
|
36
|
+
set( k, v )
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def set( key, val )
|
41
|
+
setting, last_key = descend_key( key )
|
42
|
+
setting[last_key] = val
|
43
|
+
end
|
44
|
+
|
45
|
+
def unset( key )
|
46
|
+
setting, last_key = descend_key( key )
|
47
|
+
setting.delete( last_key )
|
48
|
+
end
|
49
|
+
|
50
|
+
def write_settings_file( settings_file = nil )
|
51
|
+
settings_file ||= @file
|
52
|
+
settings_file = settings_file.fwf_filepath
|
53
|
+
@depth = 0
|
54
|
+
str = indented_line("EpubForge::Utils::Settings.thing_to_configure.config do")
|
55
|
+
str += write_config( @configable.config.to_hash )
|
56
|
+
str += indented_line("end")
|
57
|
+
settings_file.write( str )
|
58
|
+
end
|
59
|
+
|
60
|
+
protected
|
61
|
+
def install_configuration
|
62
|
+
self.class.thing_to_configure( @configable )
|
63
|
+
self.class.thing_to_configure.extend( Configurator )
|
64
|
+
require @file
|
65
|
+
self.class.thing_to_configure( nil )
|
66
|
+
end
|
67
|
+
|
68
|
+
def indented_line( str )
|
69
|
+
puts " " * @depth + str + "\n"
|
70
|
+
" " * @depth + str + "\n"
|
71
|
+
end
|
72
|
+
|
73
|
+
def write_config( h )
|
74
|
+
str = ""
|
75
|
+
@depth += 2
|
76
|
+
for k, v in h
|
77
|
+
if v.is_a?(Hash)
|
78
|
+
str += indented_line( "#{k} do" )
|
79
|
+
str += write_config( v )
|
80
|
+
str += indented_line( "end" )
|
81
|
+
else
|
82
|
+
str += indented_line( "#{k} #{stringify_value( v )}" )
|
83
|
+
end
|
84
|
+
end
|
85
|
+
@depth -= 2
|
86
|
+
|
87
|
+
str
|
88
|
+
end
|
89
|
+
|
90
|
+
def stringify_value( v )
|
91
|
+
case v
|
92
|
+
when Regexp
|
93
|
+
"/#{v.source}/"
|
94
|
+
when Numeric
|
95
|
+
"#{v}"
|
96
|
+
when String
|
97
|
+
escape_string( v )
|
98
|
+
when FunWith::Files::FilePath
|
99
|
+
escape_string( v ) + ".fwf_filepath"
|
100
|
+
when Array # TODO: Is there a way to enter arrays?
|
101
|
+
"[ #{ v.map{ |item| stringify_value(item) }.join(', ') } ]"
|
102
|
+
when NilClass
|
103
|
+
"nil"
|
104
|
+
when TrueClass
|
105
|
+
"true"
|
106
|
+
when FalseClass
|
107
|
+
"false"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def escape_string( s )
|
112
|
+
s.inspect
|
113
|
+
end
|
114
|
+
|
115
|
+
# If given a hierarchical setting key like git:host:url,
|
116
|
+
# returns the hash attached to config[:git][:host], so the caller can say
|
117
|
+
# rval[:url] = "bannedsorcery.com". Creates empty hashes as it descends,
|
118
|
+
# if neccessary.
|
119
|
+
def descend_key( k )
|
120
|
+
keychain = k.split(":").map{ |key| :"#{key}" }
|
121
|
+
|
122
|
+
s = @configable.config
|
123
|
+
|
124
|
+
for key in keychain[0..-2]
|
125
|
+
s[key] ||= {}
|
126
|
+
s = s[key]
|
127
|
+
end
|
128
|
+
|
129
|
+
[s, keychain.last]
|
130
|
+
end
|
131
|
+
|
132
|
+
def parse_kv( str )
|
133
|
+
if m = str.match( /^([a-z0-9_:]+)=(.*)$/ )
|
134
|
+
discard, k, v = m.to_a
|
135
|
+
elsif m = str.match( /^([a-z0-9_:]+)$/ )
|
136
|
+
discard, k = m.to_a
|
137
|
+
v = nil
|
138
|
+
else
|
139
|
+
k = v = nil
|
140
|
+
end
|
141
|
+
|
142
|
+
[k, v]
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EpubForge
|
2
|
+
module Utils
|
3
|
+
class TemplateEvaluator
|
4
|
+
attr_reader :content, :vars, :result
|
5
|
+
def initialize( content, vars = {} )
|
6
|
+
if content.is_a?(Pathname) && content.file?
|
7
|
+
@content = @content.read
|
8
|
+
else
|
9
|
+
@content = content.to_s
|
10
|
+
end
|
11
|
+
|
12
|
+
@vars = vars
|
13
|
+
|
14
|
+
@result = with_locals(@vars) do
|
15
|
+
ERB.new( @content ).result( binding )
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
Binary file
|
@@ -0,0 +1,65 @@
|
|
1
|
+
dir '/'
|
2
|
+
dir 'book'
|
3
|
+
template 'title_page.markdown'
|
4
|
+
template 'foreword.markdown'
|
5
|
+
template 'afterword.markdown'
|
6
|
+
sequence 'scene-{04i}.markdown'
|
7
|
+
dir 'images'
|
8
|
+
file 'cover.png'
|
9
|
+
dir 'stylesheets'
|
10
|
+
template 'stylesheet.css'
|
11
|
+
dir 'notes'
|
12
|
+
sequence 'character.{name}.markdown'
|
13
|
+
dir 'settings'
|
14
|
+
template 'config'
|
15
|
+
file 'htmlizers.rb'
|
16
|
+
template 'wordcount'
|
17
|
+
dir 'actions'
|
18
|
+
file 'local_action.rb.example'
|
19
|
+
|
20
|
+
|
21
|
+
class Munition
|
22
|
+
end
|
23
|
+
|
24
|
+
class FileSequence < Munition
|
25
|
+
end
|
26
|
+
|
27
|
+
class DirectorySequence < Munition
|
28
|
+
end
|
29
|
+
|
30
|
+
class TemplateFile < Munition
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
class Payload
|
36
|
+
def initialize( src, &block )
|
37
|
+
@munitions = []
|
38
|
+
yield self if block_given?
|
39
|
+
end
|
40
|
+
|
41
|
+
def dir( name, &block )
|
42
|
+
|
43
|
+
yield if block_given?
|
44
|
+
end
|
45
|
+
|
46
|
+
def root( dir = nil )
|
47
|
+
@root = dir.fwf_filepath if dir
|
48
|
+
@root
|
49
|
+
end
|
50
|
+
|
51
|
+
def sequence( name, count )
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
def deploy( dst )
|
56
|
+
@munitions.each do |munition|
|
57
|
+
munition.deploy( dst )
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
Template::Payload.new do |t|
|
63
|
+
dir.template
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module EpubForge
|
2
|
+
module Action
|
3
|
+
class ActionFromProjectActionsDirectory < ThorAction
|
4
|
+
description "Use this file in the actions/ folder as a template for your custom actions."
|
5
|
+
keywords :project_action
|
6
|
+
usage "#{$PROGRAM_NAME} project_action"
|
7
|
+
|
8
|
+
|
9
|
+
def do( project, *args )
|
10
|
+
puts "Do something to your project."
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# Used by epubforge.
|
2
|
+
FunWith::Configurations::Config.new do
|
3
|
+
metadata do
|
4
|
+
name "<%= config[:title] || "My Book" %>" # The title of the book
|
5
|
+
author "<%= config[:author] || "Author" %>" # Your moniker. Your Nom de Plume. The thing people say to get your attention.
|
6
|
+
license "<%= config[:license] || "All Rights Reserved" %>"
|
7
|
+
publisher "<%= config[:publisher] || 'My Publisher' %>"
|
8
|
+
original_publication "<%= config[:original_publication] || Time.now.strftime('%Y-%m-%d') %>" # The year this work was first published
|
9
|
+
end
|
10
|
+
|
11
|
+
filename "<%= config[:title].epf_underscorize %>" # The default filename for your ebook (no extension).
|
12
|
+
|
13
|
+
|
14
|
+
<% if config[:git] -%>
|
15
|
+
############### GOT GIT? #####################################
|
16
|
+
git do
|
17
|
+
repo_folder "<%= config[:git][:repo] %>"
|
18
|
+
remote_host "<%= config[:git][:host] %>"
|
19
|
+
remote_user "<%= config[:git][:user] %>"
|
20
|
+
repo_id "<%= config[:git][:repo_id] %>"
|
21
|
+
end
|
22
|
+
############### /GOT GIT? #####################################
|
23
|
+
<% end -%>
|
24
|
+
|
25
|
+
|
26
|
+
# Any pages not listed here will be added
|
27
|
+
# to the ebook after the listed pages, in alphabetical order of
|
28
|
+
# filename. In this example, the title_page.markdown file goes first,
|
29
|
+
# then the foreword.markdown page, then chapters 1 and 2 (in alphanumeric order)
|
30
|
+
# and finally the afterword. Any pages not matched will be put after the
|
31
|
+
# set of matched pages.
|
32
|
+
|
33
|
+
pages do
|
34
|
+
book [
|
35
|
+
# matches title_page.markdown, title_page.textile, or
|
36
|
+
# title_page.(any other valid extension). This will be the first
|
37
|
+
# scene/chapter/division in the book.
|
38
|
+
"title_page",
|
39
|
+
"foreword",
|
40
|
+
|
41
|
+
# filename matches chapter, followed by anything. If you have a page called
|
42
|
+
# chapter_summary that comes after, you might want to define the matcher more
|
43
|
+
# specifically, for example 'chapter-\d+' (chapter followed by dash followed by any number of numbers).
|
44
|
+
#
|
45
|
+
"chapter-*",
|
46
|
+
"afterword"
|
47
|
+
]
|
48
|
+
|
49
|
+
notes [
|
50
|
+
# You can set the order that the notes entries appear in below.
|
51
|
+
"example89823786",
|
52
|
+
"example89723987"
|
53
|
+
]
|
54
|
+
end
|
55
|
+
end
|
File without changes
|
data/test/helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'shoulda'
|
4
|
+
require 'stringio'
|
5
|
+
require 'thor'
|
6
|
+
|
7
|
+
begin
|
8
|
+
Bundler.setup(:default, :development)
|
9
|
+
rescue Bundler::BundlerError => e
|
10
|
+
$stderr.puts e.message
|
11
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
12
|
+
exit e.status_code
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'test/unit'
|
16
|
+
|
17
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
18
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
19
|
+
require 'epubforge'
|
20
|
+
|
21
|
+
class Test::Unit::TestCase
|
22
|
+
end
|
data/test/misc/config.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
This is a header
|
2
|
+
================
|
3
|
+
|
4
|
+
This is a paragraph.
|
5
|
+
|
6
|
+
* This
|
7
|
+
* is
|
8
|
+
* an
|
9
|
+
* unordered
|
10
|
+
* list
|
11
|
+
|
12
|
+
hello
|
13
|
+
|
14
|
+
1. This
|
15
|
+
2. is
|
16
|
+
3. an
|
17
|
+
3. ordered
|
18
|
+
3. list
|
19
|
+
|
20
|
+
hello
|
21
|
+
|
22
|
+
1. This
|
23
|
+
1. is
|
24
|
+
1. a sublist
|
25
|
+
2. Next item
|
26
|
+
1. in
|
27
|
+
2. outer
|
28
|
+
3. list
|
29
|
+
|
30
|
+
[This is a link](http://slashdot.org)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
h1. This is a header
|
2
|
+
|
3
|
+
This is a paragraph.
|
4
|
+
|
5
|
+
p. This is also a paragraph.
|
6
|
+
|
7
|
+
p. _nicely italicized_, @carefully coded@, and *boldly bolded* text.
|
8
|
+
|
9
|
+
p(ex). This paragraph has a classname.
|
10
|
+
|
11
|
+
<pre>
|
12
|
+
class A
|
13
|
+
def bit( _of )
|
14
|
+
Ruby.code( for, you )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
</pre>
|
18
|
+
|
19
|
+
# a list
|
20
|
+
## with a sublist
|
21
|
+
## another item
|
22
|
+
|
23
|
+
"A link":http://google.com
|
24
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestCustomHelpers < Test::Unit::TestCase #
|
4
|
+
context "Testing collect_stdout" do
|
5
|
+
should "not print out" do
|
6
|
+
outer = ""
|
7
|
+
inner = ""
|
8
|
+
|
9
|
+
outer = EpubForge.collect_stdout do
|
10
|
+
puts "Hello"
|
11
|
+
inner = EpubForge.collect_stdout do
|
12
|
+
puts "Well this is awkward"
|
13
|
+
end
|
14
|
+
puts "world!"
|
15
|
+
end
|
16
|
+
|
17
|
+
assert_equal "Hello\nworld!\n", outer, "collect_stdout not working properly"
|
18
|
+
assert_equal "Well this is awkward\n", inner, "collect_stdout not working properly"
|
19
|
+
puts "============= STDOUT printing again =============="
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
DirBuilder = EpubForge::Utils::DirectoryBuilder
|
4
|
+
|
5
|
+
class TestDirectoryBuilder < Test::Unit::TestCase
|
6
|
+
context "tearing my hair out because shoulda seems borked" do
|
7
|
+
should "stop blaming shoulda for my problems" do
|
8
|
+
assert true
|
9
|
+
end
|
10
|
+
|
11
|
+
should "realize that assert statements need to be inside should blocks" do
|
12
|
+
assert "Okay, okay. I get it. Now lay off me."
|
13
|
+
end
|
14
|
+
|
15
|
+
should "figure out why the hell [].is_a?(Array) returns false" do
|
16
|
+
assert_kind_of Array, []
|
17
|
+
assert [].is_a?(Array)
|
18
|
+
# seems fine here.
|
19
|
+
# subclassing Array for use in the EpubForge module seems
|
20
|
+
# to be the culprit. Guess I'm not doing that.
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "In a temporary directory" do
|
25
|
+
should "create a temporary directory" do
|
26
|
+
DirBuilder.tmpdir do |b|
|
27
|
+
assert_equal DirBuilder, b.class #
|
28
|
+
assert b.current_path.exist?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
should "write data to a new file" do
|
33
|
+
DirBuilder.tmpdir do |b|
|
34
|
+
assert_equal DirBuilder, b.class # Okay, WTF does this test fail?
|
35
|
+
assert b.current_path
|
36
|
+
assert b.current_path.exist?
|
37
|
+
b.file("widdershins.txt") do |f|
|
38
|
+
f << "Hello World"
|
39
|
+
f.flush
|
40
|
+
|
41
|
+
assert b.current_file.exist?
|
42
|
+
assert_equal 11, b.current_file.size
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
should "copy files from elsewhere into the directory" do
|
48
|
+
DirBuilder.tmpdir do |b|
|
49
|
+
assert_equal DirBuilder, b.class
|
50
|
+
src = EpubForge.root.join("Gemfile")
|
51
|
+
assert src.exist?
|
52
|
+
|
53
|
+
b.copy( EpubForge.root.join("Gemfile") )
|
54
|
+
|
55
|
+
gemfile = b.current_path.join("Gemfile")
|
56
|
+
assert gemfile.exist?
|
57
|
+
assert !gemfile.zero?
|
58
|
+
assert_equal 1, gemfile.grep( /jeweler/ ).length
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
should "copy files from elsewhere, renaming the file in the destination" do
|
63
|
+
DirBuilder.tmpdir do |b|
|
64
|
+
assert_equal DirBuilder, b.class
|
65
|
+
assert !b.current_path.join("helpers.rb").exist?
|
66
|
+
b.copy( EpubForge.root.join("lib", "custom_helpers.rb"), "helpers.rb" )
|
67
|
+
assert b.current_path.join("helpers.rb").exist?
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
should "download random crap from all over the Internet" do
|
72
|
+
DirBuilder.tmpdir do |b|
|
73
|
+
gist_url = "http://bannedsorcery.com/downloads/testfile.txt"
|
74
|
+
gist_text = "This is a file\n==============\n\n**silent**: But _bold_! [Link](http://slashdot.org)\n"
|
75
|
+
b.download( gist_url, "gist.txt" )
|
76
|
+
|
77
|
+
b.file( "gist.txt.2" ) do
|
78
|
+
b.download( gist_url )
|
79
|
+
end
|
80
|
+
|
81
|
+
assert b.current_file.nil?
|
82
|
+
assert b.current_path.join("gist.txt").exist?
|
83
|
+
assert b.current_path.join("gist.txt.2").exist?
|
84
|
+
assert_equal gist_text, b.current_path.join("gist.txt").read
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
should "exercise all manner of features to create a complex directory" do
|
89
|
+
DirBuilder.tmpdir do |b|
|
90
|
+
assert_equal DirBuilder, b.class
|
91
|
+
root = EpubForge.root
|
92
|
+
gemfile = root.join("Gemfile")
|
93
|
+
b.copy( gemfile )
|
94
|
+
assert gemfile.exist?
|
95
|
+
assert_equal gemfile.size, b.current_path.join("Gemfile").size
|
96
|
+
|
97
|
+
b.dir( "earth" ) do
|
98
|
+
b.dir( "air") do
|
99
|
+
b.dir( "fire" ) do
|
100
|
+
b.dir( "water" ) do
|
101
|
+
b.file( "hello.txt" )
|
102
|
+
b.file << "H"
|
103
|
+
b.file << "e"
|
104
|
+
b.file << "l"
|
105
|
+
b.file << "l"
|
106
|
+
b.file << "o"
|
107
|
+
end
|
108
|
+
|
109
|
+
assert b.current_file.nil?
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
assert "Hello", b.current_path.join("earth", "air", "fire", "water", "hello.txt").read
|
115
|
+
|
116
|
+
b.dir( "fire", "water", "earth", "air" ) do
|
117
|
+
assert b.current_path.exist?
|
118
|
+
b.copy( EpubForge.root.join("Gemfile"), "Gemfile.example" )
|
119
|
+
b.copy( EpubForge.root.join("Gemfile.lock"), "Gemfile.lock.example" )
|
120
|
+
b.copy( EpubForge.root.join("Rakefile"), "Rakefile" )
|
121
|
+
|
122
|
+
for file in %W(Gemfile.example Gemfile.lock.example Rakefile)
|
123
|
+
assert b.current_path.join(file).exist?, "#{file} should exist"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
directory = ["air", "earth", "water", "fire"]
|
128
|
+
b.dir( *directory ) do
|
129
|
+
b.file( "slipstream.txt", "file contents" )
|
130
|
+
end
|
131
|
+
|
132
|
+
assert b.current_path.join(*directory).exist?
|
133
|
+
slip = b.current_path.join(*directory).join("slipstream.txt")
|
134
|
+
assert slip.exist?
|
135
|
+
assert_equal false, slip.empty?
|
136
|
+
assert_equal "file contents", b.current_path.join(*directory).join( "slipstream.txt" ).read
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestDirectoryBuilder < Test::Unit::TestCase
|
4
|
+
context "testing absolute basics" do
|
5
|
+
should "provide an accurate root" do
|
6
|
+
assert_equal File.expand_path( File.join( File.dirname(__FILE__), ".." ) ), EpubForge.root.to_s
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|