Class: DiscourseTheme::Uploader

Inherits:
Object
  • Object
show all
Defined in:
lib/discourse_theme/uploader.rb

Instance Method Summary collapse

Constructor Details

#initialize(dir:, client:, theme_id: nil, components: nil) ⇒ Uploader

Returns a new instance of Uploader.



4
5
6
7
8
9
# File 'lib/discourse_theme/uploader.rb', line 4

def initialize(dir:, client:, theme_id: nil, components: nil)
  @dir = dir
  @client = client
  @theme_id = theme_id
  @components = components
end

Instance Method Details

#compress_dir(gzip, dir) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/discourse_theme/uploader.rb', line 11

def compress_dir(gzip, dir)
  sgz = Zlib::GzipWriter.new(File.open(gzip, "wb"))
  tar = Archive::Tar::Minitar::Output.new(sgz)

  Dir.chdir(dir + "/../") do
    Find.find(File.basename(dir)) do |x|
      bn = File.basename(x)
      Find.prune if bn == "node_modules" || bn == "src" || bn[0] == "."
      next if File.directory?(x)

      Minitar.pack_file(x, tar)
    end
  end
ensure
  tar.close
  sgz.close
end

#diagnose_errors(json) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/discourse_theme/uploader.rb', line 29

def diagnose_errors(json)
  count = 0
  json["theme"]["theme_fields"].each do |row|
    if (error = row["error"]) && error.length > 0
      count += 1
      UI.error ""
      UI.error "Error in #{row["target"]} #{row["name"]}: #{row["error"]}"
      UI.error ""
    end
  end
  count
end

#upload_full_theme(skip_migrations: false) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/discourse_theme/uploader.rb', line 56

def upload_full_theme(skip_migrations: false)
  filename = "#{Pathname.new(Dir.tmpdir).realpath}/bundle_#{SecureRandom.hex}.tar.gz"

  compress_dir(filename, @dir)

  File.open(filename) do |tgz|
    response =
      @client.upload_full_theme(
        tgz,
        theme_id: @theme_id,
        components: @components,
        skip_migrations: skip_migrations,
      )

    json = JSON.parse(response.body)
    @theme_id = json["theme"]["id"]
    UI.error "(end of errors)" if diagnose_errors(json) != 0
    @theme_id
  end
ensure
  FileUtils.rm_f(filename)
end

#upload_theme_field(target:, name:, type_id:, value:) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/discourse_theme/uploader.rb', line 42

def upload_theme_field(target:, name:, type_id:, value:)
  raise "expecting theme_id to be set!" unless @theme_id

  args = {
    theme: {
      theme_fields: [{ name: name, target: target, type_id: type_id, value: value }],
    },
  }

  response = @client.update_theme(@theme_id, args)
  json = JSON.parse(response.body)
  UI.error "(end of errors)" if diagnose_errors(json) != 0
end