mill 0.8.4 → 0.16
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.
- checksums.yaml +4 -4
- data/.gitignore +11 -1
- data/Gemfile +6 -0
- data/Rakefile +9 -2
- data/TODO.txt +5 -5
- data/bin/mill +2 -2
- data/lib/mill.rb +4 -1
- data/lib/mill/html_helpers.rb +9 -3
- data/lib/mill/resource.rb +35 -22
- data/lib/mill/resources/blob.rb +42 -0
- data/lib/mill/resources/stylesheet.rb +2 -3
- data/lib/mill/resources/text.rb +23 -12
- data/lib/mill/site.rb +111 -55
- data/lib/mill/version.rb +1 -1
- data/mill.gemspec +15 -10
- data/test/content/a.md +3 -0
- data/test/content/b/ba.md +3 -0
- data/test/content/b/bb.md +3 -0
- data/test/content/b/index.md +3 -0
- data/test/content/index.md +3 -0
- data/test/test.rb +56 -0
- metadata +112 -29
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5accfe1e5067386b3de4898faceb6ea201c6bc30097da779c38ef343e0aad18c
|
|
4
|
+
data.tar.gz: 5861a090880607573153929c75f0475fb258467676b2a4084514e8b368028bb6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1c1e0a63042509e67a028e2e50b2f61fa92560ee16bb77370ca1ca82d1f75ebbd7054b9ba8b2408aff32e83a44c3e5f9cc2600316e5dd22c8a47ef7d26cee932
|
|
7
|
+
data.tar.gz: 7dc21c2b4181768be5150d1e51ef6ea9b16aba0a33c8536dd9609e72b458913e2fa79ee460d9c50c204dc6a0da733587bd4807005a16ca2acc4e5806b33d168d
|
data/.gitignore
CHANGED
data/Gemfile
ADDED
data/Rakefile
CHANGED
data/TODO.txt
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
- remove textile/pre processors from Resource::Text
|
|
2
|
+
- streamline to allow domain-specific subclassing if needed
|
|
3
|
+
|
|
1
4
|
- initialize site by setting ivars directly, not by passing params to super's initialize()
|
|
2
5
|
|
|
3
6
|
- create alternate sites (beta, final, etc.) by subclassing site, and changing @output or @location
|
|
7
|
+
- allow CLI option to specify site
|
|
4
8
|
|
|
5
9
|
- rework resource URI usage
|
|
6
10
|
- 'uri' attribute should be canonical
|
|
@@ -41,8 +45,6 @@
|
|
|
41
45
|
- sidebars
|
|
42
46
|
- strings (existing String extensions)
|
|
43
47
|
|
|
44
|
-
- create bin/mill tool to replace Rake
|
|
45
|
-
|
|
46
48
|
- split Resource#date into Resource#published & Resource#updated
|
|
47
49
|
+ add <published> element to feed
|
|
48
50
|
+ #published should be stated date (e.g., from header)
|
|
@@ -56,6 +58,4 @@
|
|
|
56
58
|
|
|
57
59
|
- save compressed versions of files
|
|
58
60
|
- write compressed versions along with non-compressed
|
|
59
|
-
- serve compressed versions if asked by client
|
|
60
|
-
|
|
61
|
-
- add MailChimp signup form generator to HTMLHelpers
|
|
61
|
+
- serve compressed versions if asked by client
|
data/bin/mill
CHANGED
data/lib/mill.rb
CHANGED
|
@@ -5,16 +5,19 @@ require 'mime/types'
|
|
|
5
5
|
require 'nokogiri'
|
|
6
6
|
require 'path'
|
|
7
7
|
require 'pp'
|
|
8
|
+
# require 'pry' rescue nil
|
|
8
9
|
require 'RedCloth'
|
|
9
10
|
require 'rubypants'
|
|
10
|
-
require '
|
|
11
|
+
require 'sassc'
|
|
11
12
|
require 'time'
|
|
13
|
+
require 'tree'
|
|
12
14
|
require 'web-checker'
|
|
13
15
|
|
|
14
16
|
require 'mill/error'
|
|
15
17
|
require 'mill/html_helpers'
|
|
16
18
|
require 'mill/navigator'
|
|
17
19
|
require 'mill/resource'
|
|
20
|
+
require 'mill/resources/blob'
|
|
18
21
|
require 'mill/resources/feed'
|
|
19
22
|
require 'mill/resources/google_site_verification'
|
|
20
23
|
require 'mill/resources/image'
|
data/lib/mill/html_helpers.rb
CHANGED
|
@@ -104,13 +104,19 @@ module HTMLHelpers
|
|
|
104
104
|
nil => RubyPants,
|
|
105
105
|
smart_quotes: RubyPants,
|
|
106
106
|
markdown: Kramdown::Document,
|
|
107
|
-
textile: RedCloth,
|
|
107
|
+
textile: [RedCloth, :no_span_caps],
|
|
108
108
|
pre: PreText,
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
def to_html(options={})
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
converter_class = Converters[options[:mode]] or raise "Unknown to_html mode: #{options[:mode].inspect}"
|
|
113
|
+
if converter_class.kind_of?(Array)
|
|
114
|
+
converter_class, *converter_options = *converter_class
|
|
115
|
+
converter = converter_class.new(self, converter_options)
|
|
116
|
+
else
|
|
117
|
+
converter = converter_class.new(self)
|
|
118
|
+
end
|
|
119
|
+
html = Nokogiri::HTML::DocumentFragment.parse(converter.to_html)
|
|
114
120
|
if !options[:multiline] && (p_elem = html.at_xpath('p'))
|
|
115
121
|
html = p_elem.children.to_html
|
|
116
122
|
end
|
data/lib/mill/resource.rb
CHANGED
|
@@ -6,10 +6,12 @@ module Mill
|
|
|
6
6
|
|
|
7
7
|
attr_accessor :input_file
|
|
8
8
|
attr_accessor :output_file
|
|
9
|
+
attr_accessor :path
|
|
9
10
|
attr_accessor :date
|
|
10
11
|
attr_accessor :public
|
|
11
12
|
attr_accessor :content
|
|
12
13
|
attr_accessor :site
|
|
14
|
+
attr_accessor :node
|
|
13
15
|
|
|
14
16
|
def initialize(input_file: nil,
|
|
15
17
|
output_file: nil,
|
|
@@ -23,7 +25,10 @@ module Mill
|
|
|
23
25
|
else
|
|
24
26
|
@date = DateTime.now
|
|
25
27
|
end
|
|
26
|
-
|
|
28
|
+
if output_file
|
|
29
|
+
@output_file = Path.new(output_file)
|
|
30
|
+
@path = '/' + @output_file.relative_to(site.output_dir).to_s
|
|
31
|
+
end
|
|
27
32
|
self.date = date if date
|
|
28
33
|
self.public = public
|
|
29
34
|
@content = content
|
|
@@ -57,39 +62,47 @@ module Mill
|
|
|
57
62
|
end
|
|
58
63
|
|
|
59
64
|
def public?
|
|
60
|
-
@public
|
|
65
|
+
@public == true
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def text?
|
|
69
|
+
kind_of?(Resource::Text) && public?
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def redirect?
|
|
73
|
+
kind_of?(Resource::Redirect)
|
|
61
74
|
end
|
|
62
75
|
|
|
63
76
|
def inspect
|
|
64
|
-
"<%p> input_file: %p, output_file: %p, date: %s, public: %p, content: <%p
|
|
77
|
+
"<%p> input_file: %p, output_file: %p, path: %s, date: %s, public: %p, content: <%p>, parent: %p, siblings: %p, children: %p" % [
|
|
65
78
|
self.class,
|
|
66
79
|
@input_file ? @input_file.relative_to(@site.input_dir).to_s : nil,
|
|
67
80
|
@output_file ? @output_file.relative_to(@site.output_dir).to_s : nil,
|
|
81
|
+
@path,
|
|
68
82
|
@date.to_s,
|
|
69
83
|
@public,
|
|
70
|
-
@content
|
|
84
|
+
@content&.class,
|
|
85
|
+
parent&.path,
|
|
86
|
+
siblings.map(&:path),
|
|
87
|
+
children.map(&:path),
|
|
71
88
|
]
|
|
72
89
|
end
|
|
73
90
|
|
|
74
|
-
def
|
|
75
|
-
|
|
76
|
-
@site.resources.select do |resource|
|
|
77
|
-
resource != self &&
|
|
78
|
-
(klass.nil? || resource.kind_of?(klass)) &&
|
|
79
|
-
resource.parent_uri == parent_uri
|
|
80
|
-
end
|
|
91
|
+
def parent
|
|
92
|
+
@node.parent&.content
|
|
81
93
|
end
|
|
82
94
|
|
|
83
|
-
def
|
|
84
|
-
|
|
85
|
-
path = '/' + @output_file.relative_to(@site.output_dir).to_s
|
|
86
|
-
path.sub!(%r{/index\.html$}, '/')
|
|
87
|
-
path.sub!(%r{\.html$}, '') if @site.shorten_uris
|
|
88
|
-
Addressable::URI.encode(path, Addressable::URI)
|
|
95
|
+
def siblings
|
|
96
|
+
@node.siblings.map(&:content).compact
|
|
89
97
|
end
|
|
90
98
|
|
|
91
|
-
def
|
|
92
|
-
|
|
99
|
+
def children
|
|
100
|
+
@node.children.map(&:content).compact
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def uri
|
|
104
|
+
raise Error, "#{@input_file}: No path defined for #{self.class}" unless @path
|
|
105
|
+
Addressable::URI.encode(@path, Addressable::URI)
|
|
93
106
|
end
|
|
94
107
|
|
|
95
108
|
def absolute_uri
|
|
@@ -119,14 +132,14 @@ module Mill
|
|
|
119
132
|
def save
|
|
120
133
|
@output_file.dirname.mkpath
|
|
121
134
|
if (content = final_content)
|
|
122
|
-
# ;;warn "#{
|
|
135
|
+
# ;;warn "#{path}: writing #{@input_file} to #{@output_file}"
|
|
123
136
|
@output_file.write(content.to_s)
|
|
124
137
|
@output_file.utime(@date.to_time, @date.to_time)
|
|
125
138
|
elsif @input_file
|
|
126
|
-
# ;;warn "#{
|
|
139
|
+
# ;;warn "#{path}: copying #{@input_file} to #{@output_file}"
|
|
127
140
|
@input_file.copy(@output_file)
|
|
128
141
|
else
|
|
129
|
-
raise Error, "Can't build resource without content or input file: #{
|
|
142
|
+
raise Error, "Can't build resource without content or input file: #{path}"
|
|
130
143
|
end
|
|
131
144
|
end
|
|
132
145
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Mill
|
|
2
|
+
|
|
3
|
+
class Resource
|
|
4
|
+
|
|
5
|
+
class Blob < Resource
|
|
6
|
+
|
|
7
|
+
FileTypes = %w{
|
|
8
|
+
application/pdf
|
|
9
|
+
|
|
10
|
+
application/zip
|
|
11
|
+
|
|
12
|
+
application/ecmascript
|
|
13
|
+
application/javascript
|
|
14
|
+
text/ecmascript
|
|
15
|
+
text/javascript
|
|
16
|
+
application/x-javascript
|
|
17
|
+
|
|
18
|
+
font/otf
|
|
19
|
+
application/font-sfnt
|
|
20
|
+
application/x-font-opentype
|
|
21
|
+
application/x-font-otf
|
|
22
|
+
|
|
23
|
+
application/mp4
|
|
24
|
+
audio/mpeg
|
|
25
|
+
audio/mp4
|
|
26
|
+
video/mp4
|
|
27
|
+
video/vnd.objectvideo
|
|
28
|
+
video/quicktime
|
|
29
|
+
|
|
30
|
+
application/msword
|
|
31
|
+
application/word
|
|
32
|
+
application/x-msword
|
|
33
|
+
application/x-word
|
|
34
|
+
application/vnd.ms-powerpoint
|
|
35
|
+
application/powerpoint
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
@@ -11,10 +11,9 @@ module Mill
|
|
|
11
11
|
def load
|
|
12
12
|
super
|
|
13
13
|
unless @input_file.basename.to_s.end_with?('.min.css')
|
|
14
|
-
engine = Sass::Engine.for_file(@input_file.to_s, syntax: :scss, style: :compressed)
|
|
15
14
|
begin
|
|
16
|
-
@content =
|
|
17
|
-
rescue
|
|
15
|
+
@content = SassC::Engine.new(@input_file.read, syntax: :scss, style: :compressed).render
|
|
16
|
+
rescue SassC::SyntaxError => e
|
|
18
17
|
raise "#{input_file}: error parsing CSS: #{e}"
|
|
19
18
|
end
|
|
20
19
|
end
|
data/lib/mill/resources/text.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
module Mill
|
|
2
3
|
|
|
3
4
|
class Resource
|
|
@@ -15,19 +16,29 @@ module Mill
|
|
|
15
16
|
attr_accessor :title
|
|
16
17
|
attr_accessor :summary
|
|
17
18
|
attr_accessor :author
|
|
19
|
+
attr_accessor :type
|
|
18
20
|
|
|
19
|
-
def initialize(title: nil, summary: nil, author: nil, public: true, **args)
|
|
21
|
+
def initialize(title: nil, summary: nil, author: nil, public: true, output_file: nil, **args)
|
|
20
22
|
@title = title
|
|
21
23
|
@summary = summary
|
|
22
24
|
@author = author
|
|
23
|
-
|
|
25
|
+
@type = nil
|
|
26
|
+
super(
|
|
27
|
+
public: public,
|
|
28
|
+
output_file: output_file&.replace_extension('.html'),
|
|
29
|
+
**args)
|
|
30
|
+
if @path
|
|
31
|
+
@path.sub!(%r{\.html$}, '') if @site&.shorten_uris
|
|
32
|
+
@path.sub!(%r{(.*)index$}, '\1')
|
|
33
|
+
end
|
|
24
34
|
end
|
|
25
35
|
|
|
26
36
|
def inspect
|
|
27
|
-
super + ", title: %p, summary: %p, author: %p" % [
|
|
37
|
+
super + ", title: %p, summary: %p, author: %p, type: %p" % [
|
|
28
38
|
@title,
|
|
29
39
|
@summary,
|
|
30
40
|
@author,
|
|
41
|
+
@type,
|
|
31
42
|
]
|
|
32
43
|
end
|
|
33
44
|
|
|
@@ -35,7 +46,7 @@ module Mill
|
|
|
35
46
|
super
|
|
36
47
|
if @input_file
|
|
37
48
|
@content = @input_file.read
|
|
38
|
-
|
|
49
|
+
@type = case @input_file.extname.downcase
|
|
39
50
|
when '.md', '.mdown', '.markdown'
|
|
40
51
|
:markdown
|
|
41
52
|
when '.textile'
|
|
@@ -47,10 +58,10 @@ module Mill
|
|
|
47
58
|
else
|
|
48
59
|
raise "Unknown text type: #{@input_file}"
|
|
49
60
|
end
|
|
50
|
-
if
|
|
61
|
+
if @type != :html
|
|
51
62
|
parse_text_header
|
|
52
|
-
@content = (@content || '').to_html(mode:
|
|
53
|
-
@
|
|
63
|
+
@content = (@content || '').to_html(mode: @type, multiline: true)
|
|
64
|
+
@type = :html
|
|
54
65
|
end
|
|
55
66
|
begin
|
|
56
67
|
@content = parse_html(@content)
|
|
@@ -66,7 +77,7 @@ module Mill
|
|
|
66
77
|
if (title_elem = @content.at_xpath('/html/head/title'))
|
|
67
78
|
@title = title_elem.text
|
|
68
79
|
else
|
|
69
|
-
@title =
|
|
80
|
+
@title = @path
|
|
70
81
|
end
|
|
71
82
|
end
|
|
72
83
|
@content.xpath('/html/head/meta[@name]').each do |meta|
|
|
@@ -78,7 +89,7 @@ module Mill
|
|
|
78
89
|
if @content.split(/\n/, 2).first =~ /^\w+:\s+/
|
|
79
90
|
header, @content = @content.split(/\n\n/, 2)
|
|
80
91
|
header.split(/\n/).map do |line|
|
|
81
|
-
key, value = line.strip.split(/:\s
|
|
92
|
+
key, value = line.strip.split(/:\s*/, 2)
|
|
82
93
|
key = key.gsub('-', '_').downcase.to_sym
|
|
83
94
|
send("#{key}=", value)
|
|
84
95
|
end
|
|
@@ -86,7 +97,7 @@ module Mill
|
|
|
86
97
|
end
|
|
87
98
|
|
|
88
99
|
def final_content
|
|
89
|
-
html_document(@site
|
|
100
|
+
html_document(@site&.html_version || :html5) do |doc|
|
|
90
101
|
doc.html(lang: 'en') do |html|
|
|
91
102
|
html.parent << head
|
|
92
103
|
html.parent << body
|
|
@@ -168,7 +179,7 @@ module Mill
|
|
|
168
179
|
self_uri.scheme = 'http'
|
|
169
180
|
link_uri.scheme = 'http'
|
|
170
181
|
attribute.value = self_uri.route_to(link_uri)
|
|
171
|
-
# ;;warn "[#{
|
|
182
|
+
# ;;warn "[#{path}] shortened link #{elem.name}/@#{attribute.name}: #{link_uri} => #{attribute.value}"
|
|
172
183
|
end
|
|
173
184
|
end
|
|
174
185
|
end
|
|
@@ -195,7 +206,7 @@ module Mill
|
|
|
195
206
|
body_elem.children
|
|
196
207
|
end
|
|
197
208
|
else
|
|
198
|
-
warn "Warning: Resource #{
|
|
209
|
+
warn "Warning: Resource #{path} (#{self.class}) has no content"
|
|
199
210
|
nil
|
|
200
211
|
end
|
|
201
212
|
end
|
data/lib/mill/site.rb
CHANGED
|
@@ -64,8 +64,8 @@ module Mill
|
|
|
64
64
|
@google_site_verification = google_site_verification
|
|
65
65
|
@redirects = redirects
|
|
66
66
|
|
|
67
|
-
@resources =
|
|
68
|
-
@
|
|
67
|
+
@resources = {}
|
|
68
|
+
@resources_tree = Tree::TreeNode.new('')
|
|
69
69
|
build_file_types
|
|
70
70
|
end
|
|
71
71
|
|
|
@@ -79,35 +79,20 @@ module Mill
|
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
def add_resource(resource)
|
|
82
|
-
resource
|
|
83
|
-
@resources
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
def delete_resource(resource)
|
|
89
|
-
@resources.delete(resource)
|
|
90
|
-
@resources_by_uri.delete(resource.uri)
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def find_resource(uri)
|
|
94
|
-
uri = Addressable::URI.parse(uri.to_s) unless uri.kind_of?(Addressable::URI)
|
|
95
|
-
resource = @resources_by_uri[uri]
|
|
96
|
-
if resource.nil? && @shorten_uris
|
|
97
|
-
uri.path = uri.path.sub(%r{\.html$}, '')
|
|
98
|
-
resource = @resources_by_uri[uri]
|
|
82
|
+
raise "Must assign resource to site" unless resource.site
|
|
83
|
+
@resources[resource.path] = resource
|
|
84
|
+
node = @resources_tree
|
|
85
|
+
resource.path.split('/').reject(&:empty?).each do |component|
|
|
86
|
+
node = node[component] || (node << Tree::TreeNode.new(component))
|
|
99
87
|
end
|
|
100
|
-
resource
|
|
88
|
+
resource.node = node
|
|
89
|
+
node.content = resource
|
|
90
|
+
# ;;warn "added #{resource} as #{resource.path}"
|
|
101
91
|
end
|
|
102
92
|
|
|
103
|
-
def
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
'/' + URI.encode(
|
|
107
|
-
path.relative_to(@output_dir).to_s
|
|
108
|
-
)
|
|
109
|
-
)
|
|
110
|
-
)
|
|
93
|
+
def find_resource(path)
|
|
94
|
+
path = path.path if path.kind_of?(Addressable::URI)
|
|
95
|
+
@resources[path] || @resources[path + '/']
|
|
111
96
|
end
|
|
112
97
|
|
|
113
98
|
def home_resource
|
|
@@ -135,20 +120,30 @@ module Mill
|
|
|
135
120
|
@site_email
|
|
136
121
|
end
|
|
137
122
|
|
|
123
|
+
def select_resources(selector=nil, &block)
|
|
124
|
+
if block_given?
|
|
125
|
+
@resources.values.select(&block)
|
|
126
|
+
elsif selector.kind_of?(Class)
|
|
127
|
+
@resources.values.select { |r| r.kind_of?(selector) }
|
|
128
|
+
else
|
|
129
|
+
@resources.values.select(selector)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
138
133
|
def feed_resources
|
|
139
134
|
public_resources.sort_by(&:date)
|
|
140
135
|
end
|
|
141
136
|
|
|
142
137
|
def public_resources
|
|
143
|
-
|
|
138
|
+
select_resources(&:public?)
|
|
144
139
|
end
|
|
145
140
|
|
|
146
|
-
def
|
|
147
|
-
|
|
141
|
+
def redirect_resources
|
|
142
|
+
select_resources(&:redirect?)
|
|
148
143
|
end
|
|
149
144
|
|
|
150
|
-
def
|
|
151
|
-
|
|
145
|
+
def text_resources
|
|
146
|
+
select_resources(&:text?)
|
|
152
147
|
end
|
|
153
148
|
|
|
154
149
|
def make
|
|
@@ -156,11 +151,67 @@ module Mill
|
|
|
156
151
|
save
|
|
157
152
|
end
|
|
158
153
|
|
|
154
|
+
def print_tree(node=nil, level=0)
|
|
155
|
+
node ||= @resources_tree
|
|
156
|
+
if node.is_root?
|
|
157
|
+
print '*'
|
|
158
|
+
else
|
|
159
|
+
print "\t" * level
|
|
160
|
+
end
|
|
161
|
+
print " #{node.name.inspect}"
|
|
162
|
+
print " <#{node.content&.path}>"
|
|
163
|
+
print " (#{node.children.length} children)" if node.has_children?
|
|
164
|
+
puts
|
|
165
|
+
node.children { |child| print_tree(child, level + 1) }
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
ListKeys = {
|
|
169
|
+
path: :to_s,
|
|
170
|
+
input_file: :to_s,
|
|
171
|
+
output_file: :to_s,
|
|
172
|
+
date: :to_s,
|
|
173
|
+
public: :to_s,
|
|
174
|
+
class: :to_s,
|
|
175
|
+
content: proc { |r| r.content ? ('%s (%dKB)' % [r.content.class, (r.content.to_s.length / 1024.0).ceil]) : nil },
|
|
176
|
+
parent: proc { |r| r.parent&.path },
|
|
177
|
+
siblings: proc { |r| r.siblings.map(&:path) },
|
|
178
|
+
children: proc { |r| r.children.map(&:path) },
|
|
179
|
+
}
|
|
180
|
+
|
|
159
181
|
def list
|
|
160
182
|
build
|
|
161
|
-
|
|
162
|
-
|
|
183
|
+
width = ListKeys.keys.map(&:length).max
|
|
184
|
+
select_resources.each do |resource|
|
|
185
|
+
ListKeys.each do |key, converter|
|
|
186
|
+
value = resource.send(key)
|
|
187
|
+
value = case converter
|
|
188
|
+
when nil
|
|
189
|
+
value
|
|
190
|
+
when Symbol
|
|
191
|
+
value.send(converter)
|
|
192
|
+
when Proc
|
|
193
|
+
converter.call(resource)
|
|
194
|
+
else
|
|
195
|
+
raise
|
|
196
|
+
end
|
|
197
|
+
print '%*s: ' % [width, key]
|
|
198
|
+
case value
|
|
199
|
+
when Array
|
|
200
|
+
if value.empty?
|
|
201
|
+
puts '-'
|
|
202
|
+
else
|
|
203
|
+
value.each_with_index do |v, i|
|
|
204
|
+
print '%*s ' % [width, ''] if i > 0
|
|
205
|
+
puts (v.nil? ? '-' : v)
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
else
|
|
209
|
+
puts (value.nil? ? '-' : value)
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
puts
|
|
163
213
|
end
|
|
214
|
+
puts
|
|
164
215
|
end
|
|
165
216
|
|
|
166
217
|
def build
|
|
@@ -181,14 +232,14 @@ module Mill
|
|
|
181
232
|
|
|
182
233
|
def load_resources
|
|
183
234
|
on_each_resource do |resource|
|
|
184
|
-
# ;;warn "#{resource.
|
|
235
|
+
# ;;warn "#{resource.path}: loading"
|
|
185
236
|
resource.load
|
|
186
237
|
end
|
|
187
238
|
end
|
|
188
239
|
|
|
189
240
|
def build_resources
|
|
190
241
|
on_each_resource do |resource|
|
|
191
|
-
# ;;warn "#{resource.
|
|
242
|
+
# ;;warn "#{resource.path}: building"
|
|
192
243
|
resource.build
|
|
193
244
|
end
|
|
194
245
|
end
|
|
@@ -197,7 +248,7 @@ module Mill
|
|
|
197
248
|
clean
|
|
198
249
|
@output_dir.mkpath
|
|
199
250
|
on_each_resource do |resource|
|
|
200
|
-
# ;;warn "#{resource.
|
|
251
|
+
# ;;warn "#{resource.path}: saving"
|
|
201
252
|
resource.save
|
|
202
253
|
end
|
|
203
254
|
end
|
|
@@ -211,11 +262,14 @@ module Mill
|
|
|
211
262
|
end
|
|
212
263
|
|
|
213
264
|
def check
|
|
265
|
+
build
|
|
214
266
|
checker = WebChecker.new(site_uri: @site_uri, site_dir: @output_dir)
|
|
215
267
|
end
|
|
216
268
|
|
|
217
269
|
def snapshot
|
|
218
270
|
@output_dir.chdir do
|
|
271
|
+
system('git',
|
|
272
|
+
'init') unless Path.new('.git').exist?
|
|
219
273
|
system('git',
|
|
220
274
|
'add',
|
|
221
275
|
'.')
|
|
@@ -240,6 +294,7 @@ module Mill
|
|
|
240
294
|
'--progress',
|
|
241
295
|
'--verbose',
|
|
242
296
|
'--archive',
|
|
297
|
+
# '--append-verify',
|
|
243
298
|
'--exclude=.git',
|
|
244
299
|
'--delete-after',
|
|
245
300
|
@output_dir.to_s,
|
|
@@ -247,17 +302,11 @@ module Mill
|
|
|
247
302
|
end
|
|
248
303
|
|
|
249
304
|
def on_each_resource(&block)
|
|
250
|
-
@resources.each do |resource|
|
|
251
|
-
old_uri = resource.uri.dup
|
|
305
|
+
@resources.values.each do |resource|
|
|
252
306
|
begin
|
|
253
307
|
yield(resource)
|
|
254
308
|
rescue Error => e
|
|
255
|
-
raise e, "#{resource.input_file || '-'} (#{
|
|
256
|
-
end
|
|
257
|
-
if resource.uri != old_uri
|
|
258
|
-
# ;;warn "URI changed: #{old_uri} => #{resource.uri}"
|
|
259
|
-
@resources_by_uri.delete(old_uri)
|
|
260
|
-
@resources_by_uri[resource.uri] = resource
|
|
309
|
+
raise e, "#{resource.input_file || '-'} (#{resource.path}): #{e}"
|
|
261
310
|
end
|
|
262
311
|
end
|
|
263
312
|
end
|
|
@@ -269,12 +318,12 @@ module Mill
|
|
|
269
318
|
if type && (klass = @file_types[type.content_type])
|
|
270
319
|
klass
|
|
271
320
|
else
|
|
272
|
-
|
|
321
|
+
raise Error, "Unknown file type: #{file.to_s.inspect} (#{MIME::Types.of(file.to_s).join(', ')})"
|
|
273
322
|
end
|
|
274
323
|
end
|
|
275
324
|
|
|
276
325
|
def add_files
|
|
277
|
-
raise Error, "Input
|
|
326
|
+
raise Error, "Input directory not found: #{@input_dir}" unless @input_dir.exist?
|
|
278
327
|
@input_dir.find do |input_file|
|
|
279
328
|
if input_file.basename.to_s[0] == '.'
|
|
280
329
|
Find.prune
|
|
@@ -283,7 +332,8 @@ module Mill
|
|
|
283
332
|
else (klass = resource_class_for_file(input_file))
|
|
284
333
|
resource = klass.new(
|
|
285
334
|
input_file: input_file,
|
|
286
|
-
output_file: @output_dir / input_file.relative_to(@input_dir)
|
|
335
|
+
output_file: @output_dir / input_file.relative_to(@input_dir),
|
|
336
|
+
site: self)
|
|
287
337
|
add_resource(resource)
|
|
288
338
|
end
|
|
289
339
|
end
|
|
@@ -291,19 +341,22 @@ module Mill
|
|
|
291
341
|
|
|
292
342
|
def add_feed
|
|
293
343
|
@feed_resource = Resource::Feed.new(
|
|
294
|
-
output_file: @output_dir / 'feed.xml'
|
|
344
|
+
output_file: @output_dir / 'feed.xml',
|
|
345
|
+
site: self)
|
|
295
346
|
add_resource(@feed_resource)
|
|
296
347
|
end
|
|
297
348
|
|
|
298
349
|
def add_sitemap
|
|
299
350
|
@sitemap_resource = Resource::Sitemap.new(
|
|
300
|
-
output_file: @output_dir / 'sitemap.xml'
|
|
351
|
+
output_file: @output_dir / 'sitemap.xml',
|
|
352
|
+
site: self)
|
|
301
353
|
add_resource(@sitemap_resource)
|
|
302
354
|
end
|
|
303
355
|
|
|
304
356
|
def add_robots
|
|
305
357
|
@robots_resource = Resource::Robots.new(
|
|
306
|
-
output_file: @output_dir / 'robots.txt'
|
|
358
|
+
output_file: @output_dir / 'robots.txt',
|
|
359
|
+
site: self)
|
|
307
360
|
add_resource(@robots_resource)
|
|
308
361
|
end
|
|
309
362
|
|
|
@@ -313,7 +366,8 @@ module Mill
|
|
|
313
366
|
output_file = @output_dir / Path.new(from).relative_to('/')
|
|
314
367
|
resource = Resource::Redirect.new(
|
|
315
368
|
output_file: output_file,
|
|
316
|
-
redirect_uri: to
|
|
369
|
+
redirect_uri: to,
|
|
370
|
+
site: self)
|
|
317
371
|
add_resource(resource)
|
|
318
372
|
end
|
|
319
373
|
end
|
|
@@ -322,14 +376,16 @@ module Mill
|
|
|
322
376
|
def add_google_site_verification
|
|
323
377
|
resource = Resource::GoogleSiteVerification.new(
|
|
324
378
|
output_file: (@output_dir / @google_site_verification).add_extension('.html'),
|
|
325
|
-
key: @google_site_verification
|
|
379
|
+
key: @google_site_verification,
|
|
380
|
+
site: self)
|
|
326
381
|
add_resource(resource)
|
|
327
382
|
end
|
|
328
383
|
|
|
329
384
|
def add_htpasswd
|
|
330
385
|
resource = Resource.new(
|
|
331
386
|
input_file: @htpasswd_file,
|
|
332
|
-
output_file: @output_dir / '.htpasswd'
|
|
387
|
+
output_file: @output_dir / '.htpasswd',
|
|
388
|
+
site: self)
|
|
333
389
|
add_resource(resource)
|
|
334
390
|
end
|
|
335
391
|
|
data/lib/mill/version.rb
CHANGED
data/mill.gemspec
CHANGED
|
@@ -18,17 +18,22 @@ Gem::Specification.new do |s|
|
|
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
|
19
19
|
s.require_path = 'lib'
|
|
20
20
|
|
|
21
|
-
s.add_dependency 'addressable', '~> 2.
|
|
22
|
-
s.add_dependency 'image_size', '~> 1
|
|
23
|
-
s.add_dependency 'kramdown', '~>
|
|
24
|
-
s.add_dependency 'mime-types', '~> 3.
|
|
25
|
-
s.add_dependency 'nokogiri', '~> 1.
|
|
21
|
+
s.add_dependency 'addressable', '~> 2.7'
|
|
22
|
+
s.add_dependency 'image_size', '~> 2.1'
|
|
23
|
+
s.add_dependency 'kramdown', '~> 2.3'
|
|
24
|
+
s.add_dependency 'mime-types', '~> 3.3'
|
|
25
|
+
s.add_dependency 'nokogiri', '~> 1.10'
|
|
26
26
|
s.add_dependency 'path', '~> 2.0'
|
|
27
27
|
s.add_dependency 'RedCloth', '~> 4.3'
|
|
28
|
-
s.add_dependency 'rubypants', '~> 0.
|
|
29
|
-
s.add_dependency '
|
|
30
|
-
s.add_dependency '
|
|
28
|
+
s.add_dependency 'rubypants', '~> 0.7'
|
|
29
|
+
s.add_dependency 'rubytree', '~> 1.0'
|
|
30
|
+
s.add_dependency 'sassc', '~> 2.4'
|
|
31
|
+
s.add_dependency 'web-checker', '~> 0.4'
|
|
31
32
|
|
|
32
|
-
s.add_development_dependency '
|
|
33
|
-
s.add_development_dependency '
|
|
33
|
+
s.add_development_dependency 'bundler', '~> 2.2'
|
|
34
|
+
s.add_development_dependency 'minitest', '~> 5.14'
|
|
35
|
+
s.add_development_dependency 'minitest-power_assert', '~> 0.3'
|
|
36
|
+
s.add_development_dependency 'pry', '~> 0.13'
|
|
37
|
+
s.add_development_dependency 'rake', '~> 13.0'
|
|
38
|
+
s.add_development_dependency 'rubygems-tasks', '~> 0.2'
|
|
34
39
|
end
|
data/test/content/a.md
ADDED
data/test/test.rb
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
$VERBOSE = false
|
|
2
|
+
|
|
3
|
+
require 'minitest/autorun'
|
|
4
|
+
require 'minitest/power_assert'
|
|
5
|
+
|
|
6
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
|
7
|
+
require 'mill'
|
|
8
|
+
|
|
9
|
+
module Mill
|
|
10
|
+
|
|
11
|
+
class Test < Minitest::Test
|
|
12
|
+
|
|
13
|
+
def setup
|
|
14
|
+
@site = Site.new(
|
|
15
|
+
input_dir: 'test/content',
|
|
16
|
+
output_dir: 'test/output',
|
|
17
|
+
site_title: 'Test',
|
|
18
|
+
site_uri: 'http://test.test',
|
|
19
|
+
html_version: :html5,
|
|
20
|
+
)
|
|
21
|
+
@site.make
|
|
22
|
+
# ;;@site.print_tree
|
|
23
|
+
# ;;@site.list
|
|
24
|
+
# ;;binding.pry
|
|
25
|
+
@root = @site.find_resource('/') or raise
|
|
26
|
+
@a = @site.find_resource('/a') or raise
|
|
27
|
+
@b = @site.find_resource('/b') or raise
|
|
28
|
+
@ba = @site.find_resource('/b/ba') or raise
|
|
29
|
+
@bb = @site.find_resource('/b/bb') or raise
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_has_index
|
|
33
|
+
assert { @root }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_children
|
|
37
|
+
assert { @root.children == [@a, @b] }
|
|
38
|
+
assert { @a.children.empty? }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_parent
|
|
42
|
+
assert { @a.parent == @root }
|
|
43
|
+
assert { @b.parent == @root }
|
|
44
|
+
assert { @ba.parent == @b }
|
|
45
|
+
assert { @bb.parent == @b }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_siblings
|
|
49
|
+
assert { @root.siblings.empty? }
|
|
50
|
+
assert { @a.siblings == [@b] }
|
|
51
|
+
assert { @ba.siblings == [@bb] }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mill
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: '0.16'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- John Labovitz
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-12-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: addressable
|
|
@@ -16,70 +16,70 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '2.
|
|
19
|
+
version: '2.7'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '2.
|
|
26
|
+
version: '2.7'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: image_size
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '1
|
|
33
|
+
version: '2.1'
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '1
|
|
40
|
+
version: '2.1'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: kramdown
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
47
|
+
version: '2.3'
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '
|
|
54
|
+
version: '2.3'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: mime-types
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '3.
|
|
61
|
+
version: '3.3'
|
|
62
62
|
type: :runtime
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '3.
|
|
68
|
+
version: '3.3'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: nokogiri
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
73
|
- - "~>"
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '1.
|
|
75
|
+
version: '1.10'
|
|
76
76
|
type: :runtime
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
80
|
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '1.
|
|
82
|
+
version: '1.10'
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
84
|
name: path
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -114,70 +114,140 @@ dependencies:
|
|
|
114
114
|
requirements:
|
|
115
115
|
- - "~>"
|
|
116
116
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: '0.
|
|
117
|
+
version: '0.7'
|
|
118
118
|
type: :runtime
|
|
119
119
|
prerelease: false
|
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
121
|
requirements:
|
|
122
122
|
- - "~>"
|
|
123
123
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: '0.
|
|
124
|
+
version: '0.7'
|
|
125
125
|
- !ruby/object:Gem::Dependency
|
|
126
|
-
name:
|
|
126
|
+
name: rubytree
|
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
|
128
128
|
requirements:
|
|
129
129
|
- - "~>"
|
|
130
130
|
- !ruby/object:Gem::Version
|
|
131
|
-
version: '
|
|
131
|
+
version: '1.0'
|
|
132
132
|
type: :runtime
|
|
133
133
|
prerelease: false
|
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
135
135
|
requirements:
|
|
136
136
|
- - "~>"
|
|
137
137
|
- !ruby/object:Gem::Version
|
|
138
|
-
version: '
|
|
138
|
+
version: '1.0'
|
|
139
|
+
- !ruby/object:Gem::Dependency
|
|
140
|
+
name: sassc
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - "~>"
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: '2.4'
|
|
146
|
+
type: :runtime
|
|
147
|
+
prerelease: false
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - "~>"
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: '2.4'
|
|
139
153
|
- !ruby/object:Gem::Dependency
|
|
140
154
|
name: web-checker
|
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
|
142
156
|
requirements:
|
|
143
157
|
- - "~>"
|
|
144
158
|
- !ruby/object:Gem::Version
|
|
145
|
-
version: '0'
|
|
159
|
+
version: '0.4'
|
|
146
160
|
type: :runtime
|
|
147
161
|
prerelease: false
|
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
|
149
163
|
requirements:
|
|
150
164
|
- - "~>"
|
|
151
165
|
- !ruby/object:Gem::Version
|
|
152
|
-
version: '0'
|
|
166
|
+
version: '0.4'
|
|
167
|
+
- !ruby/object:Gem::Dependency
|
|
168
|
+
name: bundler
|
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
|
170
|
+
requirements:
|
|
171
|
+
- - "~>"
|
|
172
|
+
- !ruby/object:Gem::Version
|
|
173
|
+
version: '2.2'
|
|
174
|
+
type: :development
|
|
175
|
+
prerelease: false
|
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
177
|
+
requirements:
|
|
178
|
+
- - "~>"
|
|
179
|
+
- !ruby/object:Gem::Version
|
|
180
|
+
version: '2.2'
|
|
181
|
+
- !ruby/object:Gem::Dependency
|
|
182
|
+
name: minitest
|
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
|
184
|
+
requirements:
|
|
185
|
+
- - "~>"
|
|
186
|
+
- !ruby/object:Gem::Version
|
|
187
|
+
version: '5.14'
|
|
188
|
+
type: :development
|
|
189
|
+
prerelease: false
|
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
191
|
+
requirements:
|
|
192
|
+
- - "~>"
|
|
193
|
+
- !ruby/object:Gem::Version
|
|
194
|
+
version: '5.14'
|
|
195
|
+
- !ruby/object:Gem::Dependency
|
|
196
|
+
name: minitest-power_assert
|
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
|
198
|
+
requirements:
|
|
199
|
+
- - "~>"
|
|
200
|
+
- !ruby/object:Gem::Version
|
|
201
|
+
version: '0.3'
|
|
202
|
+
type: :development
|
|
203
|
+
prerelease: false
|
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
205
|
+
requirements:
|
|
206
|
+
- - "~>"
|
|
207
|
+
- !ruby/object:Gem::Version
|
|
208
|
+
version: '0.3'
|
|
209
|
+
- !ruby/object:Gem::Dependency
|
|
210
|
+
name: pry
|
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
|
212
|
+
requirements:
|
|
213
|
+
- - "~>"
|
|
214
|
+
- !ruby/object:Gem::Version
|
|
215
|
+
version: '0.13'
|
|
216
|
+
type: :development
|
|
217
|
+
prerelease: false
|
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
219
|
+
requirements:
|
|
220
|
+
- - "~>"
|
|
221
|
+
- !ruby/object:Gem::Version
|
|
222
|
+
version: '0.13'
|
|
153
223
|
- !ruby/object:Gem::Dependency
|
|
154
224
|
name: rake
|
|
155
225
|
requirement: !ruby/object:Gem::Requirement
|
|
156
226
|
requirements:
|
|
157
227
|
- - "~>"
|
|
158
228
|
- !ruby/object:Gem::Version
|
|
159
|
-
version: '0'
|
|
229
|
+
version: '13.0'
|
|
160
230
|
type: :development
|
|
161
231
|
prerelease: false
|
|
162
232
|
version_requirements: !ruby/object:Gem::Requirement
|
|
163
233
|
requirements:
|
|
164
234
|
- - "~>"
|
|
165
235
|
- !ruby/object:Gem::Version
|
|
166
|
-
version: '0'
|
|
236
|
+
version: '13.0'
|
|
167
237
|
- !ruby/object:Gem::Dependency
|
|
168
238
|
name: rubygems-tasks
|
|
169
239
|
requirement: !ruby/object:Gem::Requirement
|
|
170
240
|
requirements:
|
|
171
241
|
- - "~>"
|
|
172
242
|
- !ruby/object:Gem::Version
|
|
173
|
-
version: '0.
|
|
243
|
+
version: '0.2'
|
|
174
244
|
type: :development
|
|
175
245
|
prerelease: false
|
|
176
246
|
version_requirements: !ruby/object:Gem::Requirement
|
|
177
247
|
requirements:
|
|
178
248
|
- - "~>"
|
|
179
249
|
- !ruby/object:Gem::Version
|
|
180
|
-
version: '0.
|
|
250
|
+
version: '0.2'
|
|
181
251
|
description: "\n Mill provides a simple but useful static site generator.\n "
|
|
182
252
|
email: johnl@johnlabovitz.com
|
|
183
253
|
executables:
|
|
@@ -186,6 +256,7 @@ extensions: []
|
|
|
186
256
|
extra_rdoc_files: []
|
|
187
257
|
files:
|
|
188
258
|
- ".gitignore"
|
|
259
|
+
- Gemfile
|
|
189
260
|
- LICENSE
|
|
190
261
|
- README.md
|
|
191
262
|
- Rakefile
|
|
@@ -196,6 +267,7 @@ files:
|
|
|
196
267
|
- lib/mill/html_helpers.rb
|
|
197
268
|
- lib/mill/navigator.rb
|
|
198
269
|
- lib/mill/resource.rb
|
|
270
|
+
- lib/mill/resources/blob.rb
|
|
199
271
|
- lib/mill/resources/dir.rb
|
|
200
272
|
- lib/mill/resources/feed.rb
|
|
201
273
|
- lib/mill/resources/google_site_verification.rb
|
|
@@ -208,11 +280,17 @@ files:
|
|
|
208
280
|
- lib/mill/site.rb
|
|
209
281
|
- lib/mill/version.rb
|
|
210
282
|
- mill.gemspec
|
|
283
|
+
- test/content/a.md
|
|
284
|
+
- test/content/b/ba.md
|
|
285
|
+
- test/content/b/bb.md
|
|
286
|
+
- test/content/b/index.md
|
|
287
|
+
- test/content/index.md
|
|
288
|
+
- test/test.rb
|
|
211
289
|
homepage: http://github.com/jslabovitz/mill
|
|
212
290
|
licenses:
|
|
213
291
|
- MIT
|
|
214
292
|
metadata: {}
|
|
215
|
-
post_install_message:
|
|
293
|
+
post_install_message:
|
|
216
294
|
rdoc_options: []
|
|
217
295
|
require_paths:
|
|
218
296
|
- lib
|
|
@@ -227,9 +305,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
227
305
|
- !ruby/object:Gem::Version
|
|
228
306
|
version: '0'
|
|
229
307
|
requirements: []
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
signing_key:
|
|
308
|
+
rubygems_version: 3.2.3
|
|
309
|
+
signing_key:
|
|
233
310
|
specification_version: 4
|
|
234
311
|
summary: A simple but useful static site generator.
|
|
235
|
-
test_files:
|
|
312
|
+
test_files:
|
|
313
|
+
- test/content/a.md
|
|
314
|
+
- test/content/b/ba.md
|
|
315
|
+
- test/content/b/bb.md
|
|
316
|
+
- test/content/b/index.md
|
|
317
|
+
- test/content/index.md
|
|
318
|
+
- test/test.rb
|