archival 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7403410bc5164f3be23c22494a716fe7af6d6e805fc38ddb12c920bed918dba7
4
- data.tar.gz: ebb064928f3295b914609a9751c11cf663ae54af6671b655def56f5d03dab93e
3
+ metadata.gz: 6d3848687ae065595e19f5b75bb50927318e81df6d6b878541b2ef44138f9d31
4
+ data.tar.gz: 7a48ab3c689dcbb886f2441216750729ec892e40d6dc0a39197fba17eb9c4ab2
5
5
  SHA512:
6
- metadata.gz: 866d33fea5f99757f5a5a01254769ba4a1527341f0f68df03c0daeda38fc642a5177c011d18a902937b72027c2061f92efb0eddea765eae295b520c562188f74
7
- data.tar.gz: 802638fe184d75b2596bfbb378e02fe8de985bfdda46463dcba009937493faef442c65280307a7d3d25fd3ecbc762584846d305f3e7ceb2cf4bf4949cfe5d057
6
+ metadata.gz: '039d5ae09373d249e90fd850e7bd68970ae5ad3c394ed452016e4acaca4df5063d1aab818a09f9a365af9e3277b777257c27d2c4cc365b7d8daafcb33842e8a3'
7
+ data.tar.gz: 6246274ed1209a20819616480c7a1ffde1422b1a68bf5e728a3b637e61ac8675e2bc8fafa8a003cedac455e11ca21e5f22ef9039de96d95f1fc5dcab0f93111b
data/.rubocop.yml CHANGED
@@ -30,7 +30,7 @@ Metrics/BlockLength:
30
30
  Max: 150
31
31
 
32
32
  Metrics/ClassLength:
33
- Max: 150
33
+ Max: 200
34
34
 
35
35
  Metrics/CyclomaticComplexity:
36
36
  Max: 10
data/Gemfile CHANGED
@@ -7,4 +7,4 @@ gemspec
7
7
 
8
8
  gem 'rake', '~> 13.0'
9
9
  gem 'rspec', '~> 3.0'
10
- gem 'rubocop', '~> 1.22', require: false
10
+ gem 'rubocop', '~> 1.23', require: false
data/archival.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'archival'
5
- s.version = '0.0.7'
5
+ s.version = '0.0.8'
6
6
  s.summary = 'An incredibly simple CMS for durable websites'
7
7
  s.description = 'https://jesseditson.com/the-simplest-cms-part-1'
8
8
  s.authors = ['Jesse Ditson']
@@ -26,4 +26,8 @@ Gem::Specification.new do |s|
26
26
  s.add_dependency 'listen', '~> 3.7.0'
27
27
  s.add_dependency 'redcarpet', '~> 3.5.1'
28
28
  s.add_dependency 'tomlrb', '~> 2.0.1'
29
+
30
+ s.metadata = {
31
+ 'rubygems_mfa_required' => 'true'
32
+ }
29
33
  end
@@ -2,12 +2,8 @@
2
2
 
3
3
  require 'liquid'
4
4
  require 'tomlrb'
5
- require 'tags/layout'
6
5
  require 'redcarpet'
7
6
 
8
- Liquid::Template.error_mode = :strict
9
- Liquid::Template.register_tag('layout', Layout)
10
-
11
7
  module Archival
12
8
  class DuplicateKeyError < StandardError
13
9
  end
@@ -17,38 +13,33 @@ module Archival
17
13
 
18
14
  def initialize(config, *_args)
19
15
  @config = config
20
- @markdown = Redcarpet::Markdown.new(
21
- Redcarpet::Render::HTML.new(prettify: true,
22
- hard_wrap: true), no_intra_emphasis: true,
23
- fenced_code_blocks: true,
24
- autolink: true,
25
- strikethrough: true,
26
- underline: true
27
- )
28
16
  refresh_config
29
17
  end
30
18
 
19
+ def pages_dir
20
+ File.join(@config.root, @config.pages_dir)
21
+ end
22
+
23
+ def objects_dir
24
+ File.join(@config.root, @config.objects_dir)
25
+ end
26
+
31
27
  def refresh_config
32
28
  @file_system = Liquid::LocalFileSystem.new(
33
- File.join(@config.root, @config.pages_dir), '%s.liquid'
29
+ pages_dir, '%s.liquid'
34
30
  )
35
- @variables = {}
36
31
  @object_types = {}
37
32
  @page_templates = {}
38
- @dynamic_pages = Set.new
33
+ @dynamic_types = Set.new
39
34
  @dynamic_templates = {}
35
+ @parser = Archival::Parser.new(pages_dir)
40
36
 
41
37
  Liquid::Template.file_system = Liquid::LocalFileSystem.new(
42
- File.join(@config.root, @config.pages_dir), '_%s.liquid'
38
+ pages_dir, '_%s.liquid'
43
39
  )
44
40
 
45
- objects_definition_file = File.join(@config.root,
46
- 'objects.toml')
47
- if File.file? objects_definition_file
48
- @object_types = Tomlrb.load_file(objects_definition_file)
49
- end
41
+ @objects_definition_file = File.join(@config.root, 'objects.toml')
50
42
 
51
- update_objects
52
43
  update_pages
53
44
  end
54
45
 
@@ -57,12 +48,40 @@ module Archival
57
48
  refresh_config
58
49
  end
59
50
 
60
- def update_pages
61
- do_update_pages(File.join(@config.root, @config.pages_dir))
51
+ def update_objects(_updated_objects = nil)
52
+ @object_types = {}
53
+ if File.file? @objects_definition_file
54
+ @object_types = Tomlrb.load_file(@objects_definition_file)
55
+ end
56
+ @dynamic_types = Set.new
57
+ @object_types.each do |_name, definition|
58
+ is_template = definition.key? 'template'
59
+ @dynamic_types << definition['template'] if is_template
60
+ end
61
+ # TODO: remove deleted dynamic pages
62
+ end
63
+
64
+ def update_pages(_updated_pages = nil, _updated_objects = nil)
65
+ update_objects
66
+ # TODO: remove deleted pages
67
+ do_update_pages(pages_dir)
68
+ end
69
+
70
+ def update_assets(changes)
71
+ changes.each do |change|
72
+ asset_path = File.join(@config.build_dir, change.path)
73
+ case change.type
74
+ when :removed
75
+ FileUtils.rm_rf asset_path
76
+ else
77
+ puts change.path
78
+ FileUtils.copy_entry File.join(@config.root, change.path), asset_path
79
+ end
80
+ end
62
81
  end
63
82
 
64
83
  def dynamic?(file)
65
- @dynamic_pages.include? File.basename(file, '.liquid')
84
+ @dynamic_types.include? File.basename(file, '.liquid')
66
85
  end
67
86
 
68
87
  def template_for_page(template_file)
@@ -96,34 +115,44 @@ module Archival
96
115
  end
97
116
  end
98
117
 
99
- def update_objects
100
- do_update_objects(File.join(@config.root,
101
- @config.objects_dir))
118
+ def read_objects(type)
119
+ obj_dir = File.join(objects_dir, type)
120
+ return unless File.directory? obj_dir
121
+
122
+ Dir.foreach(obj_dir) do |file|
123
+ if file.end_with? '.toml'
124
+ object = Tomlrb.load_file(File.join(
125
+ obj_dir, file
126
+ ))
127
+ object[:name] =
128
+ File.basename(file, '.toml')
129
+ yield object[:name], object
130
+ end
131
+ end
132
+ end
133
+
134
+ def path_for_template(name, type)
135
+ Pathname.new(File.join(pages_dir, type, "#{name}.html"))
102
136
  end
103
137
 
104
- def do_update_objects(dir)
138
+ def objects_for_template(template_path)
105
139
  objects = {}
106
- @object_types.each do |name, definition|
107
- objects[name] = {}
108
- obj_dir = File.join(dir, name)
109
- if File.directory? obj_dir
110
- Dir.foreach(obj_dir) do |file|
111
- if file.end_with? '.toml'
112
- object = Tomlrb.load_file(File.join(
113
- obj_dir, file
114
- ))
115
- object[:name] =
116
- File.basename(file, '.toml')
117
- objects[name][object[:name]] = parse_object(object, definition)
118
- if definition.key? 'template'
119
- @dynamic_pages << definition['template']
120
- end
121
- end
140
+ @object_types.each do |type, definition|
141
+ objects[type] = {}
142
+ is_dynamic = @dynamic_types.include? type
143
+ read_objects type do |name, object|
144
+ objects[type][name] = @parser.parse_object(
145
+ object, definition, template_path
146
+ )
147
+ if is_dynamic
148
+ path = path_for_template(name, type)
149
+ objects[type][name]['path'] =
150
+ path.relative_path_from(File.dirname(template_path)).to_s
122
151
  end
123
152
  end
124
- objects[name] = sort_objects(objects[name])
153
+ objects[type] = sort_objects(objects[type])
125
154
  end
126
- @variables['objects'] = objects
155
+ objects
127
156
  end
128
157
 
129
158
  def sort_objects(objects)
@@ -142,28 +171,28 @@ module Archival
142
171
  sorted_objects
143
172
  end
144
173
 
145
- def parse_object(object, definition)
146
- definition.each do |name, type|
147
- case type
148
- when 'markdown'
149
- object[name] = @markdown.render(object[name]) if object[name]
150
- end
151
- end
152
- object
153
- end
154
-
155
- def set_var(name, value)
156
- @variables[name] = value
157
- end
158
-
159
174
  def render(page)
175
+ dir = File.join(pages_dir, File.dirname(page))
160
176
  template = @page_templates[page]
161
- template.render(@variables)
162
- end
163
-
164
- def render_dynamic(page, obj)
165
- template = @dynamic_templates[page]
166
- template.render(@variables.merge({ page => obj }))
177
+ template_path = File.join(dir, page)
178
+ parsed_objects = objects_for_template(template_path)
179
+ template.render('objects' => parsed_objects,
180
+ 'template_path' => template_path)
181
+ end
182
+
183
+ def render_dynamic(type, name)
184
+ dir = File.join(pages_dir, type)
185
+ template = @dynamic_templates[type]
186
+ template_path = File.join(dir, name)
187
+ parsed_objects = objects_for_template(template_path)
188
+ obj = parsed_objects[type][name]
189
+ vars = {}
190
+ .merge(
191
+ 'objects' => parsed_objects,
192
+ 'template_path' => template_path
193
+ )
194
+ .merge({ type => obj })
195
+ template.render(vars)
167
196
  end
168
197
 
169
198
  def write_all
@@ -172,30 +201,29 @@ module Archival
172
201
  out_dir = File.join(@config.build_dir,
173
202
  File.dirname(template))
174
203
  Dir.mkdir(out_dir) unless File.exist? out_dir
175
- out_path = File.join(out_dir,
176
- "#{template}.html")
204
+ out_path = File.join(out_dir, "#{template}.html")
177
205
  File.open(out_path, 'w+') do |file|
178
206
  file.write(render(template))
179
207
  end
180
208
  end
181
- @dynamic_pages.each do |page|
182
- out_dir = File.join(@config.build_dir, page)
209
+ @dynamic_types.each do |type|
210
+ out_dir = File.join(@config.build_dir, type)
183
211
  Dir.mkdir(out_dir) unless File.exist? out_dir
184
- objects = @variables['objects'][page]
185
- objects.each do |obj|
186
- out_path = File.join(out_dir, "#{obj[:name]}.html")
187
- obj['path'] = out_path
212
+ read_objects(type) do |name|
213
+ out_path = File.join(out_dir, "#{name}.html")
188
214
  File.open(out_path, 'w+') do |file|
189
- file.write(render_dynamic(page, obj))
215
+ file.write(render_dynamic(type, name))
190
216
  end
191
217
  end
192
218
  end
193
- return if @config.dev_mode
194
219
 
195
- # in production, also copy all assets to the dist folder.
220
+ # in production (or init), also copy all assets to the dist folder.
221
+ # in dev, they will be copied as they change.
196
222
  @config.assets_dirs.each do |asset_dir|
197
- FileUtils.copy_entry File.join(@config.root, asset_dir),
198
- File.join(@config.build_dir, asset_dir)
223
+ asset_path = File.join(@config.build_dir, asset_dir)
224
+ next if @config.dev_mode || !File.exist?(asset_path)
225
+
226
+ FileUtils.copy_entry File.join(@config.root, asset_dir), asset_path
199
227
  end
200
228
  end
201
229
 
@@ -4,6 +4,8 @@ require 'listen'
4
4
  require 'pathname'
5
5
 
6
6
  module Archival
7
+ Change = Struct.new(:path, :type)
8
+
7
9
  def listen(config = {})
8
10
  @config = Config.new(config.merge(dev_mode: true))
9
11
  builder = Builder.new(@config)
@@ -13,21 +15,27 @@ module Archival
13
15
  ignore = %r{/dist/}
14
16
  listener = Listen.to(@config.root,
15
17
  ignore: ignore) do |modified, added, removed|
16
- updated_pages = []
17
- updated_objects = []
18
- updated_assets = []
19
- (modified + added + removed).each do |file|
20
- case change_type(file)
21
- when :pages
22
- updated_pages << file
23
- when :objects
24
- updated_objects << file
25
- when :assets
26
- updated_assets << file
27
- end
18
+ changes = {
19
+ pages: [],
20
+ objects: [],
21
+ assets: [],
22
+ layout: [],
23
+ config: []
24
+ }
25
+ add_change = lambda { |file, type|
26
+ c_type = change_type(file)
27
+ changes[c_type] << change(file, type) unless c_type == :none
28
+ }
29
+ added.each do |file|
30
+ add_change.call(file, :added)
31
+ end
32
+ modified.each do |file|
33
+ add_change.call(file, :modified)
28
34
  end
29
- @server.refresh_client if rebuild?(builder, updated_objects,
30
- updated_pages, updated_assets)
35
+ removed.each do |file|
36
+ add_change.call(file, :removed)
37
+ end
38
+ @server.refresh_client if rebuild?(builder, changes)
31
39
  end
32
40
  listener.start
33
41
  serve_helpers
@@ -45,6 +53,13 @@ module Archival
45
53
  false
46
54
  end
47
55
 
56
+ def change(file, type)
57
+ c = Change.new
58
+ c.path = Pathname.new(file).relative_path_from(@config.root)
59
+ c.type = type
60
+ c
61
+ end
62
+
48
63
  def change_type(file)
49
64
  # a page was modified, rebuild the pages.
50
65
  return :pages if child?(File.join(@config.root, @config.pages_dir),
@@ -53,26 +68,29 @@ module Archival
53
68
  return :objects if child?(File.join(@config.root, @config.objects_dir),
54
69
  file)
55
70
 
56
- # layout and other assets. For now, this is everything.
71
+ # an asset was changed, which just means to copy or delete it
57
72
  @config.assets_dirs.each do |dir|
58
73
  return :assets if child?(File.join(@config.root, dir), file)
59
74
  end
60
- return :assets if child?(File.join(@config.root, 'layout'), file)
61
- return :assets if ['manifest.toml',
75
+ # other special files
76
+ return :layout if child?(File.join(@config.root, 'layout'), file)
77
+ return :config if ['manifest.toml',
62
78
  'objects.toml'].include? File.basename(file)
63
79
 
64
80
  :none
65
81
  end
66
82
 
67
- def rebuild?(builder, updated_objects, updated_pages, updated_assets)
68
- if updated_pages.empty? && updated_objects.empty? && updated_assets.empty?
69
- return false
70
- end
83
+ def rebuild?(builder, changes)
84
+ return false if changes.values.all?(&:empty?)
71
85
 
72
86
  Logger.benchmark('rebuilt') do
73
- builder.update_objects if updated_objects.length
74
- builder.update_pages if updated_pages.length
75
- builder.full_rebuild if updated_assets.length
87
+ if changes[:pages].length || changes[:objects].length
88
+ builder.update_pages(changes[:pages], changes[:objects])
89
+ end
90
+ builder.update_assets(changes[:assets]) if changes[:assets].length
91
+ if changes[:assets].length || changes[:layouts] || changes[:config]
92
+ builder.full_rebuild
93
+ end
76
94
  builder.write_all
77
95
  end
78
96
  true
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'redcarpet'
4
+
5
+ module Archival
6
+ class MarkdownRenderer < Redcarpet::Render::HTML
7
+ def autolink(link, _link_type, _opts)
8
+ # TODO: handle link_type?
9
+ "<a href=\"#{rewrite_link(link)}\">#{rewrite_link(link)}</a>"
10
+ end
11
+
12
+ def link(link, title, content)
13
+ "<a href=\"#{rewrite_link(link)}\" title=\"#{title}\">#{content}</a>"
14
+ end
15
+
16
+ def image(link, title, alt_text)
17
+ "<img src=\"#{rewrite_link(link)}\" \
18
+ title=\"#{title}\" alt=\"#{alt_text}\"/>"
19
+ end
20
+
21
+ private
22
+
23
+ def rewrite_link(link)
24
+ if link.start_with?('http') || link.start_with?('mailto') ||
25
+ link.start_with?('www') || link.start_with?('/')
26
+ link
27
+ end
28
+ template_dir = File.dirname(@options[:template_file])
29
+ resolved_link = Pathname.new(File.join(@options[:pages_root], link))
30
+ resolved_link.relative_path_from(template_dir)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'liquid'
4
+ require 'redcarpet'
5
+
6
+ module Archival
7
+ class Parser
8
+ def initialize(pages_root)
9
+ @pages_root = pages_root
10
+ end
11
+
12
+ def parse_object(object, definition, template_file)
13
+ markdown = Redcarpet::Markdown.new(
14
+ Archival::MarkdownRenderer.new(prettify: true,
15
+ hard_wrap: true),
16
+ no_intra_emphasis: true,
17
+ fenced_code_blocks: true,
18
+ autolink: true,
19
+ strikethrough: true,
20
+ underline: true,
21
+ template_file: template_file,
22
+ pages_root: @pages_root
23
+ )
24
+ definition.each do |name, type|
25
+ case type
26
+ when 'markdown'
27
+ object[name] = markdown.render(object[name]) if object.key? name
28
+ end
29
+ end
30
+ object
31
+ end
32
+ end
33
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Archival
4
- VERSION = '0.0.7'
4
+ VERSION = '0.0.8'
5
5
  end
data/lib/archival.rb CHANGED
@@ -1,13 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'liquid'
4
+ require 'tags/layout'
5
+ require 'tags/asset'
6
+
3
7
  module Archival
4
8
  # Main Archival module. See https://archival.dev for docs.
5
9
  end
6
10
 
11
+ Liquid::Template.error_mode = :strict
12
+ Liquid::Template.register_tag('layout', Layout)
13
+ Liquid::Template.register_tag('asset', Asset)
14
+
7
15
  require 'archival/version'
8
16
  require 'archival/template_array'
9
17
  require 'archival/logger'
10
18
  require 'archival/config'
19
+ require 'archival/markdown_renderer'
11
20
  require 'archival/helper_server'
21
+ require 'archival/parser'
12
22
  require 'archival/builder'
13
23
  require 'archival/listen'
data/lib/tags/asset.rb ADDED
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'liquid'
4
+
5
+ class Asset < Liquid::Tag
6
+ # Adds an `asset` tag to liquid. Usage:
7
+ #
8
+ # {% asset "path/to/asset.png" %}
9
+ #
10
+ # This will replace the tag with a relative path to the asset from the
11
+ # current template. Using normal tags will work from the root, but when
12
+ # building dynamic pages or reusing layouts, asset paths are dynamic and
13
+ # will need to be rewritten.
14
+
15
+ prepend Liquid::Tag::Disableable
16
+
17
+ SYNTAX = /(#{Liquid::QuotedFragment}+)/o.freeze
18
+
19
+ def initialize(tag_name, markup, tokens)
20
+ super
21
+ raise AssetError, 'Invalid layout syntax' unless markup =~ SYNTAX
22
+
23
+ @path = parse_expression(Regexp.last_match(1))
24
+ # This is defaulted to the pages dir, because it represents the structure
25
+ # of our website. Asset directories are copied as siblings at runtime.
26
+ @@root_dir ||= File.join(Dir.pwd, 'pages')
27
+ end
28
+
29
+ def self.root_dir=(dir)
30
+ @@root_dir = dir
31
+ end
32
+
33
+ def render_to_output_buffer(context, output)
34
+ unless @@root_dir
35
+ raise AssetError,
36
+ 'root_dir must be set on Archival::Asset'
37
+ end
38
+
39
+ unless context.key? 'template_path'
40
+ raise AssetError,
41
+ 'template_path must be provided to parse when using assets'
42
+ end
43
+ template_path = File.dirname(context['template_path'])
44
+ abs_asset_path = Pathname.new(File.join(@@root_dir, @path))
45
+ output << abs_asset_path.relative_path_from(template_path).to_s
46
+ output
47
+ end
48
+ end
49
+
50
+ class AssetError < Liquid::Error
51
+ end
data/lib/tags/layout.rb CHANGED
@@ -25,7 +25,7 @@ class Layout < Liquid::Tag
25
25
  super
26
26
 
27
27
  @page_content = []
28
- raise 'Invalid layout syntax' unless markup =~ SYNTAX
28
+ raise LayoutError, 'Invalid layout syntax' unless markup =~ SYNTAX
29
29
 
30
30
  layout_name = Regexp.last_match(1)
31
31
  @layout_name_expr = parse_expression(layout_name)
@@ -40,7 +40,9 @@ class Layout < Liquid::Tag
40
40
  base_path = Dir.pwd
41
41
  layout_dir = 'layout'
42
42
  layout_path = File.join(base_path, layout_dir)
43
- raise "Layout dir #{layout_path} not found" unless File.exist? layout_path
43
+ unless File.exist? layout_path
44
+ raise LayoutError, "Layout dir #{layout_path} not found"
45
+ end
44
46
 
45
47
  layout_path
46
48
  end
@@ -55,11 +57,15 @@ class Layout < Liquid::Tag
55
57
  )
56
58
 
57
59
  next unless File.basename(f, '.*') == layout_name
58
- raise "More than one layout named #{layout_name} found." if found_layout
60
+ if found_layout
61
+ raise LayoutError, "More than one layout named #{layout_name} found."
62
+ end
59
63
 
60
64
  found_layout = File.join(layout_path, f)
61
65
  end
62
- raise "No layouts named #{layout_name} found." if found_layout.nil?
66
+ if found_layout.nil?
67
+ raise LayoutError, "No layouts named #{layout_name} found."
68
+ end
63
69
 
64
70
  layout = File.read(found_layout)
65
71
  @@layout_cache[layout_name] =
@@ -77,7 +83,7 @@ class Layout < Liquid::Tag
77
83
 
78
84
  def render_to_output_buffer(context, output)
79
85
  layout_name = context.evaluate(@layout_name_expr)
80
- raise 'Bad layout name argument' unless layout_name
86
+ raise LayoutError, 'Bad layout name argument' unless layout_name
81
87
 
82
88
  layout = load_layout(layout_name)
83
89
 
@@ -104,3 +110,6 @@ class Layout < Liquid::Tag
104
110
  output
105
111
  end
106
112
  end
113
+
114
+ class LayoutError < Liquid::Error
115
+ end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "archival",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "description": "An incredibly simple CMS for durable websites",
5
5
  "bin": "build.rb",
6
6
  "directories": {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: archival
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jesse Ditson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-14 00:00:00.000000000 Z
11
+ date: 2021-11-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: liquid
@@ -104,15 +104,19 @@ files:
104
104
  - lib/archival/helper_server.rb
105
105
  - lib/archival/listen.rb
106
106
  - lib/archival/logger.rb
107
+ - lib/archival/markdown_renderer.rb
108
+ - lib/archival/parser.rb
107
109
  - lib/archival/rake_tasks.rb
108
110
  - lib/archival/template_array.rb
109
111
  - lib/archival/version.rb
112
+ - lib/tags/asset.rb
110
113
  - lib/tags/layout.rb
111
114
  - package.json
112
115
  homepage: https://archival.dev
113
116
  licenses:
114
117
  - Unlicense
115
- metadata: {}
118
+ metadata:
119
+ rubygems_mfa_required: 'true'
116
120
  post_install_message:
117
121
  rdoc_options: []
118
122
  require_paths: