munge 0.18.0 → 0.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/munge.rb +32 -31
- data/lib/munge/application.rb +7 -7
- data/lib/munge/bootloader.rb +0 -11
- data/lib/munge/cli.rb +3 -3
- data/lib/munge/cli/commands/build.rb +17 -21
- data/lib/munge/cli/commands/clean.rb +28 -33
- data/lib/munge/cli/commands/init.rb +1 -1
- data/lib/munge/cli/commands/server.rb +3 -3
- data/lib/munge/cli/dispatch.rb +56 -13
- data/lib/munge/config.rb +2 -2
- data/lib/munge/{system.rb → conglomerate.rb} +21 -14
- data/lib/munge/{system → conglomerate}/collection.rb +5 -26
- data/lib/munge/{system → conglomerate}/item_factory.rb +1 -1
- data/lib/munge/{system → conglomerate}/item_factory/content_parser.rb +1 -1
- data/lib/munge/{system → conglomerate}/item_factory/item_identifier.rb +1 -1
- data/lib/munge/conglomerate/processor.rb +138 -0
- data/lib/munge/conglomerate/reader.rb +33 -0
- data/lib/munge/{system → conglomerate}/router.rb +3 -3
- data/lib/munge/{system → conglomerate}/router/itemish.rb +1 -1
- data/lib/munge/{errors.rb → error.rb} +1 -25
- data/lib/munge/{extras → extra}/livereload.rb +5 -5
- data/lib/munge/{extras → extra}/livereload/messaging.rb +1 -1
- data/lib/munge/{extras → extra}/livereload/server.rb +1 -1
- data/lib/munge/{extras → extra}/livereload/update_client.rb +1 -1
- data/lib/munge/{extras → extra}/livereload/update_server.rb +1 -1
- data/lib/munge/{extras → extra}/livereload/vendor/livereload.js +0 -0
- data/lib/munge/{formatters → formatter}/default.rb +1 -1
- data/lib/munge/{formatters → formatter}/dots.rb +1 -1
- data/lib/munge/{formatters → formatter}/silent.rb +1 -1
- data/lib/munge/function/clean.rb +18 -0
- data/lib/munge/function/write.rb +68 -0
- data/lib/munge/go/sass.rb +5 -5
- data/lib/munge/go/sass/asset_urls.rb +2 -2
- data/lib/munge/{helpers → helper}/asset_paths.rb +1 -1
- data/lib/munge/{helpers → helper}/asset_tags.rb +1 -1
- data/lib/munge/{helpers → helper}/capture.rb +1 -1
- data/lib/munge/helper/data.rb +21 -0
- data/lib/munge/helper/define_module.rb +13 -0
- data/lib/munge/{helpers → helper}/find.rb +3 -3
- data/lib/munge/{helpers → helper}/link.rb +3 -3
- data/lib/munge/{helpers → helper}/livereload.rb +1 -1
- data/lib/munge/helper/rendering.rb +51 -0
- data/lib/munge/{helpers → helper}/tag.rb +4 -8
- data/lib/munge/item.rb +4 -5
- data/lib/munge/load.rb +60 -0
- data/lib/munge/pre_init.rb +10 -7
- data/lib/munge/{routers → router}/add_directory_index.rb +1 -1
- data/lib/munge/{routers → router}/auto_add_extension.rb +1 -1
- data/lib/munge/{routers → router}/fingerprint.rb +1 -1
- data/lib/munge/{routers → router}/remove_index_basename.rb +1 -1
- data/lib/munge/version.rb +1 -1
- data/lib/munge/vfs/dry_run.rb +28 -0
- data/lib/munge/vfs/filesystem.rb +44 -0
- data/lib/munge/vfs/memory.rb +33 -0
- data/lib/munge/write_manager/all.rb +11 -11
- data/lib/munge/write_manager/only_needed.rb +9 -9
- data/munge.gemspec +25 -17
- data/seeds/boot.rb +21 -0
- data/seeds/boot.yml +10 -0
- data/seeds/config.rb +7 -0
- data/seeds/layouts/blog_archives.html.erb +1 -1
- data/seeds/layouts/blog_index.html.erb +1 -1
- data/seeds/layouts/default.html.erb +1 -1
- data/seeds/lib/routing.rb +8 -8
- data/seeds/lib/sass.rb +1 -1
- data/seeds/lib/view_helpers.rb +3 -11
- data/seeds/rules.rb +1 -1
- data/seeds/src/home/index.html.erb +1 -1
- metadata +64 -46
- data/lib/munge/cleaner.rb +0 -31
- data/lib/munge/helpers/rendering.rb +0 -100
- data/lib/munge/init.rb +0 -45
- data/lib/munge/io/dry_run.rb +0 -31
- data/lib/munge/io/filesystem.rb +0 -38
- data/lib/munge/io/noop.rb +0 -27
- data/lib/munge/runner.rb +0 -68
- data/lib/munge/system/processor.rb +0 -52
- data/lib/munge/system/readers/filesystem.rb +0 -52
- data/lib/munge/transformers/tilt_transformer.rb +0 -40
- data/lib/munge/util/import.rb +0 -15
- data/seeds/setup.rb +0 -3
data/lib/munge/cleaner.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
module Munge
|
2
|
-
class Cleaner
|
3
|
-
def initialize(path_to_clean:, paths_to_write:, io:)
|
4
|
-
@path_to_clean = path_to_clean
|
5
|
-
@paths_to_write = paths_to_write
|
6
|
-
@io = io
|
7
|
-
end
|
8
|
-
|
9
|
-
def orphans
|
10
|
-
existing_files - @paths_to_write
|
11
|
-
end
|
12
|
-
|
13
|
-
def delete
|
14
|
-
orphans.each { |orphan| @io.rm(orphan) }
|
15
|
-
|
16
|
-
Dir.glob(File.join(@path_to_clean, "**", "*")).reverse_each do |dir|
|
17
|
-
if !File.directory?(dir)
|
18
|
-
next
|
19
|
-
end
|
20
|
-
|
21
|
-
@io.rmdir(dir)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def existing_files
|
28
|
-
Dir.glob(File.join(@path_to_clean, "**", "*")).select { |path| File.file?(path) }
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,100 +0,0 @@
|
|
1
|
-
module Munge
|
2
|
-
module Helpers
|
3
|
-
module Rendering
|
4
|
-
def render(item, engines: nil, data: {}, content_override: nil)
|
5
|
-
content = content_override || item.content
|
6
|
-
renderers = tilt_renderer_list(item, engines)
|
7
|
-
mdata = merged_data(item.frontmatter, data, self_item: item)
|
8
|
-
item_path = item.relpath
|
9
|
-
|
10
|
-
render_string(content, data: mdata, engines: renderers, template_name: item_path)
|
11
|
-
end
|
12
|
-
|
13
|
-
def layout(item_or_string, data: {}, &block)
|
14
|
-
layout_item = resolve_layout(item_or_string)
|
15
|
-
renderers = tilt_renderer_list(layout_item, nil)
|
16
|
-
mdata = merged_data(layout_item.frontmatter, data, self_layout: layout_item)
|
17
|
-
layout_path = "(layout) #{layout_item.relpath}"
|
18
|
-
|
19
|
-
render_string(layout_item.content, data: mdata, engines: renderers, template_name: layout_path, &block)
|
20
|
-
end
|
21
|
-
|
22
|
-
def render_string(content, data: {}, engines: [], template_name: nil, &block)
|
23
|
-
inner =
|
24
|
-
if block_given?
|
25
|
-
capture(&block)
|
26
|
-
end
|
27
|
-
|
28
|
-
output =
|
29
|
-
engines
|
30
|
-
.reduce(content) do |memoized_content, engine|
|
31
|
-
options = tilt_options[engine]
|
32
|
-
template = engine.new(template_name, options) { memoized_content }
|
33
|
-
|
34
|
-
template.render(self, data) { inner }
|
35
|
-
end
|
36
|
-
|
37
|
-
if block_given?
|
38
|
-
append_to_erbout(block.binding, output)
|
39
|
-
end
|
40
|
-
|
41
|
-
output
|
42
|
-
end
|
43
|
-
|
44
|
-
def render_with_layout(item, content_engines: nil, data: {}, content_override: nil)
|
45
|
-
inner = render(item, engines: content_engines, data: data, content_override: content_override)
|
46
|
-
mdata = merged_data(item.frontmatter, data, self_item: item)
|
47
|
-
|
48
|
-
if item.layout
|
49
|
-
layout(item.layout, data: mdata) do
|
50
|
-
inner
|
51
|
-
end
|
52
|
-
else
|
53
|
-
inner
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def merged_data(*data)
|
60
|
-
hash_with_string_and_symbol_keys =
|
61
|
-
data.reduce(system.global_data) do |merged, datum|
|
62
|
-
merged.merge(datum)
|
63
|
-
end
|
64
|
-
|
65
|
-
Munge::Util::SymbolHash.deep_convert(hash_with_string_and_symbol_keys)
|
66
|
-
end
|
67
|
-
|
68
|
-
def resolve_layout(item_or_string)
|
69
|
-
if item_or_string.is_a?(String)
|
70
|
-
system.layouts[item_or_string]
|
71
|
-
else
|
72
|
-
item_or_string
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def tilt_renderer_list(item, preferred_engine)
|
77
|
-
if preferred_engine
|
78
|
-
tilt_renderers_from_preferred(preferred_engine)
|
79
|
-
else
|
80
|
-
tilt_renderers_from_path(item.relpath)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def tilt_renderers_from_path(path)
|
85
|
-
::Tilt.templates_for(path)
|
86
|
-
end
|
87
|
-
|
88
|
-
def tilt_renderers_from_preferred(preferred_engines)
|
89
|
-
preferred =
|
90
|
-
if preferred_engines.is_a?(Array)
|
91
|
-
preferred_engines.flatten.join(".")
|
92
|
-
else
|
93
|
-
preferred_engines
|
94
|
-
end
|
95
|
-
|
96
|
-
::Tilt.templates_for(preferred)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
data/lib/munge/init.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
module Munge
|
2
|
-
# This class loads the user rules, as well as provides some useful methods
|
3
|
-
# for setup.
|
4
|
-
class Init
|
5
|
-
include Munge::Util::Import
|
6
|
-
|
7
|
-
# Initializing loads up the user's `setup.rb` and `rules.rb`.
|
8
|
-
def initialize(root_path:,
|
9
|
-
config:,
|
10
|
-
setup_path:,
|
11
|
-
rules_path:)
|
12
|
-
@root_path = root_path
|
13
|
-
@setup_path = setup_path
|
14
|
-
@rules_path = rules_path
|
15
|
-
@binding = binding
|
16
|
-
|
17
|
-
system = Munge::System.new(root_path, config)
|
18
|
-
|
19
|
-
import(setup_path)
|
20
|
-
|
21
|
-
@app = Munge::Application.new(system)
|
22
|
-
|
23
|
-
import(rules_path)
|
24
|
-
|
25
|
-
@app.items.each(&:freeze)
|
26
|
-
@app.items.freeze
|
27
|
-
end
|
28
|
-
|
29
|
-
# @return [String] path to user's `lib/` directory
|
30
|
-
def lib_path
|
31
|
-
File.join(root_path, "lib")
|
32
|
-
end
|
33
|
-
|
34
|
-
# Loads file into current scope. Similar to `load "filename.rb"`
|
35
|
-
#
|
36
|
-
# @return [void]
|
37
|
-
def import(file_path)
|
38
|
-
absolute_file_path = File.expand_path(file_path, root_path)
|
39
|
-
import_to_context(absolute_file_path, @binding)
|
40
|
-
end
|
41
|
-
|
42
|
-
attr_reader :app
|
43
|
-
attr_reader :root_path
|
44
|
-
end
|
45
|
-
end
|
data/lib/munge/io/dry_run.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
module Munge
|
2
|
-
module Io
|
3
|
-
# NoOp driver for writing files. This is used to compute dry-runs.
|
4
|
-
class DryRun
|
5
|
-
def initialize(driver)
|
6
|
-
@driver = driver
|
7
|
-
end
|
8
|
-
|
9
|
-
# Pretends to write, but actually does nothing
|
10
|
-
#
|
11
|
-
# @param _abspath [String]
|
12
|
-
# @param _content [String]
|
13
|
-
def write(_abspath, _content)
|
14
|
-
end
|
15
|
-
|
16
|
-
def exist?(path)
|
17
|
-
@driver.exist?(path)
|
18
|
-
end
|
19
|
-
|
20
|
-
def read(path)
|
21
|
-
@driver.read(path)
|
22
|
-
end
|
23
|
-
|
24
|
-
def rm(_path)
|
25
|
-
end
|
26
|
-
|
27
|
-
def rmdir(_path)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/munge/io/filesystem.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
module Munge
|
2
|
-
module Io
|
3
|
-
# Filesystem driver for writing files. These drivers can be defined however
|
4
|
-
# you wish, as long as the `#write` method accepts an abspath and content.
|
5
|
-
class Filesystem
|
6
|
-
# Writes content to abspath. Nonexistent directories will be created
|
7
|
-
# automatically.
|
8
|
-
#
|
9
|
-
# @param abspath [String]
|
10
|
-
# @param content [String]
|
11
|
-
def write(abspath, content)
|
12
|
-
FileUtils.mkdir_p(File.dirname(abspath))
|
13
|
-
|
14
|
-
File.write(abspath, content)
|
15
|
-
end
|
16
|
-
|
17
|
-
def exist?(path)
|
18
|
-
File.exist?(path)
|
19
|
-
end
|
20
|
-
|
21
|
-
def read(path)
|
22
|
-
File.read(path)
|
23
|
-
end
|
24
|
-
|
25
|
-
def rm(path)
|
26
|
-
File.delete(path)
|
27
|
-
end
|
28
|
-
|
29
|
-
def rmdir(path)
|
30
|
-
contents = Dir.entries(path) - %w(. ..)
|
31
|
-
|
32
|
-
if contents.empty?
|
33
|
-
Dir.rmdir(path)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/lib/munge/io/noop.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module Munge
|
2
|
-
module Io
|
3
|
-
# NoOp driver for writing files. This is used to compute dry-runs.
|
4
|
-
class Noop
|
5
|
-
# Pretends to write, but actually does nothing
|
6
|
-
#
|
7
|
-
# @param _abspath [String]
|
8
|
-
# @param _content [String]
|
9
|
-
def write(_abspath, _content)
|
10
|
-
end
|
11
|
-
|
12
|
-
def exist?(_path)
|
13
|
-
false
|
14
|
-
end
|
15
|
-
|
16
|
-
def read(_path)
|
17
|
-
""
|
18
|
-
end
|
19
|
-
|
20
|
-
def rm(_path)
|
21
|
-
end
|
22
|
-
|
23
|
-
def rmdir(_path)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/lib/munge/runner.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
module Munge
|
2
|
-
class Runner
|
3
|
-
def initialize(items:, router:, processor:, io:, reporter:, destination:, manager:)
|
4
|
-
@items = items
|
5
|
-
@router = router
|
6
|
-
@processor = processor
|
7
|
-
@io = io
|
8
|
-
@reporter = reporter
|
9
|
-
@destination = destination
|
10
|
-
@manager = manager
|
11
|
-
@written_paths = []
|
12
|
-
end
|
13
|
-
|
14
|
-
def write
|
15
|
-
@reporter.start
|
16
|
-
|
17
|
-
@items
|
18
|
-
.reject { |item| item.route.nil? }
|
19
|
-
.each { |item| render_and_write(item) }
|
20
|
-
|
21
|
-
@reporter.done
|
22
|
-
|
23
|
-
@manager.written_routes
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def render_and_write(item)
|
29
|
-
relpath = @router.filepath(item)
|
30
|
-
abspath = File.join(@destination, relpath)
|
31
|
-
route = @router.route(item)
|
32
|
-
content = @processor.transform(item)
|
33
|
-
|
34
|
-
write_status = status(abspath, content)
|
35
|
-
|
36
|
-
case write_status
|
37
|
-
when :new
|
38
|
-
@manager.on_new(route, abspath, content)
|
39
|
-
when :changed
|
40
|
-
@manager.on_changed(route, abspath, content)
|
41
|
-
when :identical
|
42
|
-
@manager.on_identical(route, abspath, content)
|
43
|
-
when :double_write_error
|
44
|
-
raise Errors::DoubleWriteError, item.route
|
45
|
-
end
|
46
|
-
|
47
|
-
@reporter.call(item, relpath, write_status)
|
48
|
-
end
|
49
|
-
|
50
|
-
def status(path, content)
|
51
|
-
if @written_paths.include?(path)
|
52
|
-
return :double_write_error
|
53
|
-
end
|
54
|
-
|
55
|
-
@written_paths.push(path)
|
56
|
-
|
57
|
-
if !@io.exist?(path)
|
58
|
-
return :new
|
59
|
-
end
|
60
|
-
|
61
|
-
if @io.read(path) == content
|
62
|
-
return :identical
|
63
|
-
end
|
64
|
-
|
65
|
-
:changed
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
module Munge
|
2
|
-
class System
|
3
|
-
class Processor
|
4
|
-
def initialize
|
5
|
-
@registry = {}
|
6
|
-
end
|
7
|
-
|
8
|
-
# Register tranformer
|
9
|
-
#
|
10
|
-
# @see Munge::Transformers::Tilt
|
11
|
-
def register(transformer)
|
12
|
-
register_manually(transformer.name, transformer)
|
13
|
-
end
|
14
|
-
|
15
|
-
# Register transformer manually
|
16
|
-
#
|
17
|
-
# @see Munge::Transformers::Tilt
|
18
|
-
# @param name [Symbol] Snake case name
|
19
|
-
# @param transformer [#call]
|
20
|
-
def register_manually(name, transformer)
|
21
|
-
if @registry.key?(name)
|
22
|
-
raise Errors::DuplicateTransformerError, name
|
23
|
-
else
|
24
|
-
@registry[name] = transformer
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# Transforms the given item's content
|
29
|
-
#
|
30
|
-
# @param item [Item]
|
31
|
-
def transform(item)
|
32
|
-
item.transforms
|
33
|
-
.map { |name, args| [get_transformer(name), args] }
|
34
|
-
.reduce(item.content) do |content, params|
|
35
|
-
transformer, args = params
|
36
|
-
|
37
|
-
transformer.call(item, content, *args)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def get_transformer(name)
|
44
|
-
if @registry.key?(name)
|
45
|
-
@registry[name]
|
46
|
-
else
|
47
|
-
raise Errors::TransformerNotFoundError, name
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
module Munge
|
2
|
-
class System
|
3
|
-
module Readers
|
4
|
-
# Enumerable list of {Munge::Item}s
|
5
|
-
class Filesystem
|
6
|
-
include Enumerable
|
7
|
-
|
8
|
-
# @param source_path [String]
|
9
|
-
def initialize(source_path)
|
10
|
-
@source_path = source_path
|
11
|
-
end
|
12
|
-
|
13
|
-
# @yield [Item]
|
14
|
-
# @return [Enumerator]
|
15
|
-
def each
|
16
|
-
return enum_for(:each) unless block_given?
|
17
|
-
|
18
|
-
filepaths =
|
19
|
-
Dir.glob(File.join(@source_path, "**", "*"))
|
20
|
-
.select { |path| File.file?(path) }
|
21
|
-
|
22
|
-
filepaths.each do |abspath|
|
23
|
-
filehash = Hash[
|
24
|
-
relpath: compute_relpath(abspath),
|
25
|
-
content: compute_content(abspath),
|
26
|
-
stat: compute_stat(abspath)
|
27
|
-
]
|
28
|
-
|
29
|
-
yield filehash
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def compute_stat(abspath)
|
36
|
-
File.stat(abspath)
|
37
|
-
end
|
38
|
-
|
39
|
-
def compute_relpath(abspath)
|
40
|
-
folder = Pathname.new(@source_path)
|
41
|
-
file = Pathname.new(abspath)
|
42
|
-
|
43
|
-
file.relative_path_from(folder).to_s
|
44
|
-
end
|
45
|
-
|
46
|
-
def compute_content(abspath)
|
47
|
-
File.read(abspath)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|