Sha256: 63f8ba7219af71abc983f4f6152d7ab51e75d64883944979ff676334847dad5b

Contents?: true

Size: 1.95 KB

Versions: 5

Compression:

Stored size: 1.95 KB

Contents

# frozen_string_literal: true
module DiscourseTheme
  class Watcher
    def self.return_immediately!
      @return_immediately = true
    end

    def self.return_immediately?
      !!@return_immediately
    end

    def initialize(dir:, uploader:)
      @dir = dir
      @uploader = uploader
    end

    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(skip_migrations: true)
            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 if !self.class.return_immediately?
    end

    protected

    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 %w[common desktop mobile].include?(target)
        if file == "#{target}.scss"
          # a CSS file
          return target, "scss", 1
        end
      end

      nil
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
discourse_theme-2.1.3 lib/discourse_theme/watcher.rb
discourse_theme-2.1.2 lib/discourse_theme/watcher.rb
discourse_theme-2.1.1 lib/discourse_theme/watcher.rb
discourse_theme-2.1.0 lib/discourse_theme/watcher.rb
discourse_theme-2.0.0 lib/discourse_theme/watcher.rb