class DiscourseTheme::Watcher

Public Class Methods

new(dir:, uploader:) click to toggle source
# File lib/discourse_theme/watcher.rb, line 12
def initialize(dir:, uploader:)
  @dir = dir
  @uploader = uploader
end
return_immediately!() click to toggle source
# File lib/discourse_theme/watcher.rb, line 4
def self.return_immediately!
  @return_immediately = true
end
return_immediately?() click to toggle source
# File lib/discourse_theme/watcher.rb, line 8
def self.return_immediately?
  !!@return_immediately
end

Public Instance Methods

watch() click to toggle source
# File lib/discourse_theme/watcher.rb, line 17
def watch
  listener = Listen.to(@dir) do |modified, added, removed|
    begin
      if modified.length == 1 &&
          added.length == 0 &&
          removed.length == 0 &&
          (resolved = resolve_file(modified[0]))

        target, name, type_id = resolved
        UI.progress "Fast updating #{target}.scss"

        @uploader.upload_theme_field(
          target: target,
          name: name,
          value: File.read(modified[0]),
          type_id: type_id
        )
      else
        count = modified.length + added.length + removed.length
        if count > 1
          UI.progress "Detected changes in #{count} files, uploading theme"
        else
          filename = modified[0] || added[0] || removed[0]
          UI.progress "Detected changes in #{filename.gsub(@dir, '')}, uploading theme"
        end
        @uploader.upload_full_theme
      end
      UI.success "Done! Watching for changes..."
    rescue DiscourseTheme::ThemeError => e
      UI.error "#{e.message}"
      UI.progress "Watching for changes..."
    end
  end

  listener.start
  sleep unless self.class.return_immediately?
end

Protected Instance Methods

resolve_file(path) click to toggle source
# File lib/discourse_theme/watcher.rb, line 57
def resolve_file(path)
  dir_len = File.expand_path(@dir).length
  name = File.expand_path(path)[dir_len + 1..-1]

  target, file = name.split("/")

  if ["common", "desktop", "mobile"].include?(target)
    if file == "#{target}.scss"
      # a CSS file
      return [target, "scss", 1]
    end
  end

  nil
end