texas 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/bin/texas +1 -1
- data/lib/texas.rb +13 -2
- data/lib/texas/build.rb +32 -0
- data/lib/texas/build/base.rb +47 -24
- data/lib/texas/build/config.rb +118 -0
- data/lib/texas/build/config_loader.rb +93 -0
- data/lib/texas/build/dry.rb +1 -1
- data/lib/texas/build/final.rb +2 -2
- data/lib/texas/build/task/add_default_templates_to_build_path.rb +4 -0
- data/lib/texas/build/task/base.rb +2 -0
- data/lib/texas/build/task/copy_contents_to_build_path.rb +3 -0
- data/lib/texas/build/task/execute_after_scripts.rb +18 -0
- data/lib/texas/build/task/execute_before_scripts.rb +18 -0
- data/lib/texas/build/task/open_pdf.rb +7 -21
- data/lib/texas/build/task/publish_pdf.rb +35 -27
- data/lib/texas/build/task/run_master_template.rb +2 -0
- data/lib/texas/build/task/script.rb +28 -0
- data/lib/texas/core_ext.rb +2 -1
- data/lib/texas/core_ext/hash.rb +34 -0
- data/lib/texas/core_ext/string.rb +1 -128
- data/lib/texas/option_parser.rb +153 -124
- data/lib/texas/output_helper.rb +58 -0
- data/lib/texas/runner.rb +32 -51
- data/lib/texas/task/base.rb +1 -0
- data/lib/texas/task/new_project.rb +1 -1
- data/lib/texas/task/watch.rb +29 -18
- data/lib/texas/template.rb +6 -2
- data/lib/texas/template/helper/base.rb +60 -9
- data/lib/texas/template/helper/tex.rb +2 -4
- data/lib/texas/template/runner.rb +2 -5
- data/lib/texas/template/runner/base.rb +59 -11
- data/lib/texas/template/runner/md.rb +2 -2
- data/lib/texas/template/runner/tex.rb +2 -2
- data/lib/texas/template/template_error.rb +19 -5
- data/lib/texas/version.rb +1 -1
- data/spec/fixtures/basic-tex/contents/{unused_template.tex.erb → sub_dir/unused_template.tex.erb} +0 -0
- data/spec/fixtures/new-project/lib/init.rb +1 -1
- data/spec/fixtures/pdflatex-error/contents/contents.tex.erb +1 -0
- data/spec/spec_helper.rb +16 -7
- data/spec/texas/build/base_spec.rb +53 -9
- data/spec/texas/build/config_spec.rb +73 -0
- data/spec/texas/build/task/base_spec.rb +21 -0
- data/spec/texas/option_parser_spec.rb +53 -0
- data/spec/texas/task/base_spec.rb +49 -0
- data/spec/texas_spec.rb +49 -3
- metadata +76 -73
- data/lib/texas/build/task/run_before_scripts.rb +0 -22
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZTExNmYwNjAzZGVhYmE0ZTMwMzkzNTc3NDY5ODQzMWM1ZjUyNWU4NQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YWVlNmFkNDhkNTI0YWQ5Yzg0ZTk2YTc3YTU4NWQ2ZmQ3NDFmYjkzYg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZjQxNGM0N2ExZTQxOTU2MTI2OWFlZjQxZmZiYmQ0NmJlYzA1NWUwMGY3ODc1
|
10
|
+
ZmU3YTg5ODk5NzA1NWI2MWZiNTM3NTIxMTQ1NjYxMjM5NzdhNmJhMDJiMGYz
|
11
|
+
MmJiODQ3ZTczN2UyZjcyMDYyZDk0YTAwZGMwOWQ1NTZmNjIzNjU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NGJmYzJiY2ZlYzE3ZWYxYWY3ZTEyNDAxNzY3NWIwMzc5Y2MzNTdmNzMyNjc3
|
14
|
+
NjZhM2ViZjdiODJmOWFmOGIzM2VkNDc4M2FjOWYwNDU2YmQ1YjhiODYyOTJh
|
15
|
+
ODE1MTM5MWE2OTAxNTU0Yjc4YmM0ZTcxNzgwODQ0Yzc4YWQ1NjI=
|
data/bin/texas
CHANGED
data/lib/texas.rb
CHANGED
@@ -1,7 +1,17 @@
|
|
1
1
|
module Texas
|
2
2
|
class << self
|
3
|
-
|
4
|
-
|
3
|
+
# Returns the name of the template sub directory
|
4
|
+
# defaults to "contents"
|
5
|
+
attr_accessor :contents_subdir_name
|
6
|
+
|
7
|
+
# Points to the directory where Texas is located
|
8
|
+
attr_accessor :texas_dir
|
9
|
+
|
10
|
+
# Returns true if Texas is run in verbose mode
|
11
|
+
attr_accessor :verbose
|
12
|
+
|
13
|
+
# Returns true if warnings are enabled
|
14
|
+
attr_accessor :warnings
|
5
15
|
end
|
6
16
|
end
|
7
17
|
Texas.texas_dir = File.join(File.dirname(__FILE__), '..')
|
@@ -9,6 +19,7 @@ Texas.contents_subdir_name = "contents"
|
|
9
19
|
|
10
20
|
require 'pp'
|
11
21
|
|
22
|
+
require_relative 'texas/output_helper'
|
12
23
|
require_relative 'texas/option_parser'
|
13
24
|
require_relative 'texas/build'
|
14
25
|
require_relative 'texas/core_ext'
|
data/lib/texas/build.rb
CHANGED
@@ -1,13 +1,45 @@
|
|
1
1
|
module Texas
|
2
2
|
module Build
|
3
|
+
class << self
|
4
|
+
include Texas::OutputHelper
|
5
|
+
|
6
|
+
# Display the error message that caused the exception.
|
7
|
+
#
|
8
|
+
def display_error_message(build, ex)
|
9
|
+
trace TraceInfo.new(:error, "#{build.options.task} aborted!", :red)
|
10
|
+
trace "\n" + ex.message
|
11
|
+
if build.options.backtrace
|
12
|
+
trace ex.backtrace
|
13
|
+
else
|
14
|
+
trace "(See full trace with --backtrace)"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Run the given build object. If any errors occur, display them in a
|
19
|
+
# formatted way and call the optional block, if present.
|
20
|
+
#
|
21
|
+
def run_with_nice_errors(build, &block)
|
22
|
+
build.run
|
23
|
+
rescue Interrupt => ex
|
24
|
+
trace "\n"
|
25
|
+
trace TraceInfo.new("interrupt", "#{build.options.task} interrupted!", :yellow)
|
26
|
+
exit 0
|
27
|
+
rescue StandardError => ex
|
28
|
+
display_error_message(build, ex)
|
29
|
+
block.() if block
|
30
|
+
end
|
31
|
+
end
|
3
32
|
end
|
4
33
|
end
|
5
34
|
|
35
|
+
require_relative 'build/config'
|
36
|
+
require_relative 'build/config_loader'
|
6
37
|
require_relative 'build/base'
|
7
38
|
require_relative 'build/dry'
|
8
39
|
require_relative 'build/final'
|
9
40
|
|
10
41
|
require_relative 'build/task/base'
|
42
|
+
require_relative 'build/task/script'
|
11
43
|
|
12
44
|
all_rbs = Dir[ File.join( File.dirname(__FILE__), "build", "task", "*.rb" ) ]
|
13
45
|
all_rbs.each do |t|
|
data/lib/texas/build/base.rb
CHANGED
@@ -3,12 +3,29 @@ require 'yaml'
|
|
3
3
|
module Texas
|
4
4
|
module Build
|
5
5
|
class Base
|
6
|
+
include Texas::OutputHelper
|
6
7
|
CONFIG_FILE = ".texasrc"
|
7
8
|
MASTER_TEMPLATE = "master.tex"
|
8
9
|
|
9
|
-
|
10
|
-
attr_reader :
|
11
|
-
|
10
|
+
# Returns the path of the current Texas project
|
11
|
+
attr_reader :root
|
12
|
+
|
13
|
+
# Returns the options of this build.
|
14
|
+
attr_reader :options
|
15
|
+
|
16
|
+
# Returns the location of the template that is run.
|
17
|
+
attr_reader :master_file
|
18
|
+
|
19
|
+
attr_reader :contents_dir
|
20
|
+
|
21
|
+
# Returns the name of the template whose contents should be rendered.
|
22
|
+
attr_reader :contents_template
|
23
|
+
|
24
|
+
# Returns the name of the template currently rendered.
|
25
|
+
attr_reader :current_template
|
26
|
+
|
27
|
+
# Returns an array of all templates that have been rendered.
|
28
|
+
attr_reader :ran_templates
|
12
29
|
|
13
30
|
def initialize(_options)
|
14
31
|
@options = _options
|
@@ -16,63 +33,69 @@ module Texas
|
|
16
33
|
@contents_dir = options.contents_dir
|
17
34
|
@contents_template = options.contents_template
|
18
35
|
@master_file = File.join(__path__, MASTER_TEMPLATE)
|
19
|
-
|
20
|
-
verbose { "Starting #{self.class}" }
|
21
|
-
verbose { "[i] work_dir: #{options.work_dir}".dark }
|
22
|
-
verbose { "[i] contents_dir: #{@contents_dir}".dark }
|
23
|
-
verbose { "[i] contents_template: #{@contents_template}".dark }
|
24
|
-
verbose { "[i] build_path: #{__path__}".dark }
|
36
|
+
verbose { verbose_info }
|
25
37
|
end
|
26
38
|
|
39
|
+
# Returns the full path of the directory where the build is happening.
|
40
|
+
#
|
27
41
|
def __path__
|
28
42
|
File.join(root, 'tmp', 'build')
|
29
43
|
end
|
30
44
|
|
45
|
+
# Returns an object that can store persistent information throughout
|
46
|
+
# the build process.
|
47
|
+
#
|
31
48
|
def store
|
32
49
|
@store ||= OpenStruct.new
|
33
50
|
end
|
34
51
|
|
52
|
+
# Sets the currently rendered template.
|
53
|
+
#
|
35
54
|
def current_template=(t)
|
36
55
|
@ran_templates ||= []
|
37
56
|
@ran_templates << t unless t.nil?
|
38
57
|
@current_template = t
|
39
58
|
end
|
40
59
|
|
41
|
-
|
42
|
-
|
43
|
-
hash = config["document"] || {}
|
44
|
-
if options.merge_config
|
45
|
-
hash.merge! config[options.merge_config]
|
46
|
-
end
|
47
|
-
OpenStruct.new(hash)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
60
|
+
# Returns the Config object.
|
61
|
+
#
|
51
62
|
def config
|
52
|
-
@config ||=
|
53
|
-
filename = File.join(root, CONFIG_FILE)
|
54
|
-
File.exist?(filename) ? YAML.load_file(filename) : {}
|
55
|
-
end
|
63
|
+
@config ||= Config.create ConfigLoader.new(root, CONFIG_FILE).to_hash, options.merge_config
|
56
64
|
end
|
57
65
|
|
66
|
+
# Returns the location where the generated PDF file should be after the build.
|
67
|
+
#
|
58
68
|
def dest_file
|
59
69
|
@dest_file ||= File.join(root, "bin", "#{Template.basename contents_template}.pdf")
|
60
70
|
end
|
61
71
|
|
72
|
+
# Runs the given build tasks.
|
73
|
+
#
|
62
74
|
def run_build_tasks(*tasks)
|
63
75
|
tasks.flatten.each { |t| run_build_task t }
|
64
76
|
end
|
65
77
|
|
78
|
+
# Runs the given build task.
|
79
|
+
#
|
66
80
|
def run_build_task(klass)
|
81
|
+
verbose { TraceInfo.new(:build_task, klass, :green) }
|
67
82
|
klass = eval("::Texas::Build::Task::#{klass}") if [Symbol, String].include?(klass.class)
|
68
|
-
verbose { "[b] #{klass}".dark }
|
69
83
|
klass.new(self).run
|
70
84
|
end
|
71
85
|
|
86
|
+
# Executes the build process.
|
87
|
+
#
|
72
88
|
def run
|
73
89
|
run_build_tasks before_tasks, basic_tasks, after_tasks
|
74
90
|
end
|
75
91
|
|
92
|
+
def verbose_info
|
93
|
+
[
|
94
|
+
TraceInfo.new("work_dir", options.work_dir, :dark),
|
95
|
+
TraceInfo.new("build_path", __path__, :dark),
|
96
|
+
].join("\n")
|
97
|
+
end
|
98
|
+
|
76
99
|
%w(before basic after).each do |method|
|
77
100
|
class_eval <<-INSTANCE_EVAL
|
78
101
|
def #{method}_tasks
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module Texas
|
2
|
+
module Build
|
3
|
+
# This class holds the config information for a build.
|
4
|
+
#
|
5
|
+
class Config
|
6
|
+
def initialize(hash)
|
7
|
+
@hash = hash.stringify_keys
|
8
|
+
end
|
9
|
+
|
10
|
+
def [](key)
|
11
|
+
@hash[key.to_s]
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns an object for the +document+ config key.
|
15
|
+
#
|
16
|
+
# Example:
|
17
|
+
# # .texasrc
|
18
|
+
#
|
19
|
+
# document:
|
20
|
+
# title: "My Document"
|
21
|
+
#
|
22
|
+
# config = Config.new YAML.load_file(".texasrc")
|
23
|
+
# # => #<Texas::Build::Config ...>
|
24
|
+
#
|
25
|
+
# config.document.title
|
26
|
+
# # => "My Document"
|
27
|
+
#
|
28
|
+
def document
|
29
|
+
@document ||= OpenStruct.new self[:document]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns an object for the +document+ config key.
|
33
|
+
#
|
34
|
+
# Example:
|
35
|
+
# # .texasrc
|
36
|
+
#
|
37
|
+
# document:
|
38
|
+
# title: "My Document (DRAFT!)"
|
39
|
+
# final:
|
40
|
+
# document:
|
41
|
+
# title: "My Document"
|
42
|
+
#
|
43
|
+
# config = Config.new YAML.load_file(".texasrc")
|
44
|
+
# # => #<Texas::Build::Config ...>
|
45
|
+
#
|
46
|
+
# config.document.title
|
47
|
+
# # => "My Document (DRAFT!)"
|
48
|
+
#
|
49
|
+
# config.merge! :final
|
50
|
+
# # => #<Texas::Build::Config ...>
|
51
|
+
#
|
52
|
+
# config.document.title
|
53
|
+
# # => "My Document"
|
54
|
+
#
|
55
|
+
def merge!(key)
|
56
|
+
@document = nil
|
57
|
+
merge_hash = @hash[key.to_s]
|
58
|
+
if merge_hash
|
59
|
+
@hash.deep_merge! merge_hash.stringify_keys
|
60
|
+
self
|
61
|
+
else
|
62
|
+
raise "Trying to merge config with none existing key #{key.inspect}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def method_missing(m, *args, &block)
|
67
|
+
self[m] || super
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns an element from the +script+ config key
|
71
|
+
#
|
72
|
+
# Example:
|
73
|
+
# # .texasrc
|
74
|
+
#
|
75
|
+
# script:
|
76
|
+
# before: "touch some_file"
|
77
|
+
# document:
|
78
|
+
# title: "My Document"
|
79
|
+
#
|
80
|
+
# config = Config.new YAML.load_file(".texasrc")
|
81
|
+
# # => #<Texas::Build::Config ...>
|
82
|
+
#
|
83
|
+
# config.script(:before)
|
84
|
+
# # => "touch some_file"
|
85
|
+
#
|
86
|
+
# config.script(:after)
|
87
|
+
# # => nil
|
88
|
+
#
|
89
|
+
def script(key)
|
90
|
+
hash = self[:script] || {}
|
91
|
+
hash[key.to_s]
|
92
|
+
end
|
93
|
+
|
94
|
+
# Returns a Config object.
|
95
|
+
#
|
96
|
+
# Example:
|
97
|
+
# # .texasrc
|
98
|
+
#
|
99
|
+
# document:
|
100
|
+
# title: "My Document (DRAFT!)"
|
101
|
+
# final:
|
102
|
+
# document:
|
103
|
+
# title: "My Document"
|
104
|
+
#
|
105
|
+
# config = Config.create YAML.load_file(".texasrc"), :final
|
106
|
+
# # => #<Texas::Build::Config ...>
|
107
|
+
#
|
108
|
+
# config.document.title
|
109
|
+
# # => "My Document"
|
110
|
+
#
|
111
|
+
def self.create(hash, merge_key = nil)
|
112
|
+
config = self.new hash
|
113
|
+
config.merge! merge_key if merge_key
|
114
|
+
config
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Texas
|
2
|
+
module Build
|
3
|
+
# This class looks for a given filename in the current and all parent directories.
|
4
|
+
#
|
5
|
+
# # Given the following directory structure:
|
6
|
+
#
|
7
|
+
# ~/
|
8
|
+
# projects/
|
9
|
+
# some_texas_project/
|
10
|
+
# .texasrc
|
11
|
+
# .texasrc
|
12
|
+
#
|
13
|
+
# In the above case, it would find and load
|
14
|
+
# ~/.texasrc and ~/projects/some_texas_project/.texasrc
|
15
|
+
# with the latter one overriding settings in the former one.
|
16
|
+
#
|
17
|
+
class ConfigLoader
|
18
|
+
def initialize(start_dir, filename)
|
19
|
+
@start_dir = start_dir
|
20
|
+
@filename = filename
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns all found files with the given filename in the current and all parent directories.
|
24
|
+
#
|
25
|
+
# Example:
|
26
|
+
# # Given the following directory structure:
|
27
|
+
#
|
28
|
+
# ~/
|
29
|
+
# projects/
|
30
|
+
# some_texas_project/
|
31
|
+
# .texasrc
|
32
|
+
# .texasrc
|
33
|
+
#
|
34
|
+
# all_config_files
|
35
|
+
# # => ["~/.texasrc", "~/projects/some_texas_project/.texasrc"]
|
36
|
+
#
|
37
|
+
def all_config_files
|
38
|
+
found_files = []
|
39
|
+
each_parent_dir(@start_dir) do |dir|
|
40
|
+
filename = File.join(dir, @filename)
|
41
|
+
found_files.unshift filename if File.exist?(filename)
|
42
|
+
end
|
43
|
+
found_files
|
44
|
+
end
|
45
|
+
|
46
|
+
def each_parent_dir(dir)
|
47
|
+
old_length = nil
|
48
|
+
while dir != '.' && dir.length != old_length
|
49
|
+
yield dir
|
50
|
+
old_length = dir.length
|
51
|
+
dir = File.dirname(dir)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns a hash of all the found config files.
|
56
|
+
#
|
57
|
+
# Example:
|
58
|
+
# # Given the following directory structure:
|
59
|
+
#
|
60
|
+
# ~/
|
61
|
+
# projects/
|
62
|
+
# some_texas_project/
|
63
|
+
# .texasrc
|
64
|
+
# .texasrc
|
65
|
+
#
|
66
|
+
# # ~/.texasrc
|
67
|
+
#
|
68
|
+
# document:
|
69
|
+
# author: "John Doe"
|
70
|
+
# some_value: 42
|
71
|
+
#
|
72
|
+
# # ~/projects/some_texas_project/.texasrc
|
73
|
+
#
|
74
|
+
# document:
|
75
|
+
# title: "My Document"
|
76
|
+
# some_value: 123
|
77
|
+
#
|
78
|
+
# to_hash
|
79
|
+
# # => {:document => {
|
80
|
+
# :author => "John Doe",
|
81
|
+
# :title => "My Document",
|
82
|
+
# :some_value => 123}}
|
83
|
+
#
|
84
|
+
def to_hash
|
85
|
+
hash = {}
|
86
|
+
all_config_files.each do |filename|
|
87
|
+
hash.deep_merge! YAML.load_file(filename)
|
88
|
+
end
|
89
|
+
hash
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/texas/build/dry.rb
CHANGED