Class: SublimeDSL::SublimeText::Package::Writer

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

Overview

A DSL writing operation with its options.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(package = nil) ⇒ Writer

Returns a new instance of Writer.



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

def initialize(package = nil)
  @package = package
  @root = '.'
  @backup = :once
  @copy_other_files = true
  @keyboard_name = nil
end

Instance Attribute Details

#backupObject

Returns the value of attribute backup.



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

def backup
  @backup
end

#copy_other_filesObject

Returns the value of attribute copy_other_files.



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

def copy_other_files
  @copy_other_files
end

#packageObject (readonly)

Returns the value of attribute package.



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

def package
  @package
end

#rootObject

Returns the value of attribute root.



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

def root
  @root
end

Instance Method Details

#copy_file(infile, outdir) ⇒ Object



89
90
91
92
93
94
95
96
97
98
# File 'lib/sublime_dsl/sublime_text/package/writer.rb', line 89

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

#dirObject



32
33
34
# File 'lib/sublime_dsl/sublime_text/package/writer.rb', line 32

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

#keyboardObject



40
41
42
43
44
45
46
47
# File 'lib/sublime_dsl/sublime_text/package/writer.rb', line 40

def keyboard
  @keyboard ||=
    if @keyboard_name.nil? || @keyboard_name == Keyboard.sublime.name
      Keyboard.sublime
    else
      Keyboard.get(@keyboard_name, root)
    end
end

#keyboard=(name) ⇒ Object



36
37
38
# File 'lib/sublime_dsl/sublime_text/package/writer.rb', line 36

def keyboard=(name)
  @keyboard_name = name
end

#perform_backupObject



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/sublime_dsl/sublime_text/package/writer.rb', line 59

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



49
50
51
52
53
54
55
56
57
# File 'lib/sublime_dsl/sublime_text/package/writer.rb', line 49

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
  keyboard
end

#write(package = nil) ⇒ Object



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

def write(package = nil)
  @package = package if package
  validate
  perform_backup
  FileUtils.rm_r Dir["#{dir}/*"] if File.directory?(dir)
  Console.info "writing package DSL to #{dir}"
  write_package
end

#write_all(collection, file) ⇒ Object



100
101
102
103
104
105
106
# File 'lib/sublime_dsl/sublime_text/package/writer.rb', line 100

def write_all(collection, file)
  return if collection.empty?
  File.open(file, 'wb:utf-8') do |f|
    f.puts '# encoding: utf-8'
    collection.each { |e| f.puts "\n#{e.to_dsl}" }
  end
end

#write_packageObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/sublime_dsl/sublime_text/package/writer.rb', line 72

def write_package
  Dir.mkdir dir unless File.directory?(dir)
  p = package
  p.themes.each { |t| t.write dir }
  p.grammars.each { |g| g.write dir }
  write_all p.preferences, "#{dir}/preferences.rb"
  TextMate::Snippet::DSLWriter.new(p.snippets).write "#{dir}/snippets.rb"
  write_all p.setting_sets, "#{dir}/settings.rb"
  write_all p.macros.sort_by(&:name), "#{dir}/macros.rb"
  write_all p.command_sets, "#{dir}/commands.rb"
  p.menus.each { |m| m.write dir }
  p.mousemaps.each { |m| m.write dir }
  p.keymaps.each { |k| k.for_keyboard(keyboard).write dir }
  return unless copy_other_files
  p.other_files.each { |f| copy_file f, dir }
end