fronde 0.4.0 → 0.6.0

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ext/nil_time.rb +3 -6
  3. data/lib/ext/time.rb +10 -17
  4. data/lib/ext/time_no_time.rb +27 -0
  5. data/lib/fronde/cli/commands.rb +18 -14
  6. data/lib/fronde/cli/data/fish_completion +20 -0
  7. data/lib/fronde/cli/data/gitignore +0 -1
  8. data/lib/fronde/cli/helpers.rb +0 -2
  9. data/lib/fronde/cli/opt_parse.rb +15 -18
  10. data/lib/fronde/cli/throbber.rb +35 -18
  11. data/lib/fronde/cli.rb +4 -3
  12. data/lib/fronde/config/data/org-config.el +3 -2
  13. data/lib/fronde/config/data/ox-fronde.el +91 -46
  14. data/lib/fronde/config/data/themes/umaneti/css/htmlize.css +364 -0
  15. data/lib/fronde/config/data/themes/umaneti/css/style.css +250 -0
  16. data/lib/fronde/config/data/themes/umaneti/img/bottom.png +0 -0
  17. data/lib/fronde/config/data/themes/umaneti/img/content.png +0 -0
  18. data/lib/fronde/config/data/themes/umaneti/img/tic.png +0 -0
  19. data/lib/fronde/config/data/themes/umaneti/img/top.png +0 -0
  20. data/lib/fronde/config/helpers.rb +1 -19
  21. data/lib/fronde/config/lisp.rb +14 -7
  22. data/lib/fronde/config.rb +47 -31
  23. data/lib/fronde/emacs.rb +23 -9
  24. data/lib/fronde/index/atom_generator.rb +1 -1
  25. data/lib/fronde/index/data/all_tags.org +6 -1
  26. data/lib/fronde/index/data/template.org +8 -4
  27. data/lib/fronde/index/org_generator.rb +10 -6
  28. data/lib/fronde/index.rb +19 -17
  29. data/lib/fronde/org/file.rb +71 -39
  30. data/lib/fronde/org/file_extracter.rb +23 -12
  31. data/lib/fronde/org.rb +14 -12
  32. data/lib/fronde/slug.rb +39 -12
  33. data/lib/fronde/source/gemini.rb +4 -9
  34. data/lib/fronde/source/html.rb +9 -9
  35. data/lib/fronde/source.rb +17 -12
  36. data/lib/fronde/sync/neocities.rb +220 -0
  37. data/lib/fronde/sync/rsync.rb +46 -0
  38. data/lib/fronde/sync.rb +32 -0
  39. data/lib/fronde/templater.rb +35 -51
  40. data/lib/fronde/version.rb +1 -1
  41. data/lib/tasks/cli.rake +45 -13
  42. data/lib/tasks/org.rake +30 -35
  43. data/lib/tasks/site.rake +63 -41
  44. data/lib/tasks/sync.rake +19 -50
  45. data/lib/tasks/tags.rake +2 -2
  46. data/locales/en.yml +143 -81
  47. data/locales/fr.yml +153 -89
  48. metadata +56 -17
  49. data/lib/ext/r18n.rb +0 -17
@@ -5,8 +5,6 @@ require 'digest/md5'
5
5
  require_relative 'org/file'
6
6
 
7
7
  module Fronde
8
- class NoHeadError < ::StandardError; end
9
-
10
8
  # Insert custom part inside generated HTML files.
11
9
  class Templater
12
10
  def initialize(source, dom, config = {})
@@ -19,74 +17,55 @@ module Fronde
19
17
 
20
18
  def apply
21
19
  # Flag the file for this template
22
- head = @dom.xpath('//head').first
23
- raise NoHeadError, self unless head
24
-
25
- head.prepend_child("<!--#{@config['check_line']}-->")
20
+ html = @dom.xpath('//html').first
21
+ html.add_child("<!--#{@config['check_line']}-->\n")
26
22
  content = @org_file.format extract_content
27
23
  # Remove source element if necessary to avoid doubling it during
28
24
  # the insert action
29
25
  @config['source'].unlink if @config.has_key? 'source'
30
26
  # Insert new content
31
- @dom.css(@config['selector']).each do |element|
27
+ @dom.css(@config['selector']).map do |element|
32
28
  insert_new_node_at element, content
33
29
  end
34
30
  end
35
31
 
36
- def in_head?
37
- @dom.xpath('//head').children.any? do |child|
32
+ def applied?
33
+ @dom.xpath('//html').children.any? do |child|
38
34
  next false unless child.comment?
39
35
 
40
36
  child.text == @config['check_line']
41
37
  end
42
38
  end
43
39
 
44
- def valid?(file_name)
40
+ def valid?
45
41
  return false unless @config.has_key?('selector')
46
42
 
47
43
  unless @config.has_key?('content') || @config.has_key?('source')
48
44
  return false
49
45
  end
50
46
 
51
- check_path(file_name)
47
+ check_path
52
48
  end
53
49
 
54
50
  class << self
55
51
  def customize_output(file_name)
56
- source = Fronde::Org::File.new(file_name)
52
+ source = Fronde::Org::File.new file_name
57
53
  # Return if no org file found for this published file
58
- return if source.file.end_with?(file_name)
54
+ return unless source.pub_file
59
55
 
60
- dom = open_dom(file_name)
61
- updated = apply_templates(source, dom, file_name)
62
- write_dom(file_name, dom) if updated
56
+ apply_templates source
63
57
  end
64
58
 
65
- private
66
-
67
- def apply_templates(source, dom, file_name)
68
- Fronde::CONFIG.get('templates', []).map do |config|
59
+ def apply_templates(source)
60
+ public_file = source.pub_file absolute: true
61
+ dom = File.open(public_file, 'r') { Nokogiri::HTML _1 }
62
+ changes = Fronde::CONFIG.get('templates', []).map do |config|
69
63
  template = Fronde::Templater.new(source, dom, config)
70
- next if !template.valid?(file_name) || template.in_head?
64
+ next if !template.valid? || template.applied?
71
65
 
72
66
  template.apply
73
- true
74
- rescue NoHeadError
75
- warn R18n.t.fronde.error.templater.no_head_element(file: file_name)
76
- next
77
- end.any?
78
- end
79
-
80
- def open_dom(file_name)
81
- File.open(file_name, 'r') do |file|
82
- Nokogiri::HTML file
83
- end
84
- end
85
-
86
- def write_dom(file_name, dom)
87
- File.open(file_name, 'w') do |file|
88
- dom.write_to file
89
67
  end
68
+ File.open(public_file, 'w') { dom.write_to _1 } if changes.any?
90
69
  end
91
70
  end
92
71
 
@@ -103,6 +82,17 @@ module Fronde
103
82
  end
104
83
  end
105
84
 
85
+ def warn_no_element(source)
86
+ public_file = @org_file.pub_file(absolute: true)
87
+ warn(
88
+ I18n.t(
89
+ 'fronde.error.templater.no_element_found',
90
+ source: source, file: public_file.sub(/^#{Dir.pwd}/, '.')
91
+ )
92
+ )
93
+ '' # Return empty string
94
+ end
95
+
106
96
  def extract_content
107
97
  # We must either have a source or a content key
108
98
  source = @config.delete 'source'
@@ -111,30 +101,24 @@ module Fronde
111
101
  end
112
102
 
113
103
  node = @dom.css(source)
114
- # Do nothing if we don’t have a reliable content to work with
115
- unless node.any?
116
- warn(
117
- R18n.t.fronde.error.templater.no_element_found(
118
- source: source,
119
- file: Fronde::CONFIG.get('html_public_folder') + @org_file.pub_file
120
- )
121
- )
122
- return ''
104
+ if node.any?
105
+ # Put it back in config
106
+ @config['source'] = node
107
+ return node.to_s
123
108
  end
124
109
 
125
- @config['source'] = node
126
- node.to_s
110
+ # Do nothing if we don’t have a reliable content to work with
111
+ warn_no_element source
127
112
  end
128
113
 
129
- def check_path(file_name)
114
+ def check_path
130
115
  paths = @config['path']
131
116
  return true unless paths
132
117
 
133
118
  paths = [paths] unless paths.is_a? Array
134
119
 
135
- pub_folder = Fronde::CONFIG.get('html_public_folder')
136
120
  paths.any? do |template_path|
137
- File.fnmatch?("#{pub_folder}#{template_path}", file_name)
121
+ File.fnmatch?(template_path, @org_file.pub_file)
138
122
  end
139
123
  end
140
124
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Fronde
4
4
  # @return [String] the version number of the current Fronde release.
5
- VERSION = '0.4.0'
5
+ VERSION = '0.6.0'
6
6
  end
data/lib/tasks/cli.rake CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  require_relative '../fronde/cli/opt_parse'
4
4
 
5
+ def comp_opt_to_liquid(option, command)
6
+ opt_config = Fronde::CLI::OptParse::FRONDE_OPTIONS[option]
7
+ keyword = nil
8
+ unless opt_config[:boolean]
9
+ keyword = opt_config[:keyword] || opt_config[:long].upcase
10
+ end
11
+ {
12
+ 'command' => command,
13
+ 'short' => option,
14
+ 'short_no_dash' => option.delete_prefix('-'),
15
+ 'long' => "--#{opt_config[:long]}",
16
+ 'long_no_dash' => opt_config[:long],
17
+ 'keyword' => keyword,
18
+ 'choices' => opt_config[:choices],
19
+ 'help' => opt_config[:help]
20
+ }
21
+ end
22
+
5
23
  namespace :cli do
6
24
  desc 'Generate an autocomplete file for zsh'
7
25
  task :zsh_complete do
@@ -10,24 +28,38 @@ namespace :cli do
10
28
  data['commands'] = all_commands.filter_map do |command, options|
11
29
  next if options[:alias] || command == 'basic'
12
30
 
13
- opts = (options[:opts] || []).map do |opt|
14
- opt_config = Fronde::CLI::OptParse::FRONDE_OPTIONS[opt]
15
- keyword = nil
16
- unless opt_config[:boolean]
17
- keyword = opt_config[:keyword] || opt_config[:long].upcase
18
- end
19
- { 'short' => opt,
20
- 'long' => "--#{opt_config[:long]}",
21
- 'keyword' => keyword }
22
- end
23
-
24
- translation = R18n.t.fronde.bin.commands[command].tr("'", '’')
31
+ opts = (options[:opts] || []).map { comp_opt_to_liquid(_1, command) }
25
32
  { 'name' => command,
26
- 'translation' => translation,
33
+ 'translation' => I18n.t("fronde.bin.commands.#{command}"),
27
34
  'options' => opts }
28
35
  end
29
36
  source = File.expand_path '../fronde/cli/data/zsh_completion', __dir__
30
37
  template = Liquid::Template.parse(File.read(source))
31
38
  puts template.render(data)
32
39
  end
40
+
41
+ desc 'Generate an autocomplete file for fish'
42
+ task :fish_complete do
43
+ data = { 'commands' => [], 'details' => [] }
44
+ all_commands = []
45
+ Fronde::CLI::OptParse::FRONDE_COMMANDS.each do |command, options|
46
+ next if options[:alias]
47
+
48
+ data['details'] += (options[:opts] || []).map do |opt|
49
+ comp_opt_to_liquid opt, command
50
+ end
51
+ next if command == 'basic'
52
+
53
+ data['commands'] << command
54
+
55
+ help = I18n.t("fronde.bin.commands.#{command}")
56
+ all_commands << "#{command}\\t'#{help}'"
57
+ end
58
+
59
+ data['comcomp'] = all_commands.join('\n')
60
+
61
+ source = File.expand_path '../fronde/cli/data/fish_completion', __dir__
62
+ template = Liquid::Template.parse(File.read(source))
63
+ puts template.render(data)
64
+ end
33
65
  end
data/lib/tasks/org.rake CHANGED
@@ -8,10 +8,12 @@ require_relative '../fronde/cli/throbber'
8
8
  require 'rake/clean'
9
9
 
10
10
  CLOBBER.push(
11
- 'var/lib/org-config.el', '.dir-locals.el',
12
- 'lib/htmlize.el'
11
+ 'var/lib/org-config.el', 'lib/htmlize.el'
13
12
  )
14
13
 
14
+ HTMLIZE_TAG = 'release/1.58'
15
+ OX_GMI_TAG = 'v0.2'
16
+
15
17
  namespace :org do
16
18
  directory 'var/tmp'
17
19
 
@@ -20,54 +22,50 @@ namespace :org do
20
22
  # Weird Rake issue, still executing the task even if the file exists
21
23
  next if File.exist? 'var/tmp/org.tar.gz'
22
24
 
23
- download = Thread.new { Fronde::Org.download }
24
- if verbose
25
- warn R18n.t.fronde.tasks.org.downloaded(version: download.value)
26
- else
27
- Fronde::CLI::Throbber.run(download, R18n.t.fronde.tasks.org.downloading)
25
+ download = Thread.new do
26
+ version = Fronde::Org.download
27
+ puts I18n.t('fronde.tasks.org.downloaded', version:) if verbose
28
28
  end
29
- rescue RuntimeError
30
- warn R18n.t.fronde.tasks.org.no_download if verbose
29
+ Fronde::CLI::Throbber.run(
30
+ download, I18n.t('fronde.tasks.org.downloading'), verbose
31
+ )
32
+ rescue RuntimeError, Interrupt
33
+ warn I18n.t('fronde.tasks.org.no_download') if verbose
31
34
  end
32
35
 
33
36
  desc 'Compile Org'
34
37
  multitask compile: ['var/tmp/org.tar.gz', 'lib'] do |task|
35
- begin
36
- # No need to force fetch last version as it is only interesting as
37
- # part of the upgrade task
38
- org_version = Fronde::Org.last_version
39
- rescue RuntimeError
40
- next
41
- end
42
- org_dir = "lib/org-#{org_version}"
38
+ # No need to force fetch last version as it is only interesting as
39
+ # part of the upgrade task
40
+ version = Fronde::Org.last_version
41
+
42
+ org_dir = "lib/org-#{version}"
43
43
  next if Dir.exist?("#{org_dir}/lisp")
44
44
 
45
45
  build = Thread.new do
46
- Fronde::Org.compile(
47
- task.prerequisites[0], org_version, org_dir, verbose: verbose
48
- )
46
+ Fronde::Org.compile(task.prerequisites[0], version, org_dir, verbose:)
49
47
  Dir.glob('lib/org-[0-9.]*').each { rm_r _1 unless _1 == org_dir }
48
+ puts I18n.t('fronde.tasks.org.installed', version:) if verbose
50
49
  end
51
- if verbose
52
- build.join
53
- warn R18n.t.fronde.tasks.org.installed(version: org_version)
54
- else
55
- Fronde::CLI::Throbber.run(build, R18n.t.fronde.tasks.org.installing)
56
- end
50
+ Fronde::CLI::Throbber.run(
51
+ build, I18n.t('fronde.tasks.org.installing'), verbose
52
+ )
53
+ rescue RuntimeError, Interrupt
54
+ next
57
55
  end
58
56
 
59
57
  directory 'lib'
60
58
 
61
59
  file 'lib/htmlize.el' => 'lib' do
62
60
  htmlize = URI(
63
- 'https://raw.githubusercontent.com/hniksic/emacs-htmlize/master/htmlize.el'
61
+ "https://raw.githubusercontent.com/hniksic/emacs-htmlize/refs/tags/#{HTMLIZE_TAG}/htmlize.el"
64
62
  ).open.read
65
63
  File.write 'lib/htmlize.el', htmlize
66
64
  end
67
65
 
68
66
  file 'lib/ox-gmi.el' => 'lib' do
69
67
  ox_gmi = URI(
70
- 'https://git.umaneti.net/ox-gmi/plain/ox-gmi.el'
68
+ "https://git.umaneti.net/ox-gmi/plain/ox-gmi.el?h=#{OX_GMI_TAG}"
71
69
  ).open.read
72
70
  File.write 'lib/ox-gmi.el', ox_gmi
73
71
  end
@@ -76,10 +74,6 @@ namespace :org do
76
74
  Fronde::CONFIG.write_org_lisp_config
77
75
  end
78
76
 
79
- file '.dir-locals.el' => 'var/lib/org-config.el' do
80
- Fronde::Config::Helpers.write_dir_locals
81
- end
82
-
83
77
  file '.gitignore' do
84
78
  next if File.exist? '.gitignore'
85
79
 
@@ -91,9 +85,10 @@ namespace :org do
91
85
 
92
86
  desc 'Install Org'
93
87
  multitask install: ['org:compile', '.gitignore'] do
94
- # I need a fully installed org mode to correctly generate the lisp
95
- # config
96
- Rake::Task['.dir-locals.el'].invoke
88
+ # lib/htmlize.el and lib/ox-gmi.el cannot be generated in parallel
89
+ # of org:compilation, as it will leads to a weird SSL error. Thus
90
+ # finishing file generation "manually" here.
91
+ Rake::Task['var/lib/org-config.el'].invoke
97
92
  sources = Fronde::CONFIG.sources
98
93
  sources.each { mkdir_p _1['path'] }
99
94
 
data/lib/tasks/site.rake CHANGED
@@ -5,82 +5,104 @@ require_relative '../fronde/index'
5
5
  require_relative '../fronde/templater'
6
6
  require_relative '../fronde/cli/throbber'
7
7
 
8
+ def remove_orphan_file_maybe(file_path)
9
+ print I18n.t('fronde.tasks.site.remove_orphan_file')
10
+ action = $stdin.gets.strip.downcase
11
+ return unless action == 'y'
12
+
13
+ FileUtils.rm file_path
14
+ end
15
+
8
16
  namespace :site do
9
17
  desc 'Build all your projects'
10
18
  task :build, [:force?] => ['var/lib/org-config.el'] do |_, args|
11
19
  args.with_defaults(force?: false)
20
+
21
+ FileUtils.rm_f 'var/tmp/keywords'
12
22
  build_index = Thread.new do
13
- all_index = Fronde::Index.all_html_blog_index
23
+ all_index = Fronde::Index.all_blog_index
24
+ offset = 0
14
25
  all_index.each do |index|
15
- index.write_all_org(verbose: verbose)
26
+ index.write_all_org(verbose:)
27
+ offset = File.write('var/tmp/keywords', index.emacs_keywords, offset)
16
28
  end
17
29
  Thread.current[:all_indexes] = all_index
18
30
  end
19
- if verbose
20
- build_index.join
21
- else
22
- Fronde::CLI::Throbber.run(
23
- build_index, R18n.t.fronde.tasks.site.generating_indexes
24
- )
25
- end
31
+ Fronde::CLI::Throbber.run(
32
+ build_index, I18n.t('fronde.tasks.site.generating_indexes'), verbose
33
+ )
26
34
  all_indexes = build_index[:all_indexes]
27
35
 
28
- begin
29
- build_html = Thread.new do
30
- rm_r 'var/tmp/timestamps', force: true if args[:force?]
31
- Fronde::Emacs.new(verbose: verbose).publish
32
- end
33
- Fronde::CLI::Throbber.run(build_html, R18n.t.fronde.tasks.site.building)
34
-
35
- # :nocov:
36
- rescue RuntimeError
37
- warn R18n.t.fronde.tasks.site.aborting
38
- next
36
+ build_html = Thread.new do
37
+ Fronde::Emacs.new(verbose:).publish(force: args[:force?])
39
38
  end
40
- # :nocov:
41
-
39
+ Fronde::CLI::Throbber.run(
40
+ build_html, I18n.t('fronde.tasks.site.building'), verbose
41
+ )
42
42
  if all_indexes.any?
43
- if verbose
44
- all_indexes.each(&:write_all_feeds)
45
- else
46
- publish_feed = Thread.new do
47
- all_indexes.each do |index|
48
- index.write_all_feeds(verbose: false)
49
- end
43
+ publish_feed = Thread.new do
44
+ all_indexes.each do |index|
45
+ index.write_all_feeds(verbose: false)
50
46
  end
51
- Fronde::CLI::Throbber.run(
52
- publish_feed, R18n.t.fronde.tasks.site.publishing_feeds
53
- )
54
47
  end
48
+ Fronde::CLI::Throbber.run(
49
+ publish_feed, I18n.t('fronde.tasks.site.publishing_feeds'), verbose
50
+ )
55
51
  end
56
52
 
57
53
  next unless Fronde::CONFIG.sources.any? { |source| source.type == 'html' }
58
54
 
59
55
  customize_html = Thread.new do
60
56
  pubfolder = Fronde::CONFIG.get('html_public_folder')
61
- Dir["#{pubfolder}/**/*.html"].each do |f|
57
+ Dir.glob("#{pubfolder}/**/*.html").each do |f|
58
+ if verbose
59
+ short_file = f.sub(/^#{Dir.pwd}/, '.')
60
+ puts I18n.t('fronde.tasks.site.customizing_file', file: short_file)
61
+ end
62
62
  Fronde::Templater.customize_output(f)
63
63
  end
64
64
  end
65
65
  Fronde::CLI::Throbber.run(
66
- customize_html, R18n.t.fronde.tasks.site.customizing
66
+ customize_html, I18n.t('fronde.tasks.site.customizing'), verbose
67
67
  )
68
+ # :nocov:
69
+ rescue RuntimeError, Interrupt
70
+ warn I18n.t('fronde.tasks.site.aborting')
71
+ next
72
+ # :nocov:
73
+ end
74
+
75
+ desc 'Build a single file'
76
+ task :build_file, %i[path force?] do |_, args|
77
+ args.with_defaults(force?: false)
78
+ Fronde::Emacs.new(verbose: true).publish_file(
79
+ args[:path], force: args[:force?]
80
+ )
81
+ puts I18n.t('fronde.tasks.site.customizing_file', file: args[:path])
82
+ Fronde::Templater.customize_output(args[:path])
68
83
  end
69
84
 
70
85
  desc 'Cleanup orphaned published files'
71
86
  task :clean do
87
+ Fronde::Index.all_blog_index do |index|
88
+ project = index.project
89
+ all_tags = %w[index] + index.all_tags
90
+ Dir.glob("#{project['path']}/tags/*").each do |file_name|
91
+ slug = File.basename file_name, '.org'
92
+ next if all_tags.include?(slug)
93
+
94
+ short_file = file_name.sub(/^#{Dir.pwd}/, '.')
95
+ puts I18n.t('fronde.tasks.site.orphan_tag', file: short_file)
96
+ remove_orphan_file_maybe file_name
97
+ end
98
+ end
72
99
  pubfolder = Fronde::CONFIG.get('html_public_folder')
73
- Dir["#{pubfolder}/**/*.html"].each do |file_name|
100
+ Dir.glob("#{pubfolder}/**/*.html").each do |file_name|
74
101
  source = Fronde::Org::File.new(file_name)
75
-
76
102
  # Return if an org file has been found for this published file
77
103
  next unless source.file == file_name
78
104
 
79
- print R18n.t.fronde.tasks.site.remove_orphan_file
80
- action = $stdin.gets.strip.downcase
81
- next unless action == 'y'
82
-
83
- rm file_name
105
+ remove_orphan_file_maybe file_name
84
106
  end
85
107
  end
86
108
 
data/lib/tasks/sync.rake CHANGED
@@ -1,40 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../fronde/config'
4
+ require_relative '../fronde/sync'
4
5
  require_relative '../fronde/cli/throbber'
5
6
 
6
- module Fronde
7
- class SyncError < ::StandardError; end
8
- end
9
-
10
- def rsync_command(test = nil)
11
- rsync_command = Fronde::CONFIG.get('rsync')
12
- return rsync_command unless rsync_command.nil?
13
-
14
- optstring = []
15
- optstring << 'n' if test
16
- if verbose
17
- optstring << 'v'
18
- else
19
- optstring << 'q'
20
- end
21
- "rsync -#{optstring.join}rlt --delete"
22
- end
23
-
24
- def pull_or_push(direction, type, test)
25
- remote_path = Fronde::CONFIG.get("#{type}_remote")
26
- raise Fronde::SyncError, "No #{type} remote path set" if remote_path.nil?
27
-
28
- public_folder = Fronde::CONFIG.get("#{type}_public_folder")
29
- # Default is to push
30
- cmd = ["#{public_folder}/", remote_path]
31
- cmd.reverse! if direction == :pull
32
- rsync = rsync_command(test)
33
- Thread.new do
34
- sh "#{rsync} #{cmd.join(' ')}"
35
- end
36
- end
37
-
38
7
  def source_types
39
8
  Fronde::CONFIG.sources.map(&:type).uniq
40
9
  end
@@ -43,34 +12,34 @@ namespace :sync do
43
12
  desc 'Push changes to server'
44
13
  task :push, :test? do |_, args|
45
14
  source_types.each do |type|
46
- publish_thread = pull_or_push(:push, type, args[:test?])
47
- if verbose
48
- publish_thread.join
49
- else
50
- Fronde::CLI::Throbber.run(
51
- publish_thread, format('Publishing %<fmt>s:', fmt: type)
52
- )
53
- end
54
- rescue Fronde::SyncError => e
15
+ publish_thread = Fronde::Sync.pull_or_push(
16
+ :push, type, test: args[:test?], verbose: verbose
17
+ )
18
+ Fronde::CLI::Throbber.run(
19
+ publish_thread, format('Publishing %<fmt>s:', fmt: type), verbose
20
+ )
21
+ rescue Fronde::Sync::Error => e
55
22
  warn e
56
23
  next
57
24
  end
25
+ rescue RuntimeError, Interrupt
26
+ next
58
27
  end
59
28
 
60
29
  desc 'Pull changes from server'
61
30
  task :pull, :test? do |_, args|
62
31
  source_types.each do |type|
63
- pull_thread = pull_or_push(:pull, type, args[:test?])
64
- if verbose
65
- pull_thread.join
66
- else
67
- Fronde::CLI::Throbber.run(
68
- pull_thread, format('Pulling %<fmt>s:', fmt: type)
69
- )
70
- end
71
- rescue Fronde::SyncError => e
32
+ pull_thread = Fronde::Sync.pull_or_push(
33
+ :pull, type, test: args[:test?], verbose: verbose
34
+ )
35
+ Fronde::CLI::Throbber.run(
36
+ pull_thread, format('Pulling %<fmt>s:', fmt: type), verbose
37
+ )
38
+ rescue Fronde::Sync::Error => e
72
39
  warn e
73
40
  next
74
41
  end
42
+ rescue RuntimeError, Interrupt
43
+ next
75
44
  end
76
45
  end
data/lib/tasks/tags.rake CHANGED
@@ -5,7 +5,7 @@ require_relative '../fronde/index'
5
5
  namespace :tags do
6
6
  desc 'List all tags by name'
7
7
  task :name do
8
- Fronde::Index.all_html_blog_index do |index|
8
+ Fronde::Index.all_blog_index do |index|
9
9
  next if index.empty?
10
10
 
11
11
  puts index.sort_by(:name).join("\n")
@@ -14,7 +14,7 @@ namespace :tags do
14
14
 
15
15
  desc 'List all tags by weight'
16
16
  task :weight do
17
- Fronde::Index.all_html_blog_index do |index|
17
+ Fronde::Index.all_blog_index do |index|
18
18
  next if index.empty?
19
19
 
20
20
  puts index.sort_by(:weight).join("\n")