Module: Jekyll::ClientSearch::Tasks

Defined in:
lib/jekyll/client_search/tasks.rb

Overview

Rake tasks for inspecting and installing reference files.

Tasks:

jekyll_client_search:reference_files — list gem reference files,
diff against site copies, offer to update
jekyll_client_search:install — copy reference files into the site's
_layouts/ and _includes/ directories

Constant Summary collapse

REFERENCE_FILES =
{
  "assets/layouts/post-with-related.html" => "_layouts/post-with-related.html",
  "assets/includes/related-articles.html" => "_includes/related-articles.html"
}.freeze

Class Method Summary collapse

Class Method Details

.copy_file(gem_path, site_path, site_rel, overwrite) ⇒ Object



121
122
123
124
125
126
127
# File 'lib/jekyll/client_search/tasks.rb', line 121

def copy_file(gem_path, site_path, site_rel, overwrite)
  FileUtils.mkdir_p(File.dirname(site_path))
  FileUtils.cp(gem_path, site_path)
  action = overwrite ? "updated" : "installed"
  puts "  #{site_rel}: #{action}"
  :installed
end

.diff_reference_filesObject



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/jekyll/client_search/tasks.rb', line 62

def diff_reference_files
  reference_files.each do |gem_rel, site_rel|
    gem_path = File.join(gem_root, gem_rel)
    site_path = File.join(site_root, site_rel)

    unless File.exist?(site_path)
      puts "#{site_rel}: not installed (no diff)"
      next
    end

    if same_content?(gem_path, site_path)
      puts "#{site_rel}: up to date"
    else
      puts "Diff for #{site_rel}:"
      system("diff", "-u", site_path, gem_path)
      puts
    end
  end
end

.gem_rootObject



22
23
24
25
26
27
28
# File 'lib/jekyll/client_search/tasks.rb', line 22

def gem_root
  spec = Gem::Specification.find_by_name("jekyll-client-search")
  spec.gem_dir
rescue Gem::MissingSpecError
  # Fall back to the development source directory
  File.expand_path("../../..", __dir__)
end

.handle_existing(site_rel, gem_path, site_path) ⇒ Object



111
112
113
114
115
116
117
118
119
# File 'lib/jekyll/client_search/tasks.rb', line 111

def handle_existing(site_rel, gem_path, site_path)
  if same_content?(gem_path, site_path)
    puts "  #{site_rel}: already up to date (skip)"
    nil
  else
    puts "  #{site_rel}: exists and differs (skip — use overwrite: true to replace)"
    :skipped
  end
end

.install_file(gem_rel, site_rel, overwrite:) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/jekyll/client_search/tasks.rb', line 97

def install_file(gem_rel, site_rel, overwrite:)
  gem_path = File.join(gem_root, gem_rel)
  site_path = File.join(site_root, site_rel)

  unless File.exist?(gem_path)
    warn "  WARNING: gem file missing: #{gem_path}"
    return nil
  end

  return handle_existing(site_rel, gem_path, site_path) if File.exist?(site_path) && !overwrite

  copy_file(gem_path, site_path, site_rel, overwrite)
end

.install_reference_files(overwrite: false) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/jekyll/client_search/tasks.rb', line 82

def install_reference_files(overwrite: false)
  installed = []
  skipped = []

  reference_files.each do |gem_rel, site_rel|
    result = install_file(gem_rel, site_rel, overwrite: overwrite)
    case result
    when :installed then installed << site_rel
    when :skipped then skipped << site_rel
    end
  end

  { installed: installed, skipped: skipped }
end

.list_reference_filesObject



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/jekyll/client_search/tasks.rb', line 38

def list_reference_files
  puts "jekyll-client-search reference files:"
  puts
  reference_files.each do |gem_rel, site_rel|
    gem_path = File.join(gem_root, gem_rel)
    site_path = File.join(site_root, site_rel)
    site_exists = File.exist?(site_path)

    status = if !site_exists
               "not installed"
             elsif same_content?(gem_path, site_path)
               "up to date"
             else
               "modified or outdated"
             end

    puts "  #{site_rel}"
    puts "    gem:     #{gem_path}"
    puts "    site:    #{site_path}"
    puts "    status:  #{status}"
    puts
  end
end

.reference_filesObject



30
31
32
# File 'lib/jekyll/client_search/tasks.rb', line 30

def reference_files
  REFERENCE_FILES
end

.same_content?(path_a, path_b) ⇒ Boolean

Returns:

  • (Boolean)


129
130
131
132
133
# File 'lib/jekyll/client_search/tasks.rb', line 129

def same_content?(path_a, path_b)
  File.read(path_a) == File.read(path_b)
rescue Errno::ENOENT
  false
end

.site_rootObject



34
35
36
# File 'lib/jekyll/client_search/tasks.rb', line 34

def site_root
  Dir.pwd
end