Class: SublimeDSL::SublimeText::Package::Exporter

Inherits:
Object
  • Object
show all
Defined in:
lib/sublime_dsl/sublime_text/package/exporter.rb

Overview

An export operation with its options.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(package = nil) ⇒ Exporter

Returns a new instance of Exporter.



15
16
17
18
19
20
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 15

def initialize(package = nil)
  @package = package
  @root = SublimeText.packages_dir
  @backup = :always
  @cleanup = false
end

Instance Attribute Details

#backupObject

Returns the value of attribute backup.



13
14
15
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 13

def backup
  @backup
end

#cleanupObject

Returns the value of attribute cleanup.



13
14
15
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 13

def cleanup
  @cleanup
end

#packageObject (readonly)

Returns the value of attribute package.



12
13
14
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 12

def package
  @package
end

#rootObject

Returns the value of attribute root.



13
14
15
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 13

def root
  @root
end

Instance Method Details

#copy_file(infile, outdir) ⇒ Object



122
123
124
125
126
127
128
129
130
131
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 122

def copy_file(infile, outdir)
  if File.directory?(infile)
    outpath = "#{outdir}/#{File.basename(infile)}"
    Dir.mkdir outpath unless File.directory?(outpath)
    Dir["#{infile}/*"].each { |f| copy_file f, outpath }
  else
    # Console.progress ...
    FileUtils.cp infile, outdir
  end
end

#copy_package(from, to) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 79

def copy_package(from, to)

  # remember the files originally there
  if File.directory?(to)
    old_files = Dir["#{to}/**/*"]
  else
    Dir.mkdir to
    old_files = []
  end

  # copy from the temporary directory
  new_files = []
  Dir["#{from}/**/*"].each do |fromfile|
    tofile = fromfile.dup
    tofile[from] = to
    new_files << tofile
    if File.directory?(fromfile)
      Dir.mkdir tofile unless File.directory?(tofile)
    else
      FileUtils.cp fromfile, tofile
    end
  end

  return unless cleanup

  # on Windows, do not delete files that had just case changes
  if Tools.os == :Windows
    old_files = old_files.map(&:downcase)
    new_files = new_files.map(&:downcase)
  end

  # delete files/directories that disappeared
  (old_files - new_files).each do |f|
    next unless File.exist?(f)  # removing directories also remove files
    if File.directory?(f)
      FileUtils.rm_r [f]
    else
      FileUtils.rm f
    end
  end

end

#dirObject



34
35
36
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 34

def dir
  "#{root}/#{@package.name}"
end

#export(package = nil) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 22

def export(package = nil)
  @package = package if package
  validate
  perform_backup
  Console.info "exporting package to #{dir}"
  Dir.mktmpdir('sublime_dsl_') do |tmpdir|
    tmpdir = tmpdir.encode('utf-8') # for ruby 2.0
    export_package tmpdir
    copy_package tmpdir, dir
  end
end

#export_package(dir) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 64

def export_package(dir)
  p = package
  p.themes.each { |t| t.export dir }
  p.grammars.each { |g| g.export dir }
  p.preferences.each { |pr| pr.export dir }
  p.snippets.each { |s| s.export dir }
  p.setting_sets.each { |s| s.export dir }
  p.macros.each { |m| m.export dir }
  p.command_sets.each { |c| c.export dir }
  p.menus.each { |m| m.export dir }
  p.mousemaps.each { |m| m.export dir }
  p.keymaps.each { |k| k.export dir }
  p.other_files.each { |f| copy_file f, dir }
end

#keyboard=(name) ⇒ Object



38
39
40
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 38

def keyboard=(name)
  @keyboard_name = name
end

#perform_backupObject



51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 51

def perform_backup
  # no backup needed if not asked or no file to backup
  return unless backup != :never && Dir["#{dir}/*"].length > 0
  # don't do it if only one backup is requested, and there is already one
  name = Tools.filename(package.name)
  return if backup == :once && Dir["#{root}/#{name}.*.zip"].length > 0
  # backup
  time_stamp = Tools.filename(Time.now.strftime("%Y-%m-%d %H:%M:%S"))
  backup_file = "#{root}/#{name}.#{time_stamp}.zip"
  Tools.zip dir, backup_file
  Console.info "#{dir} backed up as #{backup_file}"
end

#validateObject



42
43
44
45
46
47
48
49
# File 'lib/sublime_dsl/sublime_text/package/exporter.rb', line 42

def validate
  File.directory?(root) or raise OptionError, "no such directory: #{root}"
  @backup = backup.to_sym
  unless [:never, :always, :once].include?(backup)
    warn "invalid backup option #{backup.inspect}, 'always' assumed"
    @backup = :always
  end
end