frontman-ssg 0.0.3 → 0.0.4
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -1
- data/CHANGELOG.md +15 -4
- data/lib/frontman.rb +2 -0
- data/lib/frontman/app.rb +18 -11
- data/lib/frontman/commands/build.rb +1 -1
- data/lib/frontman/commands/init.rb +2 -0
- data/lib/frontman/commands/serve.rb +33 -5
- data/lib/frontman/errors.rb +33 -0
- data/lib/frontman/sitemap_tree.rb +2 -14
- data/lib/frontman/version.rb +1 -1
- data/project-templates/default/Gemfile +2 -0
- data/project-templates/webpack/Gemfile +2 -0
- data/spec/frontman/app_spec.rb +22 -0
- data/spec/frontman/bootstrapper_spec.rb +1 -1
- data/spec/frontman/mocks/import_config.rb +4 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d98534ae36366f01f9b304aa66cf452d69688a68e37f33e53a3b0afab9ce328a
|
4
|
+
data.tar.gz: aa330a04fd43740fff7dfc1ef6d3e46b640a0a428070456933e24141e58d3b86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e23982fea37d56e567c96d9344efb5f98c02fead828861410ead02486fe7d6520eb47d0d509bfd46f57e20e4e0476c1ee69820779074afa51fb1527f985e71e
|
7
|
+
data.tar.gz: b1eab4c96e41d2a38951f8893ef29786b20ed2b31689b6c94bfd22a8263f545f9fdd250d3ce8d097fbd694558744c605e92a1d586485376929d2c295520fe335
|
data/.rubocop.yml
CHANGED
@@ -4,6 +4,9 @@ AllCops:
|
|
4
4
|
- '**/Rakefile'
|
5
5
|
- 'vendor/**/*'
|
6
6
|
|
7
|
+
Style/Lambda:
|
8
|
+
Enabled: false
|
9
|
+
|
7
10
|
Gemspec/RequiredRubyVersion:
|
8
11
|
Exclude:
|
9
12
|
- 'frontman-ssg.gemspec'
|
@@ -85,4 +88,4 @@ Metrics/ParameterLists:
|
|
85
88
|
|
86
89
|
Lint/HandleExceptions:
|
87
90
|
Exclude:
|
88
|
-
- 'lib/frontman/commands/serve.rb'
|
91
|
+
- 'lib/frontman/commands/serve.rb'
|
data/CHANGELOG.md
CHANGED
@@ -5,19 +5,30 @@ We document all notable changes to the project in the file.
|
|
5
5
|
The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [semantic versioning](http://semver.org/).
|
6
6
|
|
7
7
|
# Release Notes
|
8
|
-
## [Unreleased](https://github.com/algolia/frontman/compare/0.0.
|
8
|
+
## [Unreleased](https://github.com/algolia/frontman/compare/0.0.4...master)
|
9
|
+
|
10
|
+
## [0.0.4](https://github.com/algolia/frontman/tree/0.0.3) - 2020-08-28
|
11
|
+
|
12
|
+
### Added
|
13
|
+
* Retry strategy to allow for multiple running Frontman processes ([`#24`](https://github.com/algolia/frontman/pull/24)) by [@westonganger](https://github.com/westonganger)
|
14
|
+
* Added `--force` flag to the `frontman init` command ([`#29`](https://github.com/algolia/frontman/pull/29)) by [@MikeRogers0](https://github.com/MikeRogers0)
|
15
|
+
* Improved data directory registration ([`#30`](https://github.com/algolia/frontman/pull/30)) by [@westonganger](https://github.com/westonganger)
|
16
|
+
* `import_config` method to easily load multiple configuration files ([`#34`](https://github.com/algolia/frontman/pull/34)) by [@westonganger](https://github.com/westonganger)
|
17
|
+
|
18
|
+
### Fixed
|
19
|
+
* Added `https://rubygems.org` as a source for our dependencies ([`#32`](https://github.com/algolia/frontman/pull/32)) by [@MikeRogers0](https://github.com/MikeRogers0)
|
9
20
|
|
10
21
|
## [0.0.3](https://github.com/algolia/frontman/tree/0.0.3) - 2020-08-28
|
11
22
|
|
12
|
-
|
23
|
+
### Added
|
13
24
|
* Documentation on the release process.
|
14
25
|
* Load possible `.env` files before application bootstrapping.
|
15
26
|
* Asset fingerprinting through configuration.
|
16
27
|
|
17
|
-
|
28
|
+
### Security
|
18
29
|
* Update dependencies in the Webpack project template.
|
19
30
|
|
20
|
-
|
31
|
+
### Fixed
|
21
32
|
* Prevent `DataStoreFile` from being converted to `OpenStruct`.
|
22
33
|
* Misc. updates to the projects documentation.
|
23
34
|
|
data/lib/frontman.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'frontman/errors'
|
3
4
|
require 'frontman/app'
|
4
5
|
require 'frontman/context'
|
5
6
|
require 'frontman/config'
|
6
7
|
require 'frontman/custom_struct'
|
7
8
|
require 'frontman/data_store'
|
8
9
|
require 'frontman/data_store_file'
|
10
|
+
require 'frontman/errors'
|
9
11
|
require 'frontman/sitemap_tree'
|
10
12
|
require 'frontman/resource'
|
11
13
|
|
data/lib/frontman/app.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'frontman/sitemap_tree'
|
5
5
|
require 'frontman/data_store'
|
6
|
+
require 'frontman/errors'
|
6
7
|
require 'singleton'
|
7
8
|
require 'sorbet-runtime'
|
8
9
|
|
@@ -94,11 +95,15 @@ module Frontman
|
|
94
95
|
@assets_manifest[key] = '/' + value.sub(%r{^/}, '')
|
95
96
|
end
|
96
97
|
|
97
|
-
sig { params(dirs: Array).void }
|
98
|
+
sig { params(dirs: T.any(Array, Hash)).void }
|
98
99
|
def register_data_dirs(dirs)
|
99
|
-
dirs.
|
100
|
-
|
101
|
-
|
100
|
+
if dirs.is_a?(Array)
|
101
|
+
dirs = dirs.map { |dir| [dir.split('/').last, dir] }.to_h
|
102
|
+
end
|
103
|
+
|
104
|
+
dirs.each do |name, dir|
|
105
|
+
define_singleton_method name do
|
106
|
+
@data_dirs[name] ||= DataStore.new(File.join(Dir.pwd, dir))
|
102
107
|
end
|
103
108
|
end
|
104
109
|
end
|
@@ -127,6 +132,15 @@ module Frontman
|
|
127
132
|
)
|
128
133
|
end
|
129
134
|
|
135
|
+
sig { params(file_path: String).void }
|
136
|
+
def import_config(file_path)
|
137
|
+
if !file_path.end_with?('.rb') && !File.exist?(file_path)
|
138
|
+
return import_config("#{file_path}.rb")
|
139
|
+
end
|
140
|
+
|
141
|
+
run File.read(file_path)
|
142
|
+
end
|
143
|
+
|
130
144
|
def method_missing(method_id, *_)
|
131
145
|
from_view_data = get_from_view_data(method_id)
|
132
146
|
return from_view_data unless from_view_data.nil?
|
@@ -164,12 +178,5 @@ module Frontman
|
|
164
178
|
local_data = @view_data.last[:locals]
|
165
179
|
local_data[key] unless local_data.nil?
|
166
180
|
end
|
167
|
-
|
168
|
-
class ExistingResourceError < StandardError
|
169
|
-
def self.create(url, resource)
|
170
|
-
new("Unable to redirect for #{url},
|
171
|
-
the resource #{resource.file_path} already exists on this URL")
|
172
|
-
end
|
173
|
-
end
|
174
181
|
end
|
175
182
|
end
|
@@ -52,7 +52,7 @@ module Frontman
|
|
52
52
|
builder.build_directory = build_directory
|
53
53
|
builder.current_build_files = current_build_files
|
54
54
|
|
55
|
-
builder.on('created, updated, deleted, unchanged',
|
55
|
+
builder.on('created, updated, deleted, unchanged', ->(build_file) {
|
56
56
|
mapping.add_from_build_file(build_file)
|
57
57
|
})
|
58
58
|
|
@@ -6,6 +6,7 @@ require 'thor'
|
|
6
6
|
module Frontman
|
7
7
|
class CLI < Thor
|
8
8
|
option :template
|
9
|
+
option :force, type: :boolean
|
9
10
|
desc 'init', 'Bootstrap a new Frontman project'
|
10
11
|
def init(path)
|
11
12
|
template = options[:template] || 'default'
|
@@ -38,6 +39,7 @@ module Frontman
|
|
38
39
|
end
|
39
40
|
|
40
41
|
def allowed_to_modify_dir?(dir)
|
42
|
+
return true if options[:force]
|
41
43
|
return true if !Dir.exist?(dir) || Dir.empty?(dir)
|
42
44
|
|
43
45
|
say 'This folder already contains files. '
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: false
|
2
2
|
|
3
|
+
require 'socket'
|
3
4
|
require 'thor'
|
4
5
|
require 'sinatra/base'
|
5
6
|
require 'better_errors'
|
@@ -8,6 +9,7 @@ require 'frontman/app'
|
|
8
9
|
require 'frontman/bootstrapper'
|
9
10
|
require 'frontman/builder/asset_pipeline'
|
10
11
|
require 'frontman/config'
|
12
|
+
require 'frontman/errors'
|
11
13
|
require 'frontman/resource'
|
12
14
|
|
13
15
|
module Frontman
|
@@ -70,11 +72,11 @@ module Frontman
|
|
70
72
|
|
71
73
|
listener.start
|
72
74
|
|
73
|
-
|
75
|
+
FrontmanServer.set :public_folder, Frontman::Config.get(
|
74
76
|
:public_dir, fallback: 'public'
|
75
77
|
)
|
76
|
-
|
77
|
-
host = "http://localhost:#{
|
78
|
+
FrontmanServer.run! do
|
79
|
+
host = "http://localhost:#{FrontmanServer.settings.port}"
|
78
80
|
print "== View your site at \"#{host}/\"\n"
|
79
81
|
processes += assets_pipeline.run_in_background!(:after)
|
80
82
|
at_exit { processes.each { |pid| Process.kill(0, pid) } }
|
@@ -83,8 +85,34 @@ module Frontman
|
|
83
85
|
end
|
84
86
|
end
|
85
87
|
|
86
|
-
class
|
87
|
-
|
88
|
+
class FrontmanServer < Sinatra::Base
|
89
|
+
port = Frontman::Config.get(:port, fallback: 4568)
|
90
|
+
num_retries = Frontman::Config.get(:port_retries, fallback: 3)
|
91
|
+
|
92
|
+
retry_strategy = Frontman::Config.get(:port_retry_strategy, fallback: ->(p) {
|
93
|
+
port_in_use = false
|
94
|
+
|
95
|
+
(1 + num_retries).times do
|
96
|
+
begin
|
97
|
+
port_in_use = Socket.tcp('localhost', p, connect_timeout: 3) { true }
|
98
|
+
rescue StandardError
|
99
|
+
port_in_use = false
|
100
|
+
end
|
101
|
+
|
102
|
+
break unless port_in_use
|
103
|
+
|
104
|
+
p += 1
|
105
|
+
end
|
106
|
+
|
107
|
+
raise Frontman::ServerPortError if port_in_use
|
108
|
+
|
109
|
+
p
|
110
|
+
})
|
111
|
+
|
112
|
+
port = retry_strategy.call(port)
|
113
|
+
|
114
|
+
set :port, port
|
115
|
+
|
88
116
|
set :server_settings,
|
89
117
|
# Avoid having webrick displaying logs for every requests to the serve
|
90
118
|
AccessLog: [],
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Frontman
|
4
|
+
class Error < StandardError; end
|
5
|
+
|
6
|
+
class DuplicateResourceError < StandardError
|
7
|
+
def self.create(resource, url, existing_resource)
|
8
|
+
new("Unable to add #{resource.file_path} as #{url}.
|
9
|
+
Resource #{existing_resource.file_path} already exists on this URL.")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class ExistingRedirectError < StandardError
|
14
|
+
def self.create(resource, url)
|
15
|
+
new("Unable to add #{resource.file_path} as #{url}.
|
16
|
+
A redirect already exists for this URL.")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class ExistingResourceError < StandardError
|
21
|
+
def self.create(url, resource)
|
22
|
+
new("Unable to redirect for #{url},
|
23
|
+
the resource #{resource.file_path} already exists on this URL")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class ServerPortError < StandardError
|
28
|
+
def initialize
|
29
|
+
super('Server failed to attach to port. Please shutdown some processes
|
30
|
+
or increase the :port_retries configuration variable.')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# typed: false
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require 'frontman/errors'
|
5
|
+
|
4
6
|
module Frontman
|
5
7
|
class SitemapTree
|
6
8
|
attr_reader :path, :children, :url_part
|
@@ -194,18 +196,4 @@ module Frontman
|
|
194
196
|
"SitemapTree: #{@resource ? @resource.destination_path : @url_part}"
|
195
197
|
end
|
196
198
|
end
|
197
|
-
|
198
|
-
class DuplicateResourceError < StandardError
|
199
|
-
def self.create(resource, url, existing_resource)
|
200
|
-
new("Unable to add #{resource.file_path} as #{url}.
|
201
|
-
Resource #{existing_resource.file_path} already exists on this URL.")
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
class ExistingRedirectError < StandardError
|
206
|
-
def self.create(resource, url)
|
207
|
-
new("Unable to add #{resource.file_path} as #{url}.
|
208
|
-
A redirect already exists for this URL.")
|
209
|
-
end
|
210
|
-
end
|
211
199
|
end
|
data/lib/frontman/version.rb
CHANGED
data/spec/frontman/app_spec.rb
CHANGED
@@ -45,4 +45,26 @@ describe Frontman::App do
|
|
45
45
|
it 'should return itself when calling app' do
|
46
46
|
expect(subject.app).to eq subject
|
47
47
|
end
|
48
|
+
|
49
|
+
it 'should register variables named after keys if hash passed' do
|
50
|
+
subject.register_data_dirs(my_data: 'spec/frontman/mocks')
|
51
|
+
subject.my_data
|
52
|
+
subject.my_data.info
|
53
|
+
subject.my_data.nested.data
|
54
|
+
subject.my_data.nested.more_data
|
55
|
+
expect { subject.mocks }.to raise_error NoMethodError
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should register variables named after data directory names if array passed' do
|
59
|
+
subject.register_data_dirs(['spec/frontman/mocks'])
|
60
|
+
subject.mocks
|
61
|
+
subject.mocks.info
|
62
|
+
subject.mocks.nested.data
|
63
|
+
subject.mocks.nested.more_data
|
64
|
+
expect { subject.data }.to raise_error NoMethodError
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should work with import_config' do
|
68
|
+
expect(subject.import_config('spec/frontman/mocks/import_config'))
|
69
|
+
end
|
48
70
|
end
|
@@ -20,7 +20,7 @@ describe Frontman::Bootstrapper do
|
|
20
20
|
it 'should find all resources in a given folder' do
|
21
21
|
resources = Frontman::Bootstrapper.resources_from_dir('spec/frontman/mocks')
|
22
22
|
|
23
|
-
expect(resources.size).to eq
|
23
|
+
expect(resources.size).to eq 15 # Number of non-YAML files in this folder
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: frontman-ssg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Devin Beeuwkes
|
@@ -376,6 +376,7 @@ files:
|
|
376
376
|
- lib/frontman/custom_struct.rb
|
377
377
|
- lib/frontman/data_store.rb
|
378
378
|
- lib/frontman/data_store_file.rb
|
379
|
+
- lib/frontman/errors.rb
|
379
380
|
- lib/frontman/helpers/app_helper.rb
|
380
381
|
- lib/frontman/helpers/link_helper.rb
|
381
382
|
- lib/frontman/helpers/render_helper.rb
|
@@ -462,6 +463,7 @@ files:
|
|
462
463
|
- spec/frontman/mocks/html_file.html
|
463
464
|
- spec/frontman/mocks/html_file.html.md.erb
|
464
465
|
- spec/frontman/mocks/html_file.md.html
|
466
|
+
- spec/frontman/mocks/import_config.rb
|
465
467
|
- spec/frontman/mocks/info.yml
|
466
468
|
- spec/frontman/mocks/layouts/raw_without_body.haml
|
467
469
|
- spec/frontman/mocks/nested/data.yml
|