archival 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/archival.gemspec +1 -1
- data/bin/bundle +1 -1
- data/lib/archival/builder.rb +34 -2
- data/lib/archival/config.rb +3 -2
- data/lib/archival/helper_server.rb +16 -7
- data/lib/archival/listen.rb +7 -0
- data/lib/archival/version.rb +1 -1
- data/lib/tags/asset.rb +16 -1
- data/package.json +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd9c755847bfaabb7c6dee0882426534c44c7130a8cbfe84a45b755bca91088a
|
4
|
+
data.tar.gz: 3bbd4cb0b322db5eff11b85d9afc9f76e4cdbe1bc166c530f015583369c7f141
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db20449d88ba3394580bd5efebd259a7479bd423fea6983a4790e21d124d831490f4e9f4bea3fe97411cc2b72898e93534be2b34d122e6c93e47290381cd74b3
|
7
|
+
data.tar.gz: f25b29c4fdb0b676dcee6156ab571877764ead475cac70944c6e81a1f5c445b3ebaf07b7266087b3163209184cf2c9dc50f33797105b8abb3a8e2564a19861c2
|
data/.rubocop.yml
CHANGED
data/archival.gemspec
CHANGED
data/bin/bundle
CHANGED
@@ -73,7 +73,7 @@ m = Module.new do
|
|
73
73
|
|
74
74
|
requirement = bundler_gem_version.approximate_recommendation
|
75
75
|
|
76
|
-
return requirement unless Gem
|
76
|
+
return requirement unless Gem.rubygems_version < Gem::Version.new("2.7.0")
|
77
77
|
|
78
78
|
requirement += ".a" if bundler_gem_version.prerelease?
|
79
79
|
|
data/lib/archival/builder.rb
CHANGED
@@ -3,17 +3,23 @@
|
|
3
3
|
require 'liquid'
|
4
4
|
require 'tomlrb'
|
5
5
|
require 'redcarpet'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'tags/asset'
|
6
8
|
|
7
9
|
module Archival
|
8
10
|
class DuplicateKeyError < StandardError
|
9
11
|
end
|
10
12
|
|
13
|
+
class DuplicateStaticFileError < StandardError
|
14
|
+
end
|
15
|
+
|
11
16
|
class Builder
|
12
17
|
attr_reader :page_templates
|
13
18
|
|
14
19
|
def initialize(config, *_args)
|
15
20
|
@config = config
|
16
21
|
refresh_config
|
22
|
+
Asset.helper_port = @config.helper_port
|
17
23
|
end
|
18
24
|
|
19
25
|
def pages_dir
|
@@ -221,14 +227,40 @@ module Archival
|
|
221
227
|
# in dev, they will be copied as they change.
|
222
228
|
@config.assets_dirs.each do |asset_dir|
|
223
229
|
asset_path = File.join(@config.build_dir, asset_dir)
|
224
|
-
next if @config.dev_mode
|
230
|
+
next if @config.dev_mode && File.exist?(asset_path)
|
231
|
+
|
232
|
+
source_path = File.join(@config.root, asset_dir)
|
233
|
+
next unless File.exist?(source_path)
|
225
234
|
|
226
|
-
FileUtils.copy_entry
|
235
|
+
FileUtils.copy_entry source_path, asset_path
|
227
236
|
end
|
237
|
+
|
238
|
+
copy_static
|
228
239
|
end
|
229
240
|
|
230
241
|
private
|
231
242
|
|
243
|
+
def copy_static
|
244
|
+
static_dir = File.join(@config.root, @config.static_dir)
|
245
|
+
|
246
|
+
# same for the static dir, but just the content.
|
247
|
+
return unless File.exist?(static_dir)
|
248
|
+
|
249
|
+
copied_static_files = Set[Dir.children(@config.build_dir)]
|
250
|
+
Dir.children(static_dir).each do |child|
|
251
|
+
raise DuplicateStaticFileError if copied_static_files.include?(child)
|
252
|
+
|
253
|
+
copied_static_files << child
|
254
|
+
asset_path = File.join(@config.build_dir, child)
|
255
|
+
next if @config.dev_mode && File.exist?(asset_path)
|
256
|
+
|
257
|
+
source_path = File.join(static_dir, child)
|
258
|
+
next unless File.exist?(source_path)
|
259
|
+
|
260
|
+
FileUtils.copy_entry source_path, asset_path
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
232
264
|
def dev_mode_content
|
233
265
|
"<script src=\"http://localhost:#{@config.helper_port}/js/archival-helper.js\" type=\"application/javascript\"></script>" # rubocop:disable Layout/LineLength
|
234
266
|
end
|
data/lib/archival/config.rb
CHANGED
@@ -4,8 +4,8 @@ require 'tomlrb'
|
|
4
4
|
|
5
5
|
module Archival
|
6
6
|
class Config
|
7
|
-
attr_reader :pages_dir, :objects_dir, :
|
8
|
-
:helper_port, :dev_mode
|
7
|
+
attr_reader :pages_dir, :objects_dir, :static_dir, :assets_dirs, :root,
|
8
|
+
:build_dir, :helper_port, :dev_mode
|
9
9
|
|
10
10
|
def initialize(config = {})
|
11
11
|
@root = config['root'] || Dir.pwd
|
@@ -17,6 +17,7 @@ module Archival
|
|
17
17
|
)
|
18
18
|
@helper_port = config['helper_port'] || manifest['helper_port'] || 2701
|
19
19
|
@assets_dirs = config['assets_dirs'] || manifest['assets'] || []
|
20
|
+
@static_dir = config['static_dir'] || manifest['static'] || 'static'
|
20
21
|
@dev_mode = config[:dev_mode] || false
|
21
22
|
end
|
22
23
|
|
@@ -44,16 +44,23 @@ module Archival
|
|
44
44
|
MAGIC_GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
|
45
45
|
|
46
46
|
def handle_request(client, req, method, path)
|
47
|
-
if method == 'GET' && path.start_with?('/js/')
|
48
|
-
# For
|
47
|
+
if method == 'GET' && path.start_with?('/js/archival-helper.js')
|
48
|
+
# For this special file, serve it from the helper dir
|
49
49
|
http_response(client, type: 'application/javascript') do
|
50
|
-
serve_static(client, path)
|
50
|
+
serve_static(client, path, @helper_dir)
|
51
51
|
end
|
52
52
|
client.close
|
53
53
|
elsif (matches = req.match(/^Sec-WebSocket-Key: (\S+)/))
|
54
54
|
websocket_key = matches[1]
|
55
55
|
# puts "Websocket handshake detected with key: #{websocket_key}"
|
56
56
|
connect_socket(client, websocket_key)
|
57
|
+
elsif method == 'GET'
|
58
|
+
# For static paths, just serve the files they refer to.
|
59
|
+
# TODO: mime type should be inferred from file type
|
60
|
+
http_response(client, type: 'application/javascript') do
|
61
|
+
serve_static(client, path)
|
62
|
+
end
|
63
|
+
client.close
|
57
64
|
else
|
58
65
|
client.close
|
59
66
|
end
|
@@ -99,8 +106,9 @@ module Archival
|
|
99
106
|
|
100
107
|
# Our server only supports single-frame, text messages.
|
101
108
|
# Raise an exception if the client tries to send anything else.
|
102
|
-
raise
|
103
|
-
|
109
|
+
raise 'Archival dev server does not support continuations' unless fin
|
110
|
+
# Some browsers send this regardless, so ignore it to keep the noise down.
|
111
|
+
return unless opcode == 1
|
104
112
|
|
105
113
|
second_byte = @socket.getbyte
|
106
114
|
is_masked = second_byte & 0b10000000
|
@@ -139,8 +147,8 @@ module Archival
|
|
139
147
|
@socket.write output.pack("CCA#{message.size}")
|
140
148
|
end
|
141
149
|
|
142
|
-
def serve_static(client, path)
|
143
|
-
buffer = File.open(File.join(
|
150
|
+
def serve_static(client, path, base = @build_dir)
|
151
|
+
buffer = File.open(File.join(base, path)).read
|
144
152
|
buffer.sub! '$PORT', @port.to_s
|
145
153
|
client.print buffer
|
146
154
|
end
|
@@ -150,6 +158,7 @@ module Archival
|
|
150
158
|
type = config[:type] ||= 'text/html'
|
151
159
|
client.print "HTTP/1.1 #{status}\r\n"
|
152
160
|
client.print "Content-Type: #{type}\r\n"
|
161
|
+
client.print "Access-Control-Allow-Origin: *\r\n"
|
153
162
|
client.print "\r\n"
|
154
163
|
yield
|
155
164
|
end
|
data/lib/archival/listen.rb
CHANGED
@@ -72,6 +72,11 @@ module Archival
|
|
72
72
|
@config.assets_dirs.each do |dir|
|
73
73
|
return :assets if child?(File.join(@config.root, dir), file)
|
74
74
|
end
|
75
|
+
|
76
|
+
# a static file was changed - copy or delete those too.
|
77
|
+
return :assets if child?(File.join(@config.root, @config.static_dir),
|
78
|
+
file)
|
79
|
+
|
75
80
|
# other special files
|
76
81
|
return :layout if child?(File.join(@config.root, 'layout'), file)
|
77
82
|
return :config if ['manifest.toml',
|
@@ -89,6 +94,8 @@ module Archival
|
|
89
94
|
end
|
90
95
|
builder.update_assets(changes[:assets]) if changes[:assets].length
|
91
96
|
if changes[:assets].length || changes[:layouts] || changes[:config]
|
97
|
+
# TODO: optimization: this could operate on the known subset of
|
98
|
+
# changes instead...
|
92
99
|
builder.full_rebuild
|
93
100
|
end
|
94
101
|
builder.write_all
|
data/lib/archival/version.rb
CHANGED
data/lib/tags/asset.rb
CHANGED
@@ -24,12 +24,22 @@ class Asset < Liquid::Tag
|
|
24
24
|
# This is defaulted to the pages dir, because it represents the structure
|
25
25
|
# of our website. Asset directories are copied as siblings at runtime.
|
26
26
|
@@root_dir ||= File.join(Dir.pwd, 'pages')
|
27
|
+
|
28
|
+
@attributes = {}
|
29
|
+
|
30
|
+
markup.scan(Liquid::TagAttributes) do |key, value|
|
31
|
+
@attributes[key] = parse_expression(value)
|
32
|
+
end
|
27
33
|
end
|
28
34
|
|
29
35
|
def self.root_dir=(dir)
|
30
36
|
@@root_dir = dir
|
31
37
|
end
|
32
38
|
|
39
|
+
def self.helper_port=(port)
|
40
|
+
@@helper_port = port
|
41
|
+
end
|
42
|
+
|
33
43
|
def render_to_output_buffer(context, output)
|
34
44
|
unless @@root_dir
|
35
45
|
raise AssetError,
|
@@ -42,7 +52,12 @@ class Asset < Liquid::Tag
|
|
42
52
|
end
|
43
53
|
template_path = File.dirname(context['template_path'])
|
44
54
|
abs_asset_path = Pathname.new(File.join(@@root_dir, @path))
|
45
|
-
|
55
|
+
asset_path = abs_asset_path.relative_path_from(template_path).cleanpath.to_s
|
56
|
+
output << if @attributes['serve'] == true
|
57
|
+
"http://localhost:#{@@helper_port}/#{asset_path}"
|
58
|
+
else
|
59
|
+
asset_path
|
60
|
+
end
|
46
61
|
output
|
47
62
|
end
|
48
63
|
end
|
data/package.json
CHANGED
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.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Ditson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: liquid
|
@@ -132,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
132
|
- !ruby/object:Gem::Version
|
133
133
|
version: '0'
|
134
134
|
requirements: []
|
135
|
-
rubygems_version: 3.
|
135
|
+
rubygems_version: 3.3.3
|
136
136
|
signing_key:
|
137
137
|
specification_version: 4
|
138
138
|
summary: An incredibly simple CMS for durable websites
|