munge 0.18.0 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/lib/munge.rb +32 -31
  3. data/lib/munge/application.rb +7 -7
  4. data/lib/munge/bootloader.rb +0 -11
  5. data/lib/munge/cli.rb +3 -3
  6. data/lib/munge/cli/commands/build.rb +17 -21
  7. data/lib/munge/cli/commands/clean.rb +28 -33
  8. data/lib/munge/cli/commands/init.rb +1 -1
  9. data/lib/munge/cli/commands/server.rb +3 -3
  10. data/lib/munge/cli/dispatch.rb +56 -13
  11. data/lib/munge/config.rb +2 -2
  12. data/lib/munge/{system.rb → conglomerate.rb} +21 -14
  13. data/lib/munge/{system → conglomerate}/collection.rb +5 -26
  14. data/lib/munge/{system → conglomerate}/item_factory.rb +1 -1
  15. data/lib/munge/{system → conglomerate}/item_factory/content_parser.rb +1 -1
  16. data/lib/munge/{system → conglomerate}/item_factory/item_identifier.rb +1 -1
  17. data/lib/munge/conglomerate/processor.rb +138 -0
  18. data/lib/munge/conglomerate/reader.rb +33 -0
  19. data/lib/munge/{system → conglomerate}/router.rb +3 -3
  20. data/lib/munge/{system → conglomerate}/router/itemish.rb +1 -1
  21. data/lib/munge/{errors.rb → error.rb} +1 -25
  22. data/lib/munge/{extras → extra}/livereload.rb +5 -5
  23. data/lib/munge/{extras → extra}/livereload/messaging.rb +1 -1
  24. data/lib/munge/{extras → extra}/livereload/server.rb +1 -1
  25. data/lib/munge/{extras → extra}/livereload/update_client.rb +1 -1
  26. data/lib/munge/{extras → extra}/livereload/update_server.rb +1 -1
  27. data/lib/munge/{extras → extra}/livereload/vendor/livereload.js +0 -0
  28. data/lib/munge/{formatters → formatter}/default.rb +1 -1
  29. data/lib/munge/{formatters → formatter}/dots.rb +1 -1
  30. data/lib/munge/{formatters → formatter}/silent.rb +1 -1
  31. data/lib/munge/function/clean.rb +18 -0
  32. data/lib/munge/function/write.rb +68 -0
  33. data/lib/munge/go/sass.rb +5 -5
  34. data/lib/munge/go/sass/asset_urls.rb +2 -2
  35. data/lib/munge/{helpers → helper}/asset_paths.rb +1 -1
  36. data/lib/munge/{helpers → helper}/asset_tags.rb +1 -1
  37. data/lib/munge/{helpers → helper}/capture.rb +1 -1
  38. data/lib/munge/helper/data.rb +21 -0
  39. data/lib/munge/helper/define_module.rb +13 -0
  40. data/lib/munge/{helpers → helper}/find.rb +3 -3
  41. data/lib/munge/{helpers → helper}/link.rb +3 -3
  42. data/lib/munge/{helpers → helper}/livereload.rb +1 -1
  43. data/lib/munge/helper/rendering.rb +51 -0
  44. data/lib/munge/{helpers → helper}/tag.rb +4 -8
  45. data/lib/munge/item.rb +4 -5
  46. data/lib/munge/load.rb +60 -0
  47. data/lib/munge/pre_init.rb +10 -7
  48. data/lib/munge/{routers → router}/add_directory_index.rb +1 -1
  49. data/lib/munge/{routers → router}/auto_add_extension.rb +1 -1
  50. data/lib/munge/{routers → router}/fingerprint.rb +1 -1
  51. data/lib/munge/{routers → router}/remove_index_basename.rb +1 -1
  52. data/lib/munge/version.rb +1 -1
  53. data/lib/munge/vfs/dry_run.rb +28 -0
  54. data/lib/munge/vfs/filesystem.rb +44 -0
  55. data/lib/munge/vfs/memory.rb +33 -0
  56. data/lib/munge/write_manager/all.rb +11 -11
  57. data/lib/munge/write_manager/only_needed.rb +9 -9
  58. data/munge.gemspec +25 -17
  59. data/seeds/boot.rb +21 -0
  60. data/seeds/boot.yml +10 -0
  61. data/seeds/config.rb +7 -0
  62. data/seeds/layouts/blog_archives.html.erb +1 -1
  63. data/seeds/layouts/blog_index.html.erb +1 -1
  64. data/seeds/layouts/default.html.erb +1 -1
  65. data/seeds/lib/routing.rb +8 -8
  66. data/seeds/lib/sass.rb +1 -1
  67. data/seeds/lib/view_helpers.rb +3 -11
  68. data/seeds/rules.rb +1 -1
  69. data/seeds/src/home/index.html.erb +1 -1
  70. metadata +64 -46
  71. data/lib/munge/cleaner.rb +0 -31
  72. data/lib/munge/helpers/rendering.rb +0 -100
  73. data/lib/munge/init.rb +0 -45
  74. data/lib/munge/io/dry_run.rb +0 -31
  75. data/lib/munge/io/filesystem.rb +0 -38
  76. data/lib/munge/io/noop.rb +0 -27
  77. data/lib/munge/runner.rb +0 -68
  78. data/lib/munge/system/processor.rb +0 -52
  79. data/lib/munge/system/readers/filesystem.rb +0 -52
  80. data/lib/munge/transformers/tilt_transformer.rb +0 -40
  81. data/lib/munge/util/import.rb +0 -15
  82. data/seeds/setup.rb +0 -3
@@ -10,7 +10,7 @@ module Munge
10
10
  if @configs.key?(sym_key)
11
11
  @configs[sym_key]
12
12
  else
13
- raise Errors::ConfigKeyNotFound, sym_key
13
+ raise Error::ConfigKeyNotFound, sym_key
14
14
  end
15
15
  end
16
16
 
@@ -28,7 +28,7 @@ module Munge
28
28
  elsif key?(method_name)
29
29
  self[method_name]
30
30
  else
31
- raise Errors::ConfigKeyNotFound, method_name
31
+ raise Error::ConfigKeyNotFound, method_name
32
32
  end
33
33
  end
34
34
 
@@ -1,5 +1,5 @@
1
1
  module Munge
2
- class System
2
+ class Conglomerate
3
3
  def initialize(root_path, config)
4
4
  @root_path = root_path
5
5
  @config = config
@@ -17,28 +17,32 @@ module Munge
17
17
  return @items if @items
18
18
 
19
19
  source_path = File.expand_path(@config[:source_path], @root_path)
20
+ vfs = Vfs::Filesystem.new(source_path)
20
21
 
21
22
  @items =
22
23
  Collection.new(
23
- item_factory: item_factory,
24
- items: Readers::Filesystem.new(source_path)
24
+ items: Reader.new(vfs, item_factory)
25
25
  )
26
26
  end
27
27
 
28
28
  def layouts
29
- return @layouts if @layouts
29
+ if @layouts.nil?
30
+ layouts_path = File.expand_path(@config[:layouts_path], @root_path)
31
+ vfs = Vfs::Filesystem.new(layouts_path)
30
32
 
31
- layouts_path = File.expand_path(@config[:layouts_path], @root_path)
33
+ @layouts =
34
+ Collection.new(
35
+ items: Reader.new(vfs, item_factory)
36
+ )
32
37
 
33
- @layouts ||=
34
- Collection.new(
35
- item_factory: item_factory,
36
- items: Readers::Filesystem.new(layouts_path)
37
- )
38
+ @layouts.each(&:transform)
39
+ end
40
+
41
+ @layouts
38
42
  end
39
43
 
40
44
  def processor
41
- @processor ||= Processor.new
45
+ @processor ||= Processor.new(self)
42
46
  end
43
47
 
44
48
  def router
@@ -49,10 +53,13 @@ module Munge
49
53
  end
50
54
 
51
55
  def global_data
52
- return @global_data if @global_data
56
+ if @global_data.nil?
57
+ data_path = File.expand_path(@config[:data_path], @root_path)
58
+ loaded_file = YAML.load_file(data_path) || {}
59
+ @global_data = Munge::Util::SymbolHash.deep_convert(loaded_file)
60
+ end
53
61
 
54
- data_path = File.expand_path(@config[:data_path], @root_path)
55
- @global_data = YAML.load_file(data_path) || {}
62
+ @global_data
56
63
  end
57
64
 
58
65
  attr_reader :config
@@ -1,39 +1,18 @@
1
1
  module Munge
2
- class System
2
+ class Conglomerate
3
3
  # This class is effectively an Array of Items
4
4
  class Collection
5
5
  include Enumerable
6
6
 
7
- # @param [System::ItemFactory] item_factory
7
+ # @param [Conglomerate::ItemFactory] item_factory
8
8
  # @param [Array<Hash>] items
9
- def initialize(item_factory:,
10
- items:)
11
- @item_factory = item_factory
12
-
9
+ def initialize(items:)
13
10
  @items =
14
11
  items
15
- .map { |item| parse(**item) }
16
12
  .map { |item| [item.id, item] }
17
13
  .to_h
18
14
  end
19
15
 
20
- # @see System::ItemFactory#build
21
- # @param relpath [String]
22
- # @param content [String]
23
- # @param frontmatter [Hash]
24
- # @param stat [File::Stat]
25
- def build(**args)
26
- @item_factory.build(**args)
27
- end
28
-
29
- # @see System::ItemFactory#parse
30
- # @param relpath [String]
31
- # @param content [String]
32
- # @param stat [File::Stat]
33
- def parse(**args)
34
- @item_factory.parse(**args)
35
- end
36
-
37
16
  # @yield [Item]
38
17
  # @return [Enumerator]
39
18
  def each
@@ -48,7 +27,7 @@ module Munge
48
27
  # @return [void]
49
28
  def push(item)
50
29
  if @items.key?(item.id)
51
- raise Errors::DuplicateItemError, item.id
30
+ raise Error::DuplicateItemError, item.id
52
31
  else
53
32
  @items[item.id] = item
54
33
  end
@@ -60,7 +39,7 @@ module Munge
60
39
  if @items.key?(id)
61
40
  @items[id]
62
41
  else
63
- raise Errors::ItemNotFoundError, id
42
+ raise Error::ItemNotFoundError, id
64
43
  end
65
44
  end
66
45
 
@@ -1,5 +1,5 @@
1
1
  module Munge
2
- class System
2
+ class Conglomerate
3
3
  class ItemFactory
4
4
  # @param text_extensions [Array<String>]
5
5
  # @param ignore_extensions [Array<String>] Strings are converted to regex
@@ -1,5 +1,5 @@
1
1
  module Munge
2
- class System
2
+ class Conglomerate
3
3
  class ItemFactory
4
4
  class ContentParser
5
5
  def self.match(string)
@@ -1,5 +1,5 @@
1
1
  module Munge
2
- class System
2
+ class Conglomerate
3
3
  class ItemFactory
4
4
  class ItemIdentifier
5
5
  def initialize(remove_extensions:)
@@ -0,0 +1,138 @@
1
+ module Munge
2
+ class Conglomerate
3
+ class Processor
4
+ def initialize(conglomerate)
5
+ @conglomerate = conglomerate
6
+
7
+ @fixer_upper = FixerUpper.new
8
+ @scope_modules = [
9
+ Munge::Helper::Capture,
10
+ Munge::Helper::Find,
11
+ Munge::Helper::Link,
12
+ Munge::Helper::Rendering,
13
+ Munge::Helper::Tag,
14
+ Munge::Helper::AssetPaths,
15
+ Munge::Helper::AssetTags,
16
+ Munge::Helper::Livereload,
17
+ Munge::Helper::Data,
18
+ ]
19
+ end
20
+
21
+ def register(*names, to:, with_options: {})
22
+ @fixer_upper.register(*names, engine: to)
23
+ end
24
+
25
+ def register_tilt(*names, to:, with_options: {})
26
+ @fixer_upper.register_tilt(*names, engine: to, options: with_options)
27
+ end
28
+
29
+ def include(mod)
30
+ @scope_modules.push(mod)
31
+ end
32
+
33
+ # Transforms the given item's content
34
+ #
35
+ # @param item [Item]
36
+ def transform(item)
37
+ view_scope = new_view_scope
38
+
39
+ view_scope.data_stack.push(item.frontmatter)
40
+
41
+ if item.layout
42
+ layout_item = @conglomerate.layouts[item.layout]
43
+
44
+ transform_layout(layout_item, view_scope) do
45
+ transform_item(item, view_scope)
46
+ end
47
+ else
48
+ transform_item(item, view_scope)
49
+ end
50
+ end
51
+
52
+ def transform_item(item, view_scope)
53
+ renderer =
54
+ @fixer_upper.renderer(
55
+ filename: item.relpath,
56
+ content: item.content,
57
+ view_scope: view_scope,
58
+ engines: engines_for(item)
59
+ )
60
+
61
+ renderer.call
62
+ end
63
+
64
+ def transform_layout(layout_item, view_scope, &block)
65
+ renderer =
66
+ @fixer_upper.renderer(
67
+ filename: "(layout) #{layout_item.relpath}",
68
+ content: layout_item.content,
69
+ view_scope: view_scope,
70
+ engines: engines_for(layout_item),
71
+ block: block
72
+ )
73
+
74
+ renderer.call
75
+ end
76
+
77
+ # everything below should be considered private API
78
+
79
+ def private_transform(filename:, content:, view_scope:, engines:, block: nil)
80
+ renderer =
81
+ @fixer_upper.renderer(
82
+ filename: filename,
83
+ content: content,
84
+ view_scope: view_scope,
85
+ engines: resolved_engines(engines, resolve_extensions(filename)),
86
+ block: block
87
+ )
88
+
89
+ renderer.call
90
+ end
91
+
92
+ def engines_for(item, engine_overrides = [])
93
+ transforms = resolved_engines(item.transforms, item.extensions)
94
+ overrides = resolved_engines(engine_overrides, item.extensions)
95
+
96
+ if overrides.empty?
97
+ transforms
98
+ else
99
+ overrides
100
+ end
101
+ end
102
+
103
+ private
104
+
105
+ def new_view_scope
106
+ scope =
107
+ @scope_modules.reduce(Object.new) do |scope, mod|
108
+ scope.extend(mod)
109
+ scope
110
+ end
111
+
112
+ scope.extend(Munge::Helper::DefineModule.new(:conglomerate, @conglomerate))
113
+ scope.extend(Munge::Helper::DefineModule.new(:current_view_scope, scope))
114
+
115
+ scope.data_stack.push(@conglomerate.global_data)
116
+
117
+ scope
118
+ end
119
+
120
+ def resolved_engines(engines, extensions)
121
+ safe_engines = [engines].flatten.compact
122
+
123
+ safe_engines.flat_map do |engine|
124
+ if engine == :use_extensions
125
+ extensions.reverse
126
+ else
127
+ engine
128
+ end
129
+ end
130
+ end
131
+
132
+ def resolve_extensions(filename)
133
+ basename = File.basename(filename)
134
+ basename.split(".")[1..-1]
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,33 @@
1
+ module Munge
2
+ class Conglomerate
3
+ # Enumerable list of {Munge::Item}s
4
+ class Reader
5
+ include Enumerable
6
+
7
+ # @param source_path [String]
8
+ def initialize(vfs, item_factory)
9
+ @vfs = vfs
10
+ @item_factory = item_factory
11
+ end
12
+
13
+ # @yield [Item]
14
+ # @return [Enumerator]
15
+ def each
16
+ return enum_for(:each) unless block_given?
17
+
18
+ filepaths = @vfs.tree
19
+
20
+ filepaths.each do |relpath|
21
+ item =
22
+ @item_factory.parse(
23
+ relpath: relpath,
24
+ content: @vfs.read(relpath),
25
+ stat: @vfs.stat(relpath)
26
+ )
27
+
28
+ yield item
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,5 +1,5 @@
1
1
  module Munge
2
- class System
2
+ class Conglomerate
3
3
  class Router
4
4
  def initialize(processor:)
5
5
  @registries = { route: [], filepath: [] }
@@ -13,7 +13,7 @@ module Munge
13
13
  when :filepath
14
14
  @registries[:filepath].push(router)
15
15
  else
16
- raise Errors::InvalidRouterError, router.type
16
+ raise Error::InvalidRouterError, router.type
17
17
  end
18
18
  end
19
19
 
@@ -32,7 +32,7 @@ module Munge
32
32
 
33
33
  def route_mapper(item, method_name, initial_route = nil)
34
34
  if !item.route && !initial_route
35
- raise Errors::ItemHasNoRouteError, item.relpath
35
+ raise Error::ItemHasNoRouteError, item.relpath
36
36
  end
37
37
 
38
38
  itemish = Itemish.new(item, @processor)
@@ -1,5 +1,5 @@
1
1
  module Munge
2
- class System
2
+ class Conglomerate
3
3
  class Router
4
4
  class Itemish
5
5
  extend Forwardable
@@ -1,5 +1,5 @@
1
1
  module Munge
2
- module Errors
2
+ module Error
3
3
  class Base < StandardError
4
4
  end
5
5
 
@@ -41,30 +41,6 @@ module Munge
41
41
  end
42
42
  end
43
43
 
44
- class DuplicateTransformerError < Base
45
- include ErrorWithIdentifier
46
-
47
- def message
48
- "already registered transformer `#{@identifier}`"
49
- end
50
- end
51
-
52
- class TransformerNotFoundError < Base
53
- include ErrorWithIdentifier
54
-
55
- def message
56
- "transformer `#{@identifier}` is not installed"
57
- end
58
- end
59
-
60
- class InvalidRouterError < Base
61
- include ErrorWithIdentifier
62
-
63
- def message
64
- "invalid router with type #{@identifier}"
65
- end
66
- end
67
-
68
44
  class ConfigRbNotFound < Base
69
45
  include ErrorWithIdentifier
70
46
 
@@ -2,14 +2,14 @@ if Gem.loaded_specs.key?("reel")
2
2
  require "celluloid/current"
3
3
  require "reel"
4
4
 
5
- require "munge/extras/livereload/update_server"
6
- require "munge/extras/livereload/update_client"
7
- require "munge/extras/livereload/messaging"
8
- require "munge/extras/livereload/server"
5
+ require "munge/extra/livereload/update_server"
6
+ require "munge/extra/livereload/update_client"
7
+ require "munge/extra/livereload/messaging"
8
+ require "munge/extra/livereload/server"
9
9
  end
10
10
 
11
11
  module Munge
12
- module Extras
12
+ module Extra
13
13
  module Livereload
14
14
  class Main
15
15
  def initialize(activated)
@@ -1,5 +1,5 @@
1
1
  module Munge
2
- module Extras
2
+ module Extra
3
3
  module Livereload
4
4
  class Messaging
5
5
  def hello
@@ -1,5 +1,5 @@
1
1
  module Munge
2
- module Extras
2
+ module Extra
3
3
  module Livereload
4
4
  class Server < Reel::Server::HTTP
5
5
  def initialize(host = "127.0.0.1", port = 35729)