munge 0.4.0 → 0.5.0.beta1

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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +10 -0
  4. data/Makefile +21 -0
  5. data/README.md +1 -1
  6. data/exe/munge +6 -0
  7. data/lib/munge/application.rb +11 -53
  8. data/lib/munge/bootstrap.rb +63 -0
  9. data/lib/munge/cli.rb +5 -17
  10. data/lib/munge/commands/view.rb +46 -0
  11. data/lib/munge/core/alterant.rb +2 -2
  12. data/lib/munge/core/collection.rb +1 -1
  13. data/lib/munge/core/item_factory/content_parser.rb +9 -13
  14. data/lib/munge/core/item_factory.rb +1 -24
  15. data/lib/munge/core/router/itemish.rb +22 -0
  16. data/lib/munge/core/router.rb +33 -42
  17. data/lib/munge/helper/capture.rb +24 -0
  18. data/lib/munge/helper/find.rb +4 -0
  19. data/lib/munge/helper/link.rb +6 -1
  20. data/lib/munge/helper/rendering.rb +0 -2
  21. data/lib/munge/item.rb +2 -2
  22. data/lib/munge/routers/add_index_html.rb +36 -0
  23. data/lib/munge/routers/auto_add_extension.rb +44 -0
  24. data/lib/munge/routers/fingerprint.rb +60 -0
  25. data/lib/munge/routers/remove_index_basename.rb +35 -0
  26. data/lib/munge/runner.rb +10 -6
  27. data/lib/munge/system.rb +54 -0
  28. data/lib/munge/transformer/tilt.rb +7 -3
  29. data/lib/munge/util/config.rb +28 -0
  30. data/lib/munge/util/path.rb +58 -0
  31. data/lib/munge/util/symbol_hash.rb +35 -0
  32. data/lib/munge/version.rb +1 -1
  33. data/lib/munge.rb +11 -4
  34. data/munge.gemspec +1 -0
  35. data/seeds/config.yml +1 -0
  36. data/seeds/data.yml +1 -0
  37. data/seeds/layouts/default.html.erb +5 -2
  38. data/seeds/layouts/sitemap.html.erb +6 -0
  39. data/seeds/rules.rb +19 -2
  40. data/seeds/setup.rb +15 -0
  41. data/seeds/src/_vars.scss +6 -0
  42. data/seeds/src/about.html.erb +11 -0
  43. data/seeds/src/basic.css.scss +41 -0
  44. data/seeds/src/index.html.erb +34 -0
  45. metadata +37 -7
  46. data/lib/munge/core/config.rb +0 -23
  47. data/lib/munge/helper.rb +0 -4
@@ -0,0 +1,44 @@
1
+ module Munge
2
+ module Router
3
+ class AutoAddExtension
4
+ def initialize(keep_extensions:)
5
+ @keep_extensions = keep_extensions
6
+ end
7
+
8
+ def type
9
+ :route
10
+ end
11
+
12
+ def match?(initial_route, item)
13
+ item_should_have_extension?(item) && route_doesnt_have_extension?(initial_route)
14
+ end
15
+
16
+ def call(initial_route, item)
17
+ add_extension(initial_route, item)
18
+ end
19
+
20
+ private
21
+
22
+ def add_extension(initial_route, item)
23
+ intersection = item.extensions & @keep_extensions
24
+ extension = intersection[0]
25
+
26
+ "#{initial_route}.#{extension}"
27
+ end
28
+
29
+ def item_should_have_extension?(item)
30
+ intersection = item.extensions & @keep_extensions
31
+
32
+ intersection.length > 0
33
+ end
34
+
35
+ def route_doesnt_have_extension?(initial_route)
36
+ initial_route_extensions = initial_route.split(".")[1..-1]
37
+
38
+ intersection = initial_route_extensions & @keep_extensions
39
+
40
+ intersection.length == 0
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,60 @@
1
+ module Munge
2
+ module Router
3
+ class Fingerprint
4
+ def initialize(extensions:,
5
+ separator:)
6
+ @extensions = extensions
7
+ @separator = separator
8
+ end
9
+
10
+ def type
11
+ :route
12
+ end
13
+
14
+ def match?(_initial_route, item)
15
+ if item.frontmatter.key?(:fingerprint_asset)
16
+ return item.frontmatter[:fingerprint_asset]
17
+ end
18
+
19
+ intersection = item.extensions & @extensions
20
+
21
+ if intersection.size == 0
22
+ false
23
+ else
24
+ true
25
+ end
26
+ end
27
+
28
+ def call(initial_route, item)
29
+ generate_link(initial_route, item.compiled_content)
30
+ end
31
+
32
+ private
33
+
34
+ def generate_link(initial_route, content)
35
+ pre, extension = disassemble(initial_route)
36
+ asset_hash = hash(content)
37
+
38
+ if extension == ""
39
+ "#{pre}#{@separator}#{asset_hash}"
40
+ else
41
+ "#{pre}#{@separator}#{asset_hash}.#{extension}"
42
+ end
43
+ end
44
+
45
+ def hash(content)
46
+ Digest::MD5.hexdigest(content)
47
+ end
48
+
49
+ def disassemble(path)
50
+ extension = Util::Path.extname(path)
51
+ path_without_extension = Util::Path.path_no_extension(path)
52
+
53
+ [
54
+ path_without_extension,
55
+ extension
56
+ ]
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,35 @@
1
+ module Munge
2
+ module Router
3
+ class RemoveIndexBasename
4
+ def initialize(html_extensions:, index:)
5
+ @html_extensions = html_extensions
6
+ @index = index
7
+ @index_basename = Munge::Util::Path.basename_no_extension(@index)
8
+ end
9
+
10
+ def type
11
+ :route
12
+ end
13
+
14
+ def match?(initial_route, item)
15
+ item_is_html?(item) && basename_is_index?(initial_route)
16
+ end
17
+
18
+ def call(initial_route, _item)
19
+ Munge::Util::Path.dirname(initial_route)
20
+ end
21
+
22
+ private
23
+
24
+ def item_is_html?(item)
25
+ intersection = item.extensions & @html_extensions
26
+
27
+ intersection.length > 0
28
+ end
29
+
30
+ def basename_is_index?(route)
31
+ File.basename(route) == @index_basename
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/munge/runner.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Munge
2
2
  class Runner
3
3
  class << self
4
- def method_missing(method, config_path, rules_path, *args)
5
- runner = new(config_path, rules_path)
4
+ def method_missing(method, root_path, *args)
5
+ runner = new(application(root_path))
6
6
  runner.public_send(method, *args)
7
7
  end
8
8
 
@@ -13,12 +13,16 @@ module Munge
13
13
  super
14
14
  end
15
15
  end
16
- end
17
16
 
18
- def initialize(config_path, rules_path)
19
- @app = app = Munge::Application.new(config_path)
17
+ def application(root_path)
18
+ bootstrap = Munge::Bootstrap.new_from_dir(root_path: root_path)
19
+
20
+ bootstrap.app
21
+ end
22
+ end
20
23
 
21
- binding.eval(File.read(rules_path), rules_path)
24
+ def initialize(application)
25
+ @app = application
22
26
  end
23
27
 
24
28
  def write
@@ -0,0 +1,54 @@
1
+ module Munge
2
+ class System
3
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
4
+ def initialize(root_path, config)
5
+ source_path = File.expand_path(config[:source], root_path)
6
+ layouts_path = File.expand_path(config[:layouts], root_path)
7
+ output_path = File.expand_path(config[:output], root_path)
8
+ data_path = File.expand_path(config[:data], root_path)
9
+
10
+ @global_data = YAML.load_file(data_path) || {}
11
+
12
+ @config = config
13
+
14
+ @item_factory =
15
+ Core::ItemFactory.new(
16
+ text_extensions: config[:text_extensions],
17
+ ignored_basenames: config[:ignored_basenames]
18
+ )
19
+
20
+ @source =
21
+ Core::Collection.new(
22
+ item_factory: @item_factory,
23
+ items: Reader::Filesystem.new(source_path)
24
+ )
25
+
26
+ @layouts =
27
+ Core::Collection.new(
28
+ item_factory: @item_factory,
29
+ items: Reader::Filesystem.new(layouts_path)
30
+ )
31
+
32
+ @alterant =
33
+ Core::Alterant.new(scope: self)
34
+
35
+ @router =
36
+ Core::Router.new(
37
+ alterant: @alterant
38
+ )
39
+
40
+ @writer =
41
+ Core::Write.new(
42
+ output: output_path
43
+ )
44
+ end
45
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
46
+
47
+ attr_accessor :alterant
48
+ attr_accessor :config
49
+ attr_accessor :global_data
50
+ attr_accessor :router
51
+ attr_accessor :source
52
+ attr_accessor :writer
53
+ end
54
+ end
@@ -3,6 +3,7 @@ module Munge
3
3
  class Tilt
4
4
  def initialize(scope)
5
5
  @pristine_scope = scope
6
+ @registry = []
6
7
  end
7
8
 
8
9
  def name
@@ -16,12 +17,15 @@ module Munge
16
17
  dirty_scope.render_with_layout(item, content_engines: renderer, content_override: content)
17
18
  end
18
19
 
20
+ def register(helper)
21
+ @registry.push(helper)
22
+ end
23
+
19
24
  private
20
25
 
21
26
  def extend_with_helpers(scope)
22
- Munge::Helper.constants
23
- .map { |sym| Munge::Helper.const_get(sym) }
24
- .inject(scope) { |scope, helper| scope.extend(helper) }
27
+ @registry
28
+ .inject(scope) { |a, e| a.extend(e) }
25
29
  end
26
30
  end
27
31
  end
@@ -0,0 +1,28 @@
1
+ module Munge
2
+ module Util
3
+ class Config
4
+ class << self
5
+ def read(path)
6
+ abspath = File.expand_path(path)
7
+
8
+ yaml = read_yaml(abspath)
9
+
10
+ config =
11
+ if yaml.is_a?(Hash)
12
+ yaml
13
+ else
14
+ {}
15
+ end
16
+
17
+ Munge::Util::SymbolHash.deep_convert(config)
18
+ end
19
+
20
+ private
21
+
22
+ def read_yaml(abspath)
23
+ YAML.load_file(abspath)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,58 @@
1
+ module Munge
2
+ module Util
3
+ class Path
4
+ def self.dirname(path)
5
+ path_parts = path.split("/")
6
+ path_parts[0..-2].join("/")
7
+ end
8
+
9
+ def self.extname(path)
10
+ basename = File.basename(path)
11
+ basename_parts = basename.split(".")
12
+
13
+ if basename_parts.length > 1
14
+ basename_parts[-1]
15
+ else
16
+ ""
17
+ end
18
+ end
19
+
20
+ def self.basename_no_extension(path)
21
+ basename = File.basename(path)
22
+ basename_parts = basename.split(".")
23
+
24
+ basename_parts[0] || ""
25
+ end
26
+
27
+ def self.path_no_extension(path)
28
+ extension = extname(path)
29
+
30
+ if extension == ""
31
+ path
32
+ else
33
+ path.sub(/\.#{extension}/, "")
34
+ end
35
+ end
36
+
37
+ def self.ensure_abspath(path)
38
+ correct = path.squeeze("/")
39
+
40
+ if correct[0] == "/"
41
+ correct
42
+ else
43
+ "/#{correct}"
44
+ end
45
+ end
46
+
47
+ def self.ensure_relpath(path)
48
+ correct = path.squeeze("/")
49
+
50
+ if correct[0] == "/"
51
+ correct[1..-1]
52
+ else
53
+ correct
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,35 @@
1
+ module Munge
2
+ module Util
3
+ class SymbolHash
4
+ class << self
5
+ def deep_convert(obj)
6
+ if obj.is_a?(Hash)
7
+ convert_hash(obj)
8
+ elsif obj.is_a?(Array)
9
+ obj.map do |i|
10
+ deep_convert(i)
11
+ end
12
+ else
13
+ obj
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def convert_hash(obj)
20
+ converted_hash = {}
21
+
22
+ obj.each do |key, value|
23
+ if key.is_a?(String) || key.is_a?(Symbol)
24
+ converted_hash[key.to_sym] = deep_convert(value)
25
+ else
26
+ converted_hash[key] = value
27
+ end
28
+ end
29
+
30
+ converted_hash
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/munge/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Munge
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0.beta1"
3
3
  end
data/lib/munge.rb CHANGED
@@ -1,25 +1,32 @@
1
1
  require "fileutils"
2
+ require "forwardable"
2
3
  require "pathname"
3
4
  require "set"
4
5
  require "yaml"
5
6
 
6
- require "adsf"
7
- require "rack"
8
7
  require "tilt"
9
8
 
10
9
  require "munge/version"
11
10
  require "munge/item"
12
- require "munge/helper"
11
+ require "munge/util/path"
12
+ require "munge/util/symbol_hash"
13
+ require "munge/util/config"
14
+ require "munge/helper/capture"
13
15
  require "munge/helper/find"
14
16
  require "munge/helper/link"
15
17
  require "munge/helper/rendering"
16
18
  require "munge/transformer/tilt"
17
19
  require "munge/readers/filesystem"
18
- require "munge/core/config"
20
+ require "munge/routers/auto_add_extension"
21
+ require "munge/routers/fingerprint"
22
+ require "munge/routers/add_index_html"
23
+ require "munge/routers/remove_index_basename"
19
24
  require "munge/core/router"
20
25
  require "munge/core/item_factory"
21
26
  require "munge/core/collection"
22
27
  require "munge/core/write"
23
28
  require "munge/core/alterant"
29
+ require "munge/system"
24
30
  require "munge/application"
25
31
  require "munge/runner"
32
+ require "munge/bootstrap"
data/munge.gemspec CHANGED
@@ -34,4 +34,5 @@ Gem::Specification.new do |spec|
34
34
  spec.add_runtime_dependency "adsf", "~> 1.2"
35
35
  spec.add_runtime_dependency "thor", "~> 0.19"
36
36
  spec.add_runtime_dependency "tilt", "~> 2.0"
37
+ spec.add_runtime_dependency "sass", "~> 3.4"
37
38
  end
data/seeds/config.yml CHANGED
@@ -3,6 +3,7 @@ output: dest
3
3
  data: data.yml
4
4
  layouts: layouts
5
5
  index: index.html
6
+ fingeprint_separator: "-"
6
7
  text_extensions:
7
8
  - html
8
9
  - htm
data/seeds/data.yml CHANGED
@@ -1 +1,2 @@
1
1
  ---
2
+ site_name: Munge
@@ -2,9 +2,12 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
- <title>Munge</title>
5
+ <title><%= site_name %></title>
6
+ <link rel="stylesheet" href="<%= url_for(items["basic.css.scss"]) %>" media="screen" charset="utf-8">
6
7
  </head>
7
8
  <body>
8
- <%= yield %>
9
+ <div class="layout">
10
+ <%= yield %>
11
+ </div>
9
12
  </body>
10
13
  </html>
@@ -0,0 +1,6 @@
1
+ <h2>Sitemap</h2>
2
+ <ul>
3
+ <% sitemap_pages.each do |page| %>
4
+ <li><%= link_to page, page[:title] %></li>
5
+ <% end %>
6
+ </ul>
data/seeds/rules.rb CHANGED
@@ -1,5 +1,22 @@
1
+ # HTML rules
1
2
  app.source
2
- .select { |item| item.id == "" }
3
- .each { |item| item.route = "/" }
3
+ .select { |item| item.extensions.include?("html") }
4
+ .each { |item| item.route = item.id }
4
5
  .each { |item| item.layout = "default" }
5
6
  .each { |item| item.transform }
7
+
8
+ # CSS rules
9
+ app.source
10
+ .select { |item| item.extensions.include?("scss") }
11
+ .reject { |item| item.basename[0] == "_" }
12
+ .each { |item| item.route = "/styles/#{item.basename}.css" }
13
+ .each { |item| item.transform }
14
+
15
+ # Sitemap
16
+ html_pages =
17
+ app.source
18
+ .reject { |item| item.route.nil? }
19
+ .select { |item| item.extensions.include?("html") }
20
+ .sort_by { |item| item.route }
21
+
22
+ system.global_data[:sitemap_pages] = html_pages
data/seeds/setup.rb ADDED
@@ -0,0 +1,15 @@
1
+ require "sass"
2
+ Sass.load_paths << File.expand_path(system.config[:source], File.dirname(__FILE__))
3
+
4
+ tilt_transformer = Transformer::Tilt.new(system)
5
+ tilt_transformer.register(Munge::Helper::Capture)
6
+ tilt_transformer.register(Munge::Helper::Find)
7
+ tilt_transformer.register(Munge::Helper::Link)
8
+ tilt_transformer.register(Munge::Helper::Rendering)
9
+
10
+ system.alterant.register(tilt_transformer)
11
+
12
+ system.router.register(Router::Fingerprint.new(extensions: system.config[:keep_extensions], separator: system.config[:fingeprint_separator]))
13
+ system.router.register(Router::RemoveIndexBasename.new(html_extensions: system.config[:text_extensions], index: system.config[:index]))
14
+ system.router.register(Router::AddIndexHtml.new(html_extensions: system.config[:text_extensions], index: system.config[:index]))
15
+ system.router.register(Router::AutoAddExtension.new(keep_extensions: system.config[:keep_extensions]))
@@ -0,0 +1,6 @@
1
+ $color-bg: #fff;
2
+ $color-fg: #0f0f0f;
3
+
4
+ $layout-width: 600px;
5
+
6
+ $golden: 1.618;
@@ -0,0 +1,11 @@
1
+ ---
2
+ title: About
3
+ ---
4
+
5
+ <h1>About</h1>
6
+
7
+ <p>
8
+ This is an example of a cool About page.
9
+ </p>
10
+
11
+ <%= render(layouts["sitemap"]) %>
@@ -0,0 +1,41 @@
1
+ @import "vars";
2
+
3
+ body {
4
+ background-color: $color-bg;
5
+ color: $color-fg;
6
+ font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
7
+ font-size: 16px;
8
+ line-height: $golden * 1em;
9
+ margin: $golden * 1em;
10
+ }
11
+
12
+ h1 {
13
+ font-size: $golden * $golden * 1em;
14
+ font-weight: normal;
15
+ line-height: $golden * 1em;
16
+ margin: 0;
17
+ }
18
+
19
+ h2 {
20
+ font-size: $golden * 1em;
21
+ font-weight: normal;
22
+ line-height: $golden;
23
+ margin: 0;
24
+ }
25
+
26
+ p {
27
+ margin: $golden * 0.5em 0;
28
+ }
29
+
30
+ code {
31
+ font-family: "Courier New", Courier, monospace;
32
+ }
33
+
34
+ ul {
35
+ margin: $golden * 0.5em 0;
36
+ }
37
+
38
+ .layout {
39
+ width: $layout-width;
40
+ margin: 0 auto;
41
+ }
@@ -3,3 +3,37 @@ title: Welcome
3
3
  ---
4
4
 
5
5
  <h1><%= title %></h1>
6
+
7
+ <h2>Getting started</h2>
8
+
9
+ <p>
10
+ <strong><code>rules.rb</code>:</strong>
11
+ The routing rules are defined in this file.
12
+ </p>
13
+
14
+ <p>
15
+ <strong><code>setup.rb</code>:</strong>
16
+ Plugins, gems, etc can be configured in this file.
17
+ </p>
18
+
19
+ <p>
20
+ <strong><code>data.yml</code>:</strong>
21
+ The keys defined in this file are accessible in every file that you author.
22
+ </p>
23
+
24
+ <p>
25
+ <strong><code>config.yml</code>:</strong>
26
+ The keys defined here are used to change the behavior of the app.
27
+ Many of the keys are passed directly into the initializers in
28
+ <code>setup.rb</code>.
29
+ </p>
30
+
31
+ <h2>Links</h2>
32
+
33
+ <ul>
34
+ <li><a href="https://github.com/zachahn/munge">Munge homepage</a></li>
35
+ <li><a href="https://github.com/zachahn/munge/issues">Munge issues</a></li>
36
+ <li><a href="https://rubygems.org/gems/munge">Gem homepage</a></li>
37
+ </ul>
38
+
39
+ <%= render(layouts["sitemap"]) %>