fronde 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/fronde +2 -2
- data/lib/fronde/cli/commands.rb +18 -8
- data/lib/fronde/cli.rb +3 -3
- data/lib/fronde/config/lisp_config.rb +48 -34
- data/lib/fronde/config.rb +52 -11
- data/lib/fronde/emacs.rb +1 -1
- data/lib/fronde/index/atom_generator.rb +5 -6
- data/lib/fronde/index/org_generator.rb +6 -6
- data/lib/fronde/index.rb +1 -1
- data/lib/fronde/org_file/class_methods.rb +2 -2
- data/lib/fronde/org_file/extracter.rb +3 -3
- data/lib/fronde/org_file/htmlizer.rb +1 -1
- data/lib/fronde/org_file.rb +7 -7
- data/lib/fronde/preview.rb +5 -5
- data/lib/fronde/templater.rb +2 -2
- data/lib/fronde/utils.rb +16 -1
- data/lib/fronde/version.rb +1 -1
- data/lib/tasks/org.rake +13 -12
- data/lib/tasks/site.rake +2 -3
- data/lib/tasks/sync.rake +36 -14
- data/locales/en.yml +1 -0
- data/locales/fr.yml +1 -0
- metadata +22 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '09c19f62dc0488af47253babe5508d3542a32641cd37ad4d48db18bcc9e99e41'
|
4
|
+
data.tar.gz: abed078181d7348c50706e6221e0820753a336d1ba23b0248e6ec588a8b43d07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87d05d4afddff426c8093bfe210d4b33744493ebc4a095aef6c0127c072f013550d6169b8573b36916e3f2f286a023b47ee644ba8cc105ed25d73ee71bd7f1ed
|
7
|
+
data.tar.gz: f22641978e2b3b2416dfc36af56f914a345869b029e972ebc881dfa085ab9fe5bd8435174954fe5772d6a0e822ea51ec9a5f2c3759a27503f8fdb2730672eeed
|
data/bin/fronde
CHANGED
@@ -8,7 +8,7 @@ require 'fronde/version'
|
|
8
8
|
require 'fronde/cli'
|
9
9
|
|
10
10
|
R18n.default_places = File.expand_path('../locales', __dir__)
|
11
|
-
R18n.set Fronde::Config.
|
11
|
+
R18n.set Fronde::Config.get('lang')
|
12
12
|
|
13
13
|
optparser = OptionParser.new
|
14
14
|
optparser.version = Fronde::VERSION
|
@@ -38,7 +38,7 @@ if params[:help] || cmd_err
|
|
38
38
|
end
|
39
39
|
ARGV.shift
|
40
40
|
|
41
|
-
init_cmds = [:fronde_init, :fronde_config]
|
41
|
+
init_cmds = [:fronde_init, :fronde_config, :fronde_update]
|
42
42
|
unless File.exist?('config.yml') || init_cmds.include?(command)
|
43
43
|
fronde.fronde_init
|
44
44
|
end
|
data/lib/fronde/cli/commands.rb
CHANGED
@@ -3,18 +3,21 @@
|
|
3
3
|
module Fronde
|
4
4
|
# Fronde commands
|
5
5
|
module CLICommands
|
6
|
+
def fronde_update
|
7
|
+
update_config
|
8
|
+
@rake.options.build_all = true
|
9
|
+
@rake.invoke_task('org:upgrade')
|
10
|
+
end
|
11
|
+
alias_method :fronde_config, :fronde_update
|
12
|
+
|
6
13
|
def fronde_init
|
7
|
-
|
8
|
-
cnf.delete(:verbose)
|
9
|
-
cnf.transform_keys!(&:to_s)
|
10
|
-
Fronde::Config.save(Fronde::Config.settings.merge(cnf))
|
14
|
+
update_config
|
11
15
|
@rake.options.build_all = true
|
12
16
|
@rake.invoke_task('org:install')
|
13
17
|
return if File.exist? 'src/index.org'
|
14
18
|
Fronde::OrgFile.new('src/index.org', @options).write
|
15
19
|
fronde_open 'src/index.org'
|
16
20
|
end
|
17
|
-
alias_method :fronde_config, :fronde_init
|
18
21
|
|
19
22
|
def fronde_build
|
20
23
|
@rake.options.build_all = true
|
@@ -26,7 +29,7 @@ module Fronde
|
|
26
29
|
def fronde_preview
|
27
30
|
Thread.new do
|
28
31
|
sleep 1
|
29
|
-
port = Fronde::Config.
|
32
|
+
port = Fronde::Config.get(['preview', 'server_port'], 5000)
|
30
33
|
uri = "http://127.0.0.1:#{port}/"
|
31
34
|
current_os = Fronde::Utils.current_os
|
32
35
|
case current_os
|
@@ -62,10 +65,10 @@ module Fronde
|
|
62
65
|
|
63
66
|
def fronde_help(command = 'basic', error: false)
|
64
67
|
warn R18n.t.fronde.bin.error.no_command if error
|
65
|
-
|
66
|
-
cmd_opt = Fronde::Utils::FRONDE_COMMANDS[cmd]
|
68
|
+
cmd_opt = Fronde::Utils.command_options(command)
|
67
69
|
label = cmd_opt[:label] || command
|
68
70
|
warn format("%<label>s\n\n", label: R18n.t.fronde.bin.usage(label))
|
71
|
+
cmd = cmd_opt[:name] || command
|
69
72
|
if R18n.t.fronde.bin.commands[cmd].translated?
|
70
73
|
warn format("%<label>s\n\n", label: R18n.t.fronde.bin.commands[cmd])
|
71
74
|
end
|
@@ -76,6 +79,13 @@ module Fronde
|
|
76
79
|
|
77
80
|
private
|
78
81
|
|
82
|
+
def update_config
|
83
|
+
cnf = @options.merge
|
84
|
+
cnf.delete(:verbose)
|
85
|
+
cnf.transform_keys!(&:to_s)
|
86
|
+
Fronde::Config.save(Fronde::Config.settings.merge(cnf))
|
87
|
+
end
|
88
|
+
|
79
89
|
def new_file_name(file_path)
|
80
90
|
file_path = File.expand_path(file_path || '')
|
81
91
|
return file_path if file_path[-4..] == '.org'
|
data/lib/fronde/cli.rb
CHANGED
@@ -36,14 +36,14 @@ module Fronde
|
|
36
36
|
|
37
37
|
fronde_spec = Gem::Specification.find_by_name 'fronde'
|
38
38
|
R18n.default_places = "\#{fronde_spec.gem_dir}/locales"
|
39
|
-
R18n.set(Fronde::Config.
|
39
|
+
R18n.set(Fronde::Config.get('lang', 'en'))
|
40
40
|
R18n::Filters.on(:named_variables)
|
41
41
|
|
42
42
|
Dir.glob("\#{fronde_spec.gem_dir}/lib/tasks/*.rake").each { |r| import r }
|
43
43
|
|
44
44
|
task default: 'site:build'
|
45
45
|
RAKE
|
46
|
-
|
46
|
+
File.write 'Rakefile', rakefile
|
47
47
|
end
|
48
48
|
|
49
49
|
def init_gitignore
|
@@ -54,7 +54,7 @@ module Fronde
|
|
54
54
|
public_html
|
55
55
|
var
|
56
56
|
GITIGNORE
|
57
|
-
|
57
|
+
File.write '.gitignore', gitignore
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
@@ -4,6 +4,20 @@ require 'json'
|
|
4
4
|
require 'open-uri'
|
5
5
|
require 'fronde/version'
|
6
6
|
|
7
|
+
def fetch_org_version
|
8
|
+
# Retrieve last org version from git repository tags page.
|
9
|
+
tag_rx = Regexp.new(
|
10
|
+
'<a href=\'/cgit/emacs/org-mode.git/tag/\?h=' \
|
11
|
+
'(?<tag>release_(?<number>[^\']+))\'>\k<tag></a>'
|
12
|
+
)
|
13
|
+
versions = URI(
|
14
|
+
'https://git.savannah.gnu.org/cgit/emacs/org-mode.git/refs/'
|
15
|
+
).open.readlines.map do |line|
|
16
|
+
line.match(tag_rx) { |matchdata| matchdata[:number] }
|
17
|
+
end
|
18
|
+
versions.compact.first
|
19
|
+
end
|
20
|
+
|
7
21
|
module Fronde
|
8
22
|
# This module contains utilitary methods to ease ~org-config.el~
|
9
23
|
# file generation
|
@@ -14,15 +28,12 @@ module Fronde
|
|
14
28
|
def org_last_version
|
15
29
|
return @org_version if @org_version
|
16
30
|
if File.exist?('var/tmp/last_org_version')
|
17
|
-
@org_version =
|
31
|
+
@org_version = File.read('var/tmp/last_org_version')
|
18
32
|
return @org_version
|
19
33
|
end
|
20
|
-
|
21
|
-
URI('https://updates.orgmode.org/data/releases').open.read
|
22
|
-
).sort { |a, b| b['date'] <=> a['date'] }
|
23
|
-
@org_version = versions.first['version']
|
34
|
+
@org_version = fetch_org_version
|
24
35
|
FileUtils.mkdir_p 'var/tmp'
|
25
|
-
|
36
|
+
File.write('var/tmp/last_org_version', @org_version)
|
26
37
|
@org_version
|
27
38
|
end
|
28
39
|
|
@@ -33,24 +44,29 @@ module Fronde
|
|
33
44
|
# existed already.
|
34
45
|
#
|
35
46
|
# @return [Integer] the length written (as returned by the
|
36
|
-
# underlying ~
|
47
|
+
# underlying ~File.write~ method call)
|
48
|
+
# rubocop:disable Metrics/MethodLength
|
37
49
|
def write_org_lisp_config(with_tags: false)
|
38
50
|
projects = org_generate_projects(with_tags: with_tags)
|
39
51
|
workdir = Dir.pwd
|
40
|
-
content =
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
52
|
+
content = File.read(File.expand_path('./org-config.el', __dir__))
|
53
|
+
.gsub('__VERSION__', Fronde::VERSION)
|
54
|
+
.gsub('__WORK_DIR__', workdir)
|
55
|
+
.gsub('__FRONDE_DIR__', __dir__)
|
56
|
+
.gsub('__ORG_VER__', org_last_version)
|
57
|
+
.gsub(
|
58
|
+
'__ALL_PROJECTS__',
|
59
|
+
projects.values.join("\n ")
|
60
|
+
)
|
61
|
+
.gsub('__THEME_CONFIG__', org_default_theme_config)
|
62
|
+
.gsub('__ALL_PROJECTS_NAMES__', project_names(projects))
|
63
|
+
.gsub('__LONG_DATE_FMT__', r18n_full_datetime_format)
|
64
|
+
.gsub('__AUTHOR_EMAIL__', get('author_email', ''))
|
65
|
+
.gsub('__AUTHOR_NAME__', get('author'))
|
51
66
|
FileUtils.mkdir_p "#{workdir}/var/lib"
|
52
|
-
|
67
|
+
File.write("#{workdir}/var/lib/org-config.el", content)
|
53
68
|
end
|
69
|
+
# rubocop:enable Metrics/MethodLength
|
54
70
|
|
55
71
|
# Generate emacs directory variables file.
|
56
72
|
#
|
@@ -59,11 +75,11 @@ module Fronde
|
|
59
75
|
# of this fronde instance.
|
60
76
|
#
|
61
77
|
# @return [Integer] the length written (as returned by the
|
62
|
-
# underlying ~
|
78
|
+
# underlying ~File.write~ method call)
|
63
79
|
def write_dir_locals
|
64
80
|
workdir = Dir.pwd
|
65
81
|
# rubocop:disable Layout/LineLength
|
66
|
-
|
82
|
+
File.write(
|
67
83
|
"#{workdir}/.dir-locals.el",
|
68
84
|
"((org-mode . ((eval . (load-file \"#{workdir}/var/lib/org-config.el\")))))"
|
69
85
|
)
|
@@ -93,12 +109,10 @@ module Fronde
|
|
93
109
|
names = projects.keys.map do |p|
|
94
110
|
["\"#{p}\"", "\"#{p}-assets\""]
|
95
111
|
end.flatten
|
96
|
-
unless
|
97
|
-
names << "\"theme-#{settings['theme']}\""
|
98
|
-
end
|
112
|
+
names << "\"theme-#{get('theme')}\"" unless get('theme') == 'default'
|
99
113
|
sources.each do |s|
|
100
114
|
# Default theme defined in settings is already included
|
101
|
-
next unless s['theme'] && s['theme'] !=
|
115
|
+
next unless s['theme'] && s['theme'] != get('theme')
|
102
116
|
# Never include theme named 'default' as it does not rely on any
|
103
117
|
# file to export.
|
104
118
|
next if s['theme'] == 'default'
|
@@ -118,9 +132,9 @@ module Fronde
|
|
118
132
|
def publication_path(project)
|
119
133
|
publish_in = [Dir.pwd]
|
120
134
|
if project['type'] == 'gemini'
|
121
|
-
publish_in << (
|
135
|
+
publish_in << get('gemini_public_folder', 'public_gmi')
|
122
136
|
else
|
123
|
-
publish_in <<
|
137
|
+
publish_in << get('public_folder')
|
124
138
|
end
|
125
139
|
publish_in << project['target'] unless project['target'] == '.'
|
126
140
|
publish_in.join('/')
|
@@ -187,7 +201,7 @@ module Fronde
|
|
187
201
|
'html-head-include-default-style' => 't',
|
188
202
|
'html-head-include-scripts' => 't'
|
189
203
|
}
|
190
|
-
curtheme = project['theme'] ||
|
204
|
+
curtheme = project['theme'] || get('theme')
|
191
205
|
return defaults if curtheme.nil? || curtheme == 'default'
|
192
206
|
defaults['html-head'] = org_default_html_head
|
193
207
|
defaults['html-head-include-default-style'] = 'nil'
|
@@ -205,7 +219,7 @@ module Fronde
|
|
205
219
|
else
|
206
220
|
defaults.merge!(
|
207
221
|
org_default_html_options(project),
|
208
|
-
|
222
|
+
get('org-html', {}),
|
209
223
|
project['org-html'] || {}
|
210
224
|
)
|
211
225
|
end
|
@@ -213,14 +227,14 @@ module Fronde
|
|
213
227
|
end
|
214
228
|
|
215
229
|
def expand_vars_in_html_head(head, project)
|
216
|
-
curtheme = project['theme'] ||
|
230
|
+
curtheme = project['theme'] || get('theme')
|
217
231
|
# Head may be frozen when coming from settings
|
218
232
|
head = head.gsub('__THEME__', curtheme)
|
219
|
-
.gsub('__DOMAIN__',
|
233
|
+
.gsub('__DOMAIN__', get('domain'))
|
220
234
|
return head.gsub('__ATOM_FEED__', '') unless project['is_blog']
|
221
235
|
atomfeed = <<~ATOMFEED
|
222
236
|
<link rel="alternate" type="application/atom+xml" title="Atom 1.0"
|
223
|
-
href="#{
|
237
|
+
href="#{get('domain')}/feeds/index.xml" />
|
224
238
|
ATOMFEED
|
225
239
|
head.gsub('__ATOM_FEED__', atomfeed)
|
226
240
|
end
|
@@ -261,7 +275,7 @@ module Fronde
|
|
261
275
|
end
|
262
276
|
|
263
277
|
def org_default_theme_config
|
264
|
-
theme_config = org_theme_config(
|
278
|
+
theme_config = org_theme_config(get('theme'))
|
265
279
|
return theme_config if theme_config == ''
|
266
280
|
format("\n %<conf>s", conf: theme_config)
|
267
281
|
end
|
@@ -278,7 +292,7 @@ module Fronde
|
|
278
292
|
# rubocop:enable Layout/LineLength
|
279
293
|
' :recursive t',
|
280
294
|
format(' :publishing-directory "%<wd>s/%<pub>s/assets/%<theme>s"',
|
281
|
-
wd: workdir, pub:
|
295
|
+
wd: workdir, pub: get('public_folder'), theme: theme),
|
282
296
|
' :publishing-function org-publish-attachment)'
|
283
297
|
].join("\n ").strip
|
284
298
|
end
|
data/lib/fronde/config.rb
CHANGED
@@ -24,7 +24,7 @@ module Fronde
|
|
24
24
|
# Settings will be available like this:
|
25
25
|
#
|
26
26
|
# #+begin_src
|
27
|
-
# Fronde::Config.
|
27
|
+
# Fronde::Config.get('author')
|
28
28
|
# => "Alice Doe"
|
29
29
|
# #+end_src
|
30
30
|
class Config
|
@@ -33,15 +33,38 @@ module Fronde
|
|
33
33
|
class << self
|
34
34
|
# Access the current website settings
|
35
35
|
#
|
36
|
-
# If
|
37
|
-
#
|
36
|
+
# If necessary, this method will load settings from a config
|
37
|
+
# file.
|
38
38
|
#
|
39
39
|
# @return [Hash] the website settings
|
40
40
|
def settings
|
41
|
-
|
41
|
+
load_settings
|
42
42
|
@config
|
43
43
|
end
|
44
44
|
|
45
|
+
# Return a named setting.
|
46
|
+
#
|
47
|
+
# ~setting~ may be a ~String~ or an ~Array~.
|
48
|
+
#
|
49
|
+
# If the given ~setting~ name is an Array, this method will
|
50
|
+
# behave as ~Hash::dig~.
|
51
|
+
#
|
52
|
+
# If no value is found for the given setting, ~default~ will be
|
53
|
+
# returned.
|
54
|
+
#
|
55
|
+
# @param setting [String, Array] the setting to get
|
56
|
+
# @param default the default value to use if ~setting~ is absent
|
57
|
+
# @return the setting value or nil
|
58
|
+
def get(setting, default = nil)
|
59
|
+
load_settings
|
60
|
+
if setting.is_a? Array
|
61
|
+
value = @config.dig(*setting)
|
62
|
+
else
|
63
|
+
value = @config[setting]
|
64
|
+
end
|
65
|
+
value || default
|
66
|
+
end
|
67
|
+
|
45
68
|
# Save the settings given as a parameter to the ~config.yml~ file.
|
46
69
|
#
|
47
70
|
# Not only this method overwrite the old settings, but it replace
|
@@ -58,25 +81,42 @@ module Fronde
|
|
58
81
|
# which may be different from a system to another. Thus it may
|
59
82
|
# be confusing if one use fronde on two different computer and
|
60
83
|
# these params always change.
|
84
|
+
default_keys = default_settings.keys
|
61
85
|
new_config.delete_if do |k, v|
|
62
|
-
|
63
|
-
&& v == default_settings[k]
|
86
|
+
default_keys.include?(k) && v == default_settings[k]
|
64
87
|
end
|
65
|
-
|
88
|
+
File.write 'config.yml', new_config.to_yaml
|
89
|
+
@config = @sources = nil
|
66
90
|
load_settings # Reload config, taking default settings into account
|
67
91
|
end
|
68
92
|
|
93
|
+
# Reset settings
|
94
|
+
#
|
95
|
+
# This method is handy for testing purpose. Next call to
|
96
|
+
# {file:Fronde/Config.html#get-class_method get} or
|
97
|
+
# {file:Fronde/Config.html#settings-class_method settings} will
|
98
|
+
# force reload the settings from the config file
|
99
|
+
#
|
100
|
+
# @return nil
|
101
|
+
def reset
|
102
|
+
@sources = @config = nil
|
103
|
+
end
|
104
|
+
|
69
105
|
# Load the given settings as if they comes from the ~config.yml~ file.
|
70
106
|
#
|
71
|
-
# This method is handy for testing purpose.
|
107
|
+
# This method is handy for testing purpose. Next call to
|
108
|
+
# {file:Fronde/Config.html#get-class_method get},
|
109
|
+
# {file:Fronde/Config.html#sources-class_method sources} or
|
72
110
|
# {file:Fronde/Config.html#settings-class_method settings} will
|
73
111
|
# use these new settings.
|
74
112
|
#
|
75
113
|
# @param config [Hash] the settings to artificially load
|
76
114
|
# @return [Hash] the new settings
|
77
115
|
def load_test(config)
|
78
|
-
|
116
|
+
reset
|
79
117
|
@config = default_settings.merge config
|
118
|
+
sources
|
119
|
+
@config
|
80
120
|
end
|
81
121
|
|
82
122
|
# Return the qualified projects sources list.
|
@@ -84,8 +124,9 @@ module Fronde
|
|
84
124
|
# @return [Array] the fully qualified projects sources list
|
85
125
|
def sources
|
86
126
|
return @sources if @sources
|
127
|
+
load_settings
|
87
128
|
default_sources = [{ 'path' => 'src', 'target' => '.' }]
|
88
|
-
@sources = (
|
129
|
+
@sources = get('sources', default_sources).map do |s|
|
89
130
|
build_source(s)
|
90
131
|
end.compact
|
91
132
|
end
|
@@ -93,7 +134,7 @@ module Fronde
|
|
93
134
|
private
|
94
135
|
|
95
136
|
def load_settings
|
96
|
-
@
|
137
|
+
return @config if @config
|
97
138
|
conf_file = 'config.yml'
|
98
139
|
if File.exist? conf_file
|
99
140
|
@config = default_settings.merge(YAML.load_file(conf_file)).freeze
|
data/lib/fronde/emacs.rb
CHANGED
@@ -24,7 +24,7 @@ module Fronde
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def emacs_command(*arguments)
|
27
|
-
default_emacs = Fronde::Config.
|
27
|
+
default_emacs = Fronde::Config.get('emacs')
|
28
28
|
emacs_cmd = [
|
29
29
|
default_emacs || 'emacs -Q --batch -nw',
|
30
30
|
'--eval \'(setq enable-dir-local-variables nil)\''
|
@@ -19,7 +19,7 @@ module Fronde
|
|
19
19
|
slug = Fronde::OrgFile.slug index_name
|
20
20
|
FileUtils.mkdir_p "#{@pubdir}/feeds"
|
21
21
|
atomdest = "#{@pubdir}/feeds/#{slug}.xml"
|
22
|
-
|
22
|
+
File.write(atomdest, to_atom(index_name))
|
23
23
|
end
|
24
24
|
|
25
25
|
private
|
@@ -29,13 +29,12 @@ module Fronde
|
|
29
29
|
# @param title [String] the title of the current atom feed
|
30
30
|
# @return [String] the Atom header as a String
|
31
31
|
def atom_header(title)
|
32
|
-
domain = Fronde::Config.
|
32
|
+
domain = Fronde::Config.get('domain')
|
33
33
|
upddate = @date.rfc3339
|
34
34
|
if title == 'index'
|
35
35
|
slug = 'index'
|
36
36
|
tagurl = domain
|
37
|
-
title = Fronde::Config.
|
38
|
-
R18n.t.fronde.index.all_tags
|
37
|
+
title = Fronde::Config.get('title', R18n.t.fronde.index.all_tags)
|
39
38
|
else
|
40
39
|
slug = Fronde::OrgFile.slug(title)
|
41
40
|
tagurl = "#{domain}/tags/#{slug}.html"
|
@@ -47,13 +46,13 @@ module Fronde
|
|
47
46
|
<feed xmlns="http://www.w3.org/2005/Atom"
|
48
47
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
49
48
|
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
|
50
|
-
xml:lang="#{Fronde::Config.
|
49
|
+
xml:lang="#{Fronde::Config.get('lang')}">
|
51
50
|
|
52
51
|
<title>#{title}</title>
|
53
52
|
<link href="#{domain}/feeds/#{slug}.xml" rel="self" type="application/atom+xml"/>
|
54
53
|
<link href="#{tagurl}" rel="alternate" type="text/html" title="#{title}"/>
|
55
54
|
<updated>#{upddate}</updated>
|
56
|
-
<author><name>#{Fronde::Config.
|
55
|
+
<author><name>#{Fronde::Config.get('author', '')}</name></author>
|
57
56
|
<id>urn:md5:#{Digest::MD5.hexdigest(domain)}</id>
|
58
57
|
<generator uri="https://git.umaneti.net/fronde/about/">Fronde</generator>
|
59
58
|
ENDATOM
|
@@ -18,7 +18,7 @@ module Fronde
|
|
18
18
|
FileUtils.mkdir 'tags' unless Dir.exist? 'tags'
|
19
19
|
content = to_org index_name
|
20
20
|
orgdest = "tags/#{slug}.org"
|
21
|
-
|
21
|
+
File.write(orgdest, content)
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
@@ -37,7 +37,7 @@ module Fronde
|
|
37
37
|
next unless Dir.exist?(project['path'])
|
38
38
|
warn "Generated blog home for #{project['name']}" if verbose
|
39
39
|
orgdest = format('%<root>s/index.org', root: project['path'])
|
40
|
-
|
40
|
+
File.write(orgdest, to_org(project['name'], is_project: true))
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -57,7 +57,7 @@ module Fronde
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def tag_published_url(tag_name)
|
60
|
-
domain = Fronde::Config.
|
60
|
+
domain = Fronde::Config.get('domain')
|
61
61
|
title = @tags_names[tag_name]
|
62
62
|
tag_link = "#{domain}/tags/#{tag_name}.html"
|
63
63
|
"[[#{tag_link}][#{title}]]"
|
@@ -67,12 +67,12 @@ module Fronde
|
|
67
67
|
if is_tag
|
68
68
|
title = @tags_names[title]
|
69
69
|
elsif title.nil? || title == 'index'
|
70
|
-
title = Fronde::Config.
|
70
|
+
title = Fronde::Config.get('title')
|
71
71
|
end
|
72
72
|
<<~HEADER.strip
|
73
73
|
#+title: #{title}
|
74
|
-
#+author: #{Fronde::Config.
|
75
|
-
#+language: #{Fronde::Config.
|
74
|
+
#+author: #{Fronde::Config.get('author')}
|
75
|
+
#+language: #{Fronde::Config.get('lang')}
|
76
76
|
HEADER
|
77
77
|
end
|
78
78
|
|
data/lib/fronde/index.rb
CHANGED
@@ -6,7 +6,7 @@ module Fronde
|
|
6
6
|
def source_for_target(file_name)
|
7
7
|
# file_name may be frozen...
|
8
8
|
src = file_name.sub(/\.html\z/, '.org')
|
9
|
-
pubfolder = Fronde::Config.
|
9
|
+
pubfolder = Fronde::Config.get('public_folder')
|
10
10
|
src.sub!(/^#{pubfolder}\//, '')
|
11
11
|
# Look for match in each possible sources. The first found wins.
|
12
12
|
Fronde::Config.sources.each do |project|
|
@@ -36,7 +36,7 @@ module Fronde
|
|
36
36
|
target = "#{project['target']}/#{target}" if project['target'] != '.'
|
37
37
|
end
|
38
38
|
return target unless with_public_folder
|
39
|
-
pubfolder = Fronde::Config.
|
39
|
+
pubfolder = Fronde::Config.get('public_folder')
|
40
40
|
"#{pubfolder}/#{target}"
|
41
41
|
end
|
42
42
|
|
@@ -8,7 +8,7 @@ module Fronde
|
|
8
8
|
# Main method, which will call the other to initialize an
|
9
9
|
# {Fronde::OrgFile} instance.
|
10
10
|
def extract_data
|
11
|
-
@content =
|
11
|
+
@content = File.read @file
|
12
12
|
@title = extract_title
|
13
13
|
@subtitle = extract_subtitle
|
14
14
|
@date = extract_date
|
@@ -49,7 +49,7 @@ module Fronde
|
|
49
49
|
|
50
50
|
def extract_author
|
51
51
|
m = /^#\+author:(.+)$/i.match(@content)
|
52
|
-
return Fronde::Config.
|
52
|
+
return Fronde::Config.get('author') if m.nil?
|
53
53
|
m[1].strip
|
54
54
|
end
|
55
55
|
|
@@ -61,7 +61,7 @@ module Fronde
|
|
61
61
|
|
62
62
|
def extract_lang
|
63
63
|
m = /^#\+language:(.+)$/i.match(@content)
|
64
|
-
return Fronde::Config.
|
64
|
+
return Fronde::Config.get('lang') if m.nil?
|
65
65
|
m[1].strip
|
66
66
|
end
|
67
67
|
|
data/lib/fronde/org_file.rb
CHANGED
@@ -15,7 +15,7 @@ module Fronde
|
|
15
15
|
# This class is responsible for reading or writing existing or new org
|
16
16
|
# files, and formating their content to be used on the generated
|
17
17
|
# website.
|
18
|
-
class OrgFile
|
18
|
+
class OrgFile # rubocop:disable Metrics/ClassLength
|
19
19
|
# @return [String] the title of the current org document, taken from
|
20
20
|
# the ~#+title:~ header.
|
21
21
|
attr_reader :title
|
@@ -240,7 +240,7 @@ module Fronde
|
|
240
240
|
.gsub('%k', @keywords.join(', '))
|
241
241
|
.gsub('%K', keywords_to_html)
|
242
242
|
.gsub('%l', @lang)
|
243
|
-
.gsub('%L',
|
243
|
+
.gsub('%L', Fronde::Config.get('license', '').gsub(/\s+/, ' ').strip)
|
244
244
|
.gsub('%n', "Fronde #{Fronde::VERSION}")
|
245
245
|
.gsub('%N', "<a href=\"https://git.umaneti.net/fronde/about/\">Fronde</a> #{Fronde::VERSION}")
|
246
246
|
.gsub('%s', @subtitle)
|
@@ -257,12 +257,12 @@ module Fronde
|
|
257
257
|
# The intermediate parent folders are created if necessary.
|
258
258
|
#
|
259
259
|
# @return [Integer] the length written (as returned by the
|
260
|
-
# underlying ~
|
260
|
+
# underlying ~File.write~ method call)
|
261
261
|
def write
|
262
262
|
raise TypeError, 'no conversion from nil file name to path.' if @file.nil?
|
263
263
|
file_dir = File.dirname @file
|
264
264
|
FileUtils.mkdir_p file_dir unless Dir.exist? file_dir
|
265
|
-
|
265
|
+
File.write @file, @content
|
266
266
|
end
|
267
267
|
|
268
268
|
private
|
@@ -272,7 +272,7 @@ module Fronde
|
|
272
272
|
@html_file = Fronde::OrgFile.target_for_source(
|
273
273
|
@file, @project, with_public_folder: false
|
274
274
|
)
|
275
|
-
@url = "#{Fronde::Config.
|
275
|
+
@url = "#{Fronde::Config.get('domain')}/#{@html_file}"
|
276
276
|
end
|
277
277
|
|
278
278
|
def init_empty_file
|
@@ -280,9 +280,9 @@ module Fronde
|
|
280
280
|
@subtitle = ''
|
281
281
|
@date = DateTime.now
|
282
282
|
@notime = false
|
283
|
-
@author = @options[:author] || Fronde::Config.
|
283
|
+
@author = @options[:author] || Fronde::Config.get('author')
|
284
284
|
@keywords = []
|
285
|
-
@lang = @options[:lang] || Fronde::Config.
|
285
|
+
@lang = @options[:lang] || Fronde::Config.get('lang')
|
286
286
|
@excerpt = ''
|
287
287
|
body = @options[:content] || ''
|
288
288
|
@content = @options[:raw_content] || <<~ORG
|
data/lib/fronde/preview.rb
CHANGED
@@ -19,9 +19,9 @@ module Fronde # rubocop:disable Style/Documentation
|
|
19
19
|
private
|
20
20
|
|
21
21
|
def local_path(requested_path)
|
22
|
-
routes = Fronde::Config.
|
22
|
+
routes = Fronde::Config.get(['preview', 'routes'], {})
|
23
23
|
return routes[requested_path] if routes.has_key? requested_path
|
24
|
-
local_path = Fronde::Config.
|
24
|
+
local_path = Fronde::Config.get('public_folder') + requested_path
|
25
25
|
if File.directory? local_path
|
26
26
|
local_path = format(
|
27
27
|
'%<path>s/index.html', path: local_path.delete_suffix('/')
|
@@ -32,9 +32,9 @@ module Fronde # rubocop:disable Style/Documentation
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def parse_body(local_path, local_host)
|
35
|
-
body =
|
35
|
+
body = File.read local_path
|
36
36
|
return body unless local_path.match?(/\.(?:ht|x)ml\z/)
|
37
|
-
domain = Fronde::Config.
|
37
|
+
domain = Fronde::Config.get('domain')
|
38
38
|
return body if domain == ''
|
39
39
|
body.gsub(/"file:\/\//, format('"%<host>s', host: local_host))
|
40
40
|
.gsub(/"#{domain}/, format('"%<host>s', host: local_host))
|
@@ -45,7 +45,7 @@ module Fronde # rubocop:disable Style/Documentation
|
|
45
45
|
def start_preview
|
46
46
|
# Inspired by ruby un.rb library, which allows normally to start a
|
47
47
|
# webrick server in one line: ruby -run -e httpd public_html -p 5000
|
48
|
-
port = Fronde::Config.
|
48
|
+
port = Fronde::Config.get(['preview', 'server_port'], 5000)
|
49
49
|
s = WEBrick::HTTPServer.new(Port: port)
|
50
50
|
s.mount '/', Fronde::PreviewServlet
|
51
51
|
['TERM', 'QUIT', 'INT'].each { |sig| trap(sig, proc { s.shutdown }) }
|
data/lib/fronde/templater.rb
CHANGED
@@ -52,7 +52,7 @@ module Fronde
|
|
52
52
|
private
|
53
53
|
|
54
54
|
def filter_templates(file_name)
|
55
|
-
templates = Fronde::Config.
|
55
|
+
templates = Fronde::Config.get('templates')
|
56
56
|
return [] if templates.nil? || templates.empty?
|
57
57
|
templates.filter { |t| check_required_keys(t, file_name) }
|
58
58
|
end
|
@@ -71,7 +71,7 @@ module Fronde
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def check_path(file_name, pathes)
|
74
|
-
pub_folder = Fronde::Config.
|
74
|
+
pub_folder = Fronde::Config.get('public_folder')
|
75
75
|
if pathes.is_a?(Array)
|
76
76
|
pathes.each do |tp|
|
77
77
|
return true if File.fnmatch?("#{pub_folder}#{tp}",
|
data/lib/fronde/utils.rb
CHANGED
@@ -7,6 +7,9 @@ require 'r18n-core'
|
|
7
7
|
require 'fronde/config'
|
8
8
|
|
9
9
|
module Fronde
|
10
|
+
# Default Error, which may be raised by fronde code
|
11
|
+
class Error < ::StandardError; end
|
12
|
+
|
10
13
|
# Embeds usefull methods, mainly used in rake tasks.
|
11
14
|
module Utils
|
12
15
|
# @return [Hash] the possible throbber themes
|
@@ -38,7 +41,8 @@ module Fronde
|
|
38
41
|
# configuration
|
39
42
|
FRONDE_COMMANDS = {
|
40
43
|
'init' => { opts: ['-a', '-h', '-l', '-t', '-v'] },
|
41
|
-
'
|
44
|
+
'update' => { opts: ['-a', '-h', '-l', '-t', '-v'] },
|
45
|
+
'config' => { alias: 'update' },
|
42
46
|
'preview' => { opts: ['-h'] },
|
43
47
|
'open' => { opts: ['-a', '-h', '-l', '-t', '-v'] },
|
44
48
|
'edit' => { alias: 'open' },
|
@@ -144,6 +148,17 @@ module Fronde
|
|
144
148
|
command
|
145
149
|
end
|
146
150
|
|
151
|
+
# Returns the given command options.
|
152
|
+
#
|
153
|
+
# This method will first try to resolve command alias, if any.
|
154
|
+
#
|
155
|
+
# @param command [String] the command, which options should be returned
|
156
|
+
# @return [Hash] the command options
|
157
|
+
def command_options(command)
|
158
|
+
cmd = resolve_possible_alias command
|
159
|
+
FRONDE_COMMANDS[cmd].merge(name: cmd)
|
160
|
+
end
|
161
|
+
|
147
162
|
# Try to discover the current host operating system.
|
148
163
|
#
|
149
164
|
# @return [String] either apple, windows or linux (default)
|
data/lib/fronde/version.rb
CHANGED
data/lib/tasks/org.rake
CHANGED
@@ -12,12 +12,19 @@ CLOBBER.push(
|
|
12
12
|
'var/lib/org-config.el', '.dir-locals.el', 'lib/htmlize.el'
|
13
13
|
)
|
14
14
|
|
15
|
+
def make_org_cmd(org_dir, target)
|
16
|
+
make = ['make', '-C', org_dir, target]
|
17
|
+
return make.join(' ') if verbose
|
18
|
+
make.insert(3, '-s')
|
19
|
+
make << 'EMACSQ="emacs -Q --eval \'(setq inhibit-message t)\'"'
|
20
|
+
make.join(' ')
|
21
|
+
end
|
22
|
+
|
15
23
|
namespace :org do
|
16
24
|
directory 'var/tmp'
|
17
25
|
|
18
26
|
desc 'Download last version of Org'
|
19
27
|
file 'var/tmp/org.tar.gz' => 'var/tmp' do
|
20
|
-
verbose = Rake::FileUtilsExt.verbose_flag
|
21
28
|
download = Thread.new do
|
22
29
|
Thread.current[:org_version] = Fronde::Config.org_last_version
|
23
30
|
Fronde::Utils.download_org
|
@@ -32,20 +39,14 @@ namespace :org do
|
|
32
39
|
|
33
40
|
desc 'Compile Org'
|
34
41
|
task compile: 'var/tmp/org.tar.gz' do |task|
|
35
|
-
verbose = Rake::FileUtilsExt.verbose_flag
|
36
42
|
org_version = Fronde::Config.org_last_version
|
37
43
|
org_dir = "lib/org-#{org_version}"
|
38
44
|
next if Dir.exist?("#{org_dir}/lisp")
|
39
|
-
make = ['make', '-C', org_dir]
|
40
|
-
unless verbose
|
41
|
-
make << '-s'
|
42
|
-
make << 'EMACSQ="emacs -Q --eval \'(setq inhibit-message t)\'"'
|
43
|
-
end
|
44
45
|
build = Thread.new do
|
45
46
|
sh "tar -C lib -xzf #{task.prerequisites[0]}"
|
46
47
|
mv "lib/org-mode-release_#{org_version}", org_dir
|
47
|
-
sh(
|
48
|
-
sh(
|
48
|
+
sh make_org_cmd(org_dir, 'compile')
|
49
|
+
sh make_org_cmd(org_dir, 'autoloads')
|
49
50
|
Dir.glob('lib/org-[0-9.]*').each do |ov|
|
50
51
|
next if ov == org_dir
|
51
52
|
rm_r ov
|
@@ -65,14 +66,14 @@ namespace :org do
|
|
65
66
|
htmlize = URI(
|
66
67
|
'https://raw.githubusercontent.com/hniksic/emacs-htmlize/master/htmlize.el'
|
67
68
|
).open.read
|
68
|
-
|
69
|
+
File.write 'lib/htmlize.el', htmlize
|
69
70
|
end
|
70
71
|
|
71
72
|
file 'lib/ox-gmi.el' => 'lib' do
|
72
73
|
ox_gmi = URI(
|
73
74
|
'https://git.umaneti.net/ox-gmi.el/plain/ox-gmi.el'
|
74
75
|
).open.read
|
75
|
-
|
76
|
+
File.write 'lib/ox-gmi.el', ox_gmi
|
76
77
|
end
|
77
78
|
|
78
79
|
file 'var/lib/org-config.el' => ['lib/htmlize.el', 'lib/ox-gmi.el'] do
|
@@ -85,7 +86,7 @@ namespace :org do
|
|
85
86
|
|
86
87
|
desc 'Install Org'
|
87
88
|
multitask install: ['org:compile', '.dir-locals.el'] do
|
88
|
-
mkdir_p "#{Fronde::Config.
|
89
|
+
mkdir_p "#{Fronde::Config.get('public_folder')}/assets"
|
89
90
|
Fronde::Config.sources.each do |s|
|
90
91
|
mkdir_p s['path'] unless Dir.exist? s['path']
|
91
92
|
end
|
data/lib/tasks/site.rake
CHANGED
@@ -10,7 +10,6 @@ namespace :site do
|
|
10
10
|
desc 'Generates all index files'
|
11
11
|
task :index do
|
12
12
|
index = Fronde::Index.new
|
13
|
-
verbose = Rake::FileUtilsExt.verbose_flag
|
14
13
|
if verbose
|
15
14
|
index.write_all
|
16
15
|
next
|
@@ -28,7 +27,7 @@ namespace :site do
|
|
28
27
|
args.with_defaults(:force? => false)
|
29
28
|
build_html = Thread.new do
|
30
29
|
rm_r 'var/tmp/timestamps', force: true if args[:force?]
|
31
|
-
Fronde::Emacs.new(verbose:
|
30
|
+
Fronde::Emacs.new(verbose: verbose).publish
|
32
31
|
end
|
33
32
|
begin
|
34
33
|
Fronde::Utils.throbber(build_html, 'Building:')
|
@@ -39,7 +38,7 @@ namespace :site do
|
|
39
38
|
end
|
40
39
|
# :nocov:
|
41
40
|
customize_html = Thread.new do
|
42
|
-
pubfolder = Fronde::Config.
|
41
|
+
pubfolder = Fronde::Config.get('public_folder')
|
43
42
|
Dir["#{pubfolder}/**/*.html"].each do |f|
|
44
43
|
Fronde::Templater.customize_output(f)
|
45
44
|
end
|
data/lib/tasks/sync.rake
CHANGED
@@ -3,8 +3,12 @@
|
|
3
3
|
require 'fronde/config'
|
4
4
|
require 'fronde/utils'
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
module Fronde
|
7
|
+
class SyncError < Error; end
|
8
|
+
end
|
9
|
+
|
10
|
+
def rsync_command(test = nil)
|
11
|
+
rsync_command = Fronde::Config.get('rsync')
|
8
12
|
return rsync_command unless rsync_command.nil?
|
9
13
|
optstring = []
|
10
14
|
optstring << 'n' if test
|
@@ -16,19 +20,37 @@ def rsync_command(verbose, test = nil)
|
|
16
20
|
"rsync -#{optstring.join}rlt --delete"
|
17
21
|
end
|
18
22
|
|
23
|
+
def pull_or_push(direction, label, test)
|
24
|
+
unless [:pull, :push].include? direction
|
25
|
+
raise Fronde::SyncError, 'Not a valid direction'
|
26
|
+
end
|
27
|
+
remote_path = Fronde::Config.get('remote')
|
28
|
+
raise Fronde::SyncError, 'No remote path set' if remote_path.nil?
|
29
|
+
public_folder = Fronde::Config.get('public_folder')
|
30
|
+
# Default is to push
|
31
|
+
cmd = ["#{public_folder}/", remote_path]
|
32
|
+
cmd.reverse! if direction == :pull
|
33
|
+
rsync = rsync_command(test)
|
34
|
+
publish_thread = Thread.new do
|
35
|
+
sh "#{rsync} #{cmd.join(' ')}"
|
36
|
+
end
|
37
|
+
Fronde::Utils.throbber(publish_thread, label)
|
38
|
+
end
|
39
|
+
|
19
40
|
namespace :sync do
|
20
|
-
desc 'Push
|
41
|
+
desc 'Push changes to server'
|
21
42
|
task :push, :test? do |_, args|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
43
|
+
pull_or_push(:push, 'Publishing:', args[:test?])
|
44
|
+
rescue Fronde::SyncError => e
|
45
|
+
warn e
|
46
|
+
next
|
47
|
+
end
|
48
|
+
|
49
|
+
desc 'Pull changes from server'
|
50
|
+
task :pull, :test? do |_, args|
|
51
|
+
pull_or_push(:pull, 'Pulling:', args[:test?])
|
52
|
+
rescue Fronde::SyncError => e
|
53
|
+
warn e
|
54
|
+
next
|
33
55
|
end
|
34
56
|
end
|
data/locales/en.yml
CHANGED
@@ -6,6 +6,7 @@ fronde:
|
|
6
6
|
cmd_title: Commands
|
7
7
|
alias: Alias for %1.
|
8
8
|
init: Initialize your Fronde instance (you just need to do it once).
|
9
|
+
update: Update Fronde dependency (to be run once in a while).
|
9
10
|
preview: 'Start a test web server to preview your website on http://127.0.0.1:5000'
|
10
11
|
open: Open or create an org file.
|
11
12
|
build: Compile your org files to HTML.
|
data/locales/fr.yml
CHANGED
@@ -6,6 +6,7 @@ fronde:
|
|
6
6
|
cmd_title: Commandes
|
7
7
|
alias: Alias pour %1.
|
8
8
|
init: Initialise votre instance de Fronde (vous ne devriez faire cela qu'une fois).
|
9
|
+
update: Met à jour les dépendances de Fronde (à lancer une fois de temps à autre).
|
9
10
|
preview: "Démarre un serveur web de test pour prévisualiser votre site à l'adresse http://127.0.0.1:5000"
|
10
11
|
open: Ouvre ou crée un fichier org.
|
11
12
|
build: Compile vos fichiers org en HTML.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fronde
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Étienne Deparis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.13'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.13'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: r18n-core
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
47
|
+
version: '3.1'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
54
|
+
version: '3.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,70 +128,70 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: '1.
|
131
|
+
version: '1.3'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: '1.
|
138
|
+
version: '1.3'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: rspec
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: '3.
|
145
|
+
version: '3.11'
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: '3.
|
152
|
+
version: '3.11'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: rubocop
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
157
|
- - "~>"
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: '1.
|
159
|
+
version: '1.36'
|
160
160
|
type: :development
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version: '1.
|
166
|
+
version: '1.36'
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: rubocop-performance
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
171
|
- - "~>"
|
172
172
|
- !ruby/object:Gem::Version
|
173
|
-
version: '1.
|
173
|
+
version: '1.15'
|
174
174
|
type: :development
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: '1.
|
180
|
+
version: '1.15'
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: rubocop-rspec
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
185
|
- - "~>"
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version: '2.
|
187
|
+
version: '2.13'
|
188
188
|
type: :development
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
192
|
- - "~>"
|
193
193
|
- !ruby/object:Gem::Version
|
194
|
-
version: '2.
|
194
|
+
version: '2.13'
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
196
|
name: simplecov
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -258,7 +258,11 @@ files:
|
|
258
258
|
homepage: https://git.umaneti.net/fronde/about/
|
259
259
|
licenses:
|
260
260
|
- WTFPL
|
261
|
-
metadata:
|
261
|
+
metadata:
|
262
|
+
rubygems_mfa_required: 'true'
|
263
|
+
source_code_uri: https://git.umaneti.net/fronde
|
264
|
+
homepage_uri: https://etienne.depar.is/fronde/
|
265
|
+
funding_uri: https://liberapay.com/milouse
|
262
266
|
post_install_message:
|
263
267
|
rdoc_options: []
|
264
268
|
require_paths:
|
@@ -274,7 +278,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
274
278
|
- !ruby/object:Gem::Version
|
275
279
|
version: '0'
|
276
280
|
requirements: []
|
277
|
-
rubygems_version: 3.
|
281
|
+
rubygems_version: 3.3.7
|
278
282
|
signing_key:
|
279
283
|
specification_version: 4
|
280
284
|
summary: An opinionated static website generator for Org
|