upstart-exporter 0.0.6 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rspec +2 -0
- data/Gemfile +9 -0
- data/README.md +1 -3
- data/bin/upstart-export +1 -1
- data/lib/upstart-exporter/errors.rb +11 -0
- data/lib/upstart-exporter/options/command_line.rb +43 -0
- data/lib/upstart-exporter/options/global.rb +35 -0
- data/lib/upstart-exporter/templates.rb +58 -0
- data/lib/upstart-exporter/version.rb +1 -1
- data/lib/upstart-exporter.rb +46 -128
- data/spec/lib/upstart-exporter/errors_spec.rb +24 -0
- data/spec/lib/upstart-exporter/options/command_line_spec.rb +61 -0
- data/spec/lib/upstart-exporter/options/global_spec.rb +52 -0
- data/spec/lib/upstart-exporter/templates_spec.rb +57 -0
- data/spec/lib/upstart-exporter_spec.rb +63 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/global_config.rb +6 -0
- data/spec/support/procfile.rb +5 -0
- data/spec/support/streams.rb +15 -0
- data/upstart-exporter.gemspec +0 -4
- metadata +30 -63
    
        data/.rspec
    ADDED
    
    
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -8,7 +8,7 @@ It is often neccessary to run some supporting background tasks for rails project | |
| 8 8 |  | 
| 9 9 | 
             
            This gem is an attempt to provide a safe way for installing backround jobs, so that they run under some fixed user without root priveleges.
         | 
| 10 10 |  | 
| 11 | 
            -
            The only interface to the gem is the script(*upstart-export*) it provides.
         | 
| 11 | 
            +
            The only interface to the gem that should be used is the script(*upstart-export*) it provides.
         | 
| 12 12 |  | 
| 13 13 | 
             
            Installing
         | 
| 14 14 | 
             
            ----------
         | 
| @@ -72,9 +72,7 @@ where _myapp_ is the application name. This name only affects the names of gener | |
| 72 72 |  | 
| 73 73 | 
             
            in /etc/init/:
         | 
| 74 74 |  | 
| 75 | 
            -
                fb-myapp-my_another_tail_cmd-real.conf
         | 
| 76 75 | 
             
                fb-myapp-my_another_tail_cmd.conf
         | 
| 77 | 
            -
                fb-myapp-my_tail_cmd-real.conf
         | 
| 78 76 | 
             
                fb-myapp-my_tail_cmd.conf
         | 
| 79 77 | 
             
                fb-myapp.conf
         | 
| 80 78 |  | 
    
        data/bin/upstart-export
    CHANGED
    
    
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            module Upstart::Exporter::Options
         | 
| 2 | 
            +
              class CommandLine < Hash
         | 
| 3 | 
            +
                include Upstart::Exporter::Errors
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                def initialize(command_line_args)
         | 
| 6 | 
            +
                  super
         | 
| 7 | 
            +
                  self[:commands] = if command_line_args[:clear]
         | 
| 8 | 
            +
                    {}
         | 
| 9 | 
            +
                  else
         | 
| 10 | 
            +
                    process_procfile(command_line_args[:procfile])
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                  self[:app_name] = process_appname(command_line_args[:app_name])
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def process_procfile(name)
         | 
| 16 | 
            +
                  error "#{name} is not a readable file" unless FileTest.file?(name)
         | 
| 17 | 
            +
                  commands = {}
         | 
| 18 | 
            +
                  content = File.read(name)
         | 
| 19 | 
            +
                  content.lines.each do |line|
         | 
| 20 | 
            +
                    line.chomp!
         | 
| 21 | 
            +
                    if line =~ /^(\w+?):(.*)$/
         | 
| 22 | 
            +
                      label = $1
         | 
| 23 | 
            +
                      command = $2
         | 
| 24 | 
            +
                      commands[label] = command
         | 
| 25 | 
            +
                    elsif line =~ /^\s*#/
         | 
| 26 | 
            +
                      # do nothing, comment
         | 
| 27 | 
            +
                    elsif line =~ /^\s*$/
         | 
| 28 | 
            +
                      # do nothing, empty
         | 
| 29 | 
            +
                    else
         | 
| 30 | 
            +
                      error "procfile lines should have the following format: 'some_label: command'"
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                  commands
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def process_appname(app_name)
         | 
| 37 | 
            +
                  error "Application name should contain only letters (and underscore) and be nonempty, so #{app_name.inspect} is not suitable" unless app_name =~ /^\w+$/ 
         | 
| 38 | 
            +
                  app_name
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
| 43 | 
            +
             | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            module Upstart::Exporter::Options
         | 
| 2 | 
            +
              class Global < Hash
         | 
| 3 | 
            +
                include Upstart::Exporter::Errors
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                DEFAULTS = {
         | 
| 6 | 
            +
                  'helper_dir' => '/var/local/upstart_helpers/',
         | 
| 7 | 
            +
                  'upstart_dir' => '/etc/init/',
         | 
| 8 | 
            +
                  'run_user' => 'service',
         | 
| 9 | 
            +
                  'prefix' => 'fb-'
         | 
| 10 | 
            +
                }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                CONF = '/etc/upstart-exporter.yaml'
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def initialize
         | 
| 15 | 
            +
                  super
         | 
| 16 | 
            +
                  config = if FileTest.file?(CONF)
         | 
| 17 | 
            +
                    YAML::load(File.read(CONF))
         | 
| 18 | 
            +
                  else
         | 
| 19 | 
            +
                    $stderr.puts "#{CONF} not found"
         | 
| 20 | 
            +
                    {}
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                  error "#{CONF} is not a valid YAML config" unless config.is_a?(Hash)
         | 
| 23 | 
            +
                  %w{helper_dir upstart_dir run_user prefix}.each do |param|
         | 
| 24 | 
            +
                    value = if config[param]
         | 
| 25 | 
            +
                      config[param]
         | 
| 26 | 
            +
                    else
         | 
| 27 | 
            +
                      $stderr.puts "Param #{param} is not set, taking default value #{DEFAULTS[param]}"
         | 
| 28 | 
            +
                      DEFAULTS[param]
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
                    self[param.to_sym] = value
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            module Upstart
         | 
| 2 | 
            +
              class Exporter
         | 
| 3 | 
            +
                class Templates
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                  def self.helper(binds)
         | 
| 6 | 
            +
                    interpolate(HELPER_TPL, binds)
         | 
| 7 | 
            +
                  end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def self.app(binds)
         | 
| 10 | 
            +
                    interpolate(APP_TPL, binds)
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def self.command(binds)
         | 
| 14 | 
            +
                    interpolate(COMMAND_TPL, binds)
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  protected
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  HELPER_TPL = <<-HEREDOC
         | 
| 20 | 
            +
            #!/bin/sh
         | 
| 21 | 
            +
            {{cmd}}
         | 
| 22 | 
            +
            HEREDOC
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  APP_TPL = <<-HEREDOC
         | 
| 25 | 
            +
            pre-start script
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            bash << "EOF"
         | 
| 28 | 
            +
              mkdir -p /var/log/{{app_name}}
         | 
| 29 | 
            +
              chown -R {{run_user}} /var/log/{{app_name}}
         | 
| 30 | 
            +
            EOF
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            end script
         | 
| 33 | 
            +
            HEREDOC
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  COMMAND_TPL = <<-HEREDOC
         | 
| 36 | 
            +
            start on starting {{app_name}}
         | 
| 37 | 
            +
            stop on stopping {{app_name}}
         | 
| 38 | 
            +
            respawn
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            script
         | 
| 41 | 
            +
              touch /var/log/{{app_name}}/{{cmd_name}}.log
         | 
| 42 | 
            +
              chown {{run_user}} /var/log/{{app_name}}/{{cmd_name}}.log
         | 
| 43 | 
            +
              exec sudo -u {{run_user}} /bin/sh {{helper_cmd_conf}} >> /var/log/{{app_name}}/{{cmd_name}}.log 2>&1
         | 
| 44 | 
            +
            end
         | 
| 45 | 
            +
            HEREDOC
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  def self.interpolate(str, substitutes)
         | 
| 48 | 
            +
                    str_copy = str.dup
         | 
| 49 | 
            +
                    substitutes.each do |k, v|
         | 
| 50 | 
            +
                      str_copy.gsub!("{{#{k}}}", v)
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                    str_copy
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
            end
         | 
| 58 | 
            +
                
         | 
    
        data/lib/upstart-exporter.rb
    CHANGED
    
    | @@ -1,179 +1,97 @@ | |
| 1 1 | 
             
            require "upstart-exporter/version"
         | 
| 2 | 
            +
            require "upstart-exporter/templates"
         | 
| 3 | 
            +
            require "upstart-exporter/errors"
         | 
| 4 | 
            +
            require "upstart-exporter/options/global"
         | 
| 5 | 
            +
            require "upstart-exporter/options/command_line"
         | 
| 2 6 |  | 
| 3 7 | 
             
            module Upstart
         | 
| 4 | 
            -
              class ExportError < RuntimeError; end
         | 
| 5 | 
            -
             | 
| 6 8 | 
             
              class Exporter
         | 
| 7 | 
            -
                 | 
| 8 | 
            -
                  'helper_dir' => '/var/local/upstart_helpers/',
         | 
| 9 | 
            -
                  'upstart_dir' => '/etc/init/',
         | 
| 10 | 
            -
                  'run_user' => 'service'
         | 
| 11 | 
            -
                }
         | 
| 12 | 
            -
                CONF = '/etc/upstart-exporter.yaml'
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                attr_accessor :helper_dir, :upstart_dir, :run_user
         | 
| 9 | 
            +
                include Errors
         | 
| 15 10 |  | 
| 16 | 
            -
                 | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
                   | 
| 20 | 
            -
                   | 
| 11 | 
            +
                attr_reader :options
         | 
| 12 | 
            +
              
         | 
| 13 | 
            +
                def initialize(command_line_args)
         | 
| 14 | 
            +
                  global_options = Options::Global.new
         | 
| 15 | 
            +
                  command_line_options = Options::CommandLine.new(command_line_args)
         | 
| 16 | 
            +
                  @options = global_options.merge(command_line_options)
         | 
| 17 | 
            +
                  ensure_dirs
         | 
| 21 18 | 
             
                end
         | 
| 22 19 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
                   | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
                    STDERR.puts "#{CONF} not found"
         | 
| 29 | 
            -
                    {}
         | 
| 30 | 
            -
                  end
         | 
| 31 | 
            -
                  %w{helper_dir upstart_dir run_user}.each do |param|
         | 
| 32 | 
            -
                    value = if config[param]
         | 
| 33 | 
            -
                      config[param]
         | 
| 34 | 
            -
                    else
         | 
| 35 | 
            -
                      STDERR.puts "Param #{param} is not set, taking default value #{DEFAULTS[param]}"
         | 
| 36 | 
            -
                      DEFAULTS[param]
         | 
| 37 | 
            -
                    end
         | 
| 38 | 
            -
                    self.send "#{param}=", value
         | 
| 20 | 
            +
                def export
         | 
| 21 | 
            +
                  clear
         | 
| 22 | 
            +
                  export_app
         | 
| 23 | 
            +
                  options[:commands].each do |cmd_name, cmd|
         | 
| 24 | 
            +
                    export_command(cmd_name, cmd)
         | 
| 39 25 | 
             
                  end
         | 
| 40 26 | 
             
                end
         | 
| 41 27 |  | 
| 42 | 
            -
                def  | 
| 43 | 
            -
                   | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
                    process_procfile(options[:procfile])
         | 
| 28 | 
            +
                def clear
         | 
| 29 | 
            +
                  FileUtils.rm(upstart_conf) if FileTest.file?(upstart_conf)
         | 
| 30 | 
            +
                  Dir[upstart_cmd_conf('*')].each do |f|
         | 
| 31 | 
            +
                    FileUtils.rm(f)
         | 
| 47 32 | 
             
                  end
         | 
| 48 | 
            -
                   | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
                def process_procfile(name)
         | 
| 52 | 
            -
                  error "#{name} is not a readable file" unless FileTest.file?(name)
         | 
| 53 | 
            -
                  commands = {}
         | 
| 54 | 
            -
                  content = File.read(name)
         | 
| 55 | 
            -
                  content.lines.each do |line|
         | 
| 56 | 
            -
                    line.chomp!
         | 
| 57 | 
            -
                    if line =~ /^(\w+?):(.*)$/
         | 
| 58 | 
            -
                      label = $1
         | 
| 59 | 
            -
                      command = $2
         | 
| 60 | 
            -
                      commands[label] = command
         | 
| 61 | 
            -
                    elsif line =~ /^\s*$/
         | 
| 62 | 
            -
                      # do nothing
         | 
| 63 | 
            -
                    else
         | 
| 64 | 
            -
                      error "procfile lines should have the following format: 'some_label: command'"
         | 
| 65 | 
            -
                    end
         | 
| 33 | 
            +
                  Dir[helper_cmd_conf('*')].each do |f|
         | 
| 34 | 
            +
                    FileUtils.rm(f)
         | 
| 66 35 | 
             
                  end
         | 
| 67 | 
            -
                  commands
         | 
| 68 36 | 
             
                end
         | 
| 69 37 |  | 
| 70 | 
            -
                 | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 38 | 
            +
                protected
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                def ensure_dirs
         | 
| 41 | 
            +
                  ensure_dir(options[:helper_dir])
         | 
| 42 | 
            +
                  ensure_dir(options[:upstart_dir])
         | 
| 73 43 | 
             
                end
         | 
| 74 44 |  | 
| 75 | 
            -
                def  | 
| 76 | 
            -
                   | 
| 77 | 
            -
                  error "Path #{dir} does not exist" unless FileTest.directory?(dir)
         | 
| 45 | 
            +
                def app_name
         | 
| 46 | 
            +
                  options[:prefix] + options[:app_name]
         | 
| 78 47 | 
             
                end
         | 
| 79 48 |  | 
| 80 | 
            -
                def  | 
| 81 | 
            -
                   | 
| 82 | 
            -
                   | 
| 83 | 
            -
             | 
| 84 | 
            -
                    export_command(cmd_name, cmd)
         | 
| 49 | 
            +
                def export_app
         | 
| 50 | 
            +
                  app_conf = Templates.app :app_name => app_name, :run_user => options[:run_user]
         | 
| 51 | 
            +
                  File.open(upstart_conf, 'w') do |f|
         | 
| 52 | 
            +
                    f.write(app_conf)
         | 
| 85 53 | 
             
                  end
         | 
| 86 54 | 
             
                end
         | 
| 87 55 |  | 
| 88 | 
            -
                 | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
                APP_TPL = <<-HEREDOC
         | 
| 94 | 
            -
            pre-start script
         | 
| 95 | 
            -
             | 
| 96 | 
            -
            bash << "EOF"
         | 
| 97 | 
            -
              mkdir -p /var/log/%s
         | 
| 98 | 
            -
              chown -R %s /var/log/%s
         | 
| 99 | 
            -
            EOF
         | 
| 100 | 
            -
             | 
| 101 | 
            -
            end script
         | 
| 102 | 
            -
            HEREDOC
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                COMMAND_TPL = <<-HEREDOC
         | 
| 105 | 
            -
            start on starting %s
         | 
| 106 | 
            -
            stop on stopping %s
         | 
| 107 | 
            -
            HEREDOC
         | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 110 | 
            -
                COMMAND_REAL_TPL = <<-HEREDOC
         | 
| 111 | 
            -
            start on starting %s
         | 
| 112 | 
            -
            stop on stopping %s
         | 
| 113 | 
            -
            respawn
         | 
| 114 | 
            -
             | 
| 115 | 
            -
            exec sudo -u %s /bin/sh %s >> /var/log/%s/%s.log 2>&1
         | 
| 116 | 
            -
            HEREDOC
         | 
| 56 | 
            +
                def ensure_dir(dir)
         | 
| 57 | 
            +
                  FileUtils.mkdir_p(dir) unless FileTest.directory?(dir)
         | 
| 58 | 
            +
                  error "Path #{dir} does not exist" unless FileTest.directory?(dir)
         | 
| 59 | 
            +
                end
         | 
| 117 60 |  | 
| 118 61 | 
             
                def upstart_conf
         | 
| 119 | 
            -
                  File.join( | 
| 62 | 
            +
                  File.join(options[:upstart_dir], "#{app_name}.conf")
         | 
| 120 63 | 
             
                end
         | 
| 121 64 |  | 
| 122 65 | 
             
                def app_cmd(cmd_name)
         | 
| 123 | 
            -
                  "#{ | 
| 66 | 
            +
                  "#{app_name}-#{cmd_name}"
         | 
| 124 67 | 
             
                end
         | 
| 125 68 |  | 
| 126 69 | 
             
                def upstart_cmd_conf(cmd_name)
         | 
| 127 | 
            -
                  File.join( | 
| 70 | 
            +
                  File.join(options[:upstart_dir], "#{app_cmd(cmd_name)}.conf")
         | 
| 128 71 | 
             
                end
         | 
| 129 72 |  | 
| 130 73 | 
             
                def helper_cmd_conf(cmd_name)
         | 
| 131 | 
            -
                  File.join( | 
| 132 | 
            -
                end
         | 
| 133 | 
            -
             | 
| 134 | 
            -
                def clear
         | 
| 135 | 
            -
                  FileUtils.rm(upstart_conf) if FileTest.file?(upstart_conf)
         | 
| 136 | 
            -
                  Dir[upstart_cmd_conf('*')].each do |f|
         | 
| 137 | 
            -
                    FileUtils.rm(f)
         | 
| 138 | 
            -
                  end
         | 
| 139 | 
            -
                  Dir[helper_cmd_conf('*')].each do |f|
         | 
| 140 | 
            -
                    FileUtils.rm(f)
         | 
| 141 | 
            -
                  end
         | 
| 142 | 
            -
                end
         | 
| 143 | 
            -
             | 
| 144 | 
            -
                def export_app
         | 
| 145 | 
            -
                  app_conf = APP_TPL % [@app_name, @run_user, @app_name]
         | 
| 146 | 
            -
                  File.open(upstart_conf, 'w') do |f|
         | 
| 147 | 
            -
                    f.write(app_conf)
         | 
| 148 | 
            -
                  end
         | 
| 74 | 
            +
                  File.join(options[:helper_dir], "#{app_cmd(cmd_name)}.sh")
         | 
| 149 75 | 
             
                end
         | 
| 150 76 |  | 
| 151 77 | 
             
                def export_cmd_helper(cmd_name, cmd)
         | 
| 152 | 
            -
                  helper_script_cont =  | 
| 78 | 
            +
                  helper_script_cont = Templates.helper :cmd => cmd
         | 
| 153 79 | 
             
                  File.open(helper_cmd_conf(cmd_name), 'w') do |f|
         | 
| 154 80 | 
             
                    f.write(helper_script_cont)
         | 
| 155 81 | 
             
                  end
         | 
| 156 82 | 
             
                end
         | 
| 157 83 |  | 
| 158 | 
            -
                def  | 
| 159 | 
            -
                  cmd_upstart_conf_content =  | 
| 84 | 
            +
                def export_cmd_upstart_conf(cmd_name)
         | 
| 85 | 
            +
                  cmd_upstart_conf_content = Templates.command :app_name => app_name, :run_user => options[:run_user], :cmd_name => cmd_name, :helper_cmd_conf => helper_cmd_conf(cmd_name)
         | 
| 160 86 | 
             
                  File.open(upstart_cmd_conf(cmd_name), 'w') do |f|
         | 
| 161 87 | 
             
                    f.write(cmd_upstart_conf_content)
         | 
| 162 88 | 
             
                  end
         | 
| 163 | 
            -
                  
         | 
| 164 | 
            -
                  cmd_upstart_conf_content_real = COMMAND_REAL_TPL % [app_cmd(cmd_name), app_cmd(cmd_name), @run_user, helper_cmd_conf(cmd_name), @app_name, cmd_name]
         | 
| 165 | 
            -
                  File.open(upstart_cmd_conf(cmd_name + '-real'), 'w') do |f|
         | 
| 166 | 
            -
                    f.write(cmd_upstart_conf_content_real)
         | 
| 167 | 
            -
                  end
         | 
| 168 89 | 
             
                end
         | 
| 169 90 |  | 
| 170 91 | 
             
                def export_command(cmd_name, cmd)
         | 
| 171 92 | 
             
                  export_cmd_helper(cmd_name, cmd)
         | 
| 172 | 
            -
                   | 
| 93 | 
            +
                  export_cmd_upstart_conf(cmd_name)
         | 
| 173 94 | 
             
                end
         | 
| 174 95 |  | 
| 175 | 
            -
                def error(msg)
         | 
| 176 | 
            -
                  raise Upstart::ExportError, msg 
         | 
| 177 | 
            -
                end
         | 
| 178 96 | 
             
              end
         | 
| 179 97 | 
             
            end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            require 'spec/spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Upstart::Exporter::Errors do
         | 
| 4 | 
            +
              context "when included" do
         | 
| 5 | 
            +
                it "should provide #error method" do
         | 
| 6 | 
            +
                  class Foo
         | 
| 7 | 
            +
                    include Upstart::Exporter::Errors
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  Foo.new.should respond_to(:error)
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              describe "#error" do
         | 
| 15 | 
            +
                it "should raise a correct exception" do
         | 
| 16 | 
            +
                  class Foo
         | 
| 17 | 
            +
                    include Upstart::Exporter::Errors
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  lambda{ Foo.new.error("arrgh") }.should raise_exception(Upstart::Exporter::Error)
         | 
| 21 | 
            +
                  
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,61 @@ | |
| 1 | 
            +
            require 'spec/spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Upstart::Exporter::Options::CommandLine do
         | 
| 4 | 
            +
              context "when correct options are given" do
         | 
| 5 | 
            +
                it "should give access to options like a hash" do
         | 
| 6 | 
            +
                    make_procfile('Procfile', 'ls_cmd: ls')
         | 
| 7 | 
            +
                    described_class.new(:app_name => 'someappname', :procfile => 'Procfile').should respond_to('[]')
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
                
         | 
| 10 | 
            +
                it "should parse procfile" do
         | 
| 11 | 
            +
                    make_procfile('Procfile', 'ls_cmd: ls')
         | 
| 12 | 
            +
                    options = described_class.new(:app_name => 'someappname', :procfile => 'Procfile')
         | 
| 13 | 
            +
                    options[:commands].should == {'ls_cmd' => ' ls'}
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
                
         | 
| 16 | 
            +
                it "should skip empty and commented lines in a procfile" do
         | 
| 17 | 
            +
                    make_procfile('Procfile', "ls_cmd1: ls1\n\nls_cmd2: ls2\n # fooo baaar")
         | 
| 18 | 
            +
                    options = described_class.new(:app_name => 'someappname', :procfile => 'Procfile')
         | 
| 19 | 
            +
                    options[:commands].should == {'ls_cmd1' => ' ls1', 'ls_cmd2' => ' ls2'}
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
                
         | 
| 22 | 
            +
                it "should store app_name" do
         | 
| 23 | 
            +
                    make_procfile('Procfile', "ls_cmd1: ls1\n\nls_cmd2: ls2\n # fooo baaar")
         | 
| 24 | 
            +
                    options = described_class.new(:app_name => 'someappname', :procfile => 'Procfile')
         | 
| 25 | 
            +
                    options[:app_name].should == 'someappname'
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
                
         | 
| 28 | 
            +
                it "should not process procfile if :clear arg is present" do
         | 
| 29 | 
            +
                    make_procfile('Procfile', "bad procfile")
         | 
| 30 | 
            +
                    options = described_class.new(:app_name => 'someappname', :procfile => 'Procfile', :clear => true)
         | 
| 31 | 
            +
                    options[:app_name].should == 'someappname'
         | 
| 32 | 
            +
                    options[:commands].should == {}
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              context "when bad app_name is passed" do
         | 
| 37 | 
            +
                it "should raise exception" do
         | 
| 38 | 
            +
                  make_procfile('Procfile', 'ls_cmd: ls')
         | 
| 39 | 
            +
                  lambda{ described_class.new(:app_name => 'some appname', :procfile => 'Procfile') }.should raise_exception
         | 
| 40 | 
            +
                  lambda{ described_class.new(:app_name => '-someappname', :procfile => 'Procfile') }.should raise_exception
         | 
| 41 | 
            +
                  lambda{ described_class.new(:procfile => 'Procfile') }.should raise_exception
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
              
         | 
| 45 | 
            +
              context "when bad Procfile is passed" do
         | 
| 46 | 
            +
                it "should raise exception" do
         | 
| 47 | 
            +
                  make_procfile('Procfile', 'ls cmd: ls')
         | 
| 48 | 
            +
                  lambda{ described_class.new(:app_name => 'someappname', :procfile => 'Procfile') }.should raise_exception
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  make_procfile('Procfile', '-lscmd: ls')
         | 
| 51 | 
            +
                  lambda{ described_class.new(:app_name => 'someappname', :procfile => 'Procfile') }.should raise_exception
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  lambda{ described_class.new(:app_name => 'someappname', :procfile => '::') }.should raise_exception
         | 
| 54 | 
            +
                  
         | 
| 55 | 
            +
                  lambda{ described_class.new(:app_name => 'someappname') }.should raise_exception
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
             | 
| 60 | 
            +
            end
         | 
| 61 | 
            +
             | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            require 'spec/spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Upstart::Exporter::Options::Global do
         | 
| 4 | 
            +
              let(:defaults){ Upstart::Exporter::Options::Global::DEFAULTS }
         | 
| 5 | 
            +
              let(:conf){ Upstart::Exporter::Options::Global::CONF }
         | 
| 6 | 
            +
              
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              it "should give access to options like a hash" do
         | 
| 9 | 
            +
                capture(:stderr) do
         | 
| 10 | 
            +
                  described_class.new.should respond_to('[]')
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              context "when no config present" do
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                it "should provide default options" do
         | 
| 17 | 
            +
                  capture(:stderr) do
         | 
| 18 | 
            +
                    options = described_class.new
         | 
| 19 | 
            +
                    defaults.each do |option, default_value|
         | 
| 20 | 
            +
                      options[option.to_sym].should == default_value
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              context "when invalid config is given" do
         | 
| 28 | 
            +
                it "should raise exception" do
         | 
| 29 | 
            +
                  make_global_config('zxc')
         | 
| 30 | 
            +
                  lambda{described_class.new}.should raise_exception
         | 
| 31 | 
            +
                  make_global_config([123].to_yaml)
         | 
| 32 | 
            +
                  lambda{described_class.new}.should raise_exception
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              context "when a valid config is given" do
         | 
| 37 | 
            +
                it "should override default values" do
         | 
| 38 | 
            +
                  capture(:stderr) do
         | 
| 39 | 
            +
                    make_global_config({'run_user' => 'wwwww'}.to_yaml)
         | 
| 40 | 
            +
                    described_class.new[:run_user].should == 'wwwww'
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                it "should preserve default values for options not specified in the config" do
         | 
| 45 | 
            +
                  capture(:stderr) do
         | 
| 46 | 
            +
                    make_global_config({'run_user' => 'wwwww'}.to_yaml)
         | 
| 47 | 
            +
                    described_class.new[:prefix] == defaults['prefix']
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            end
         | 
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            require 'spec/spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Upstart::Exporter::Templates do
         | 
| 4 | 
            +
              describe ".app" do
         | 
| 5 | 
            +
                it "should generate a valid app config" do
         | 
| 6 | 
            +
                  
         | 
| 7 | 
            +
                  conf = <<-HEREDOC
         | 
| 8 | 
            +
            pre-start script
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            bash << "EOF"
         | 
| 11 | 
            +
              mkdir -p /var/log/SOMEAPP
         | 
| 12 | 
            +
              chown -R SOMEUSER /var/log/SOMEAPP
         | 
| 13 | 
            +
            EOF
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            end script
         | 
| 16 | 
            +
            HEREDOC
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  described_class.app(:run_user => 'SOMEUSER', :app_name => 'SOMEAPP').should == conf
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              describe ".helper" do
         | 
| 23 | 
            +
                it "should generate a valid helper script" do
         | 
| 24 | 
            +
                  
         | 
| 25 | 
            +
                  conf = <<-HEREDOC
         | 
| 26 | 
            +
            #!/bin/sh
         | 
| 27 | 
            +
            SOME COMMAND
         | 
| 28 | 
            +
            HEREDOC
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  described_class.helper(:cmd => 'SOME COMMAND').should == conf
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
             | 
| 35 | 
            +
              describe ".helper" do
         | 
| 36 | 
            +
                it "should generate a valid upstart script for a single command" do
         | 
| 37 | 
            +
                  
         | 
| 38 | 
            +
                  conf = <<-HEREDOC
         | 
| 39 | 
            +
            start on starting SOMEAPP
         | 
| 40 | 
            +
            stop on stopping SOMEAPP
         | 
| 41 | 
            +
            respawn
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            script
         | 
| 44 | 
            +
              touch /var/log/SOMEAPP/SOMECMD.log
         | 
| 45 | 
            +
              chown SOMEUSER /var/log/SOMEAPP/SOMECMD.log
         | 
| 46 | 
            +
              exec sudo -u SOMEUSER /bin/sh HELPERPATH >> /var/log/SOMEAPP/SOMECMD.log 2>&1
         | 
| 47 | 
            +
            end
         | 
| 48 | 
            +
            HEREDOC
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  described_class.command(:run_user => 'SOMEUSER', :app_name => 'SOMEAPP', :cmd_name => 'SOMECMD', :helper_cmd_conf => 'HELPERPATH').should == conf
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
             | 
| 55 | 
            +
             | 
| 56 | 
            +
            end
         | 
| 57 | 
            +
             | 
| @@ -0,0 +1,63 @@ | |
| 1 | 
            +
            require 'spec/spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Upstart::Exporter do
         | 
| 4 | 
            +
              let(:tpl){ Upstart::Exporter::Templates }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              let(:exporter) do
         | 
| 7 | 
            +
                make_global_config({
         | 
| 8 | 
            +
                  'helper_dir' => '/h',
         | 
| 9 | 
            +
                  'upstart_dir' => '/u',
         | 
| 10 | 
            +
                  'run_user' => 'u',
         | 
| 11 | 
            +
                  'prefix' => 'p-'
         | 
| 12 | 
            +
                }.to_yaml)
         | 
| 13 | 
            +
                make_procfile('Procfile', 'ls_cmd: ls')
         | 
| 14 | 
            +
                exporter = described_class.new({:app_name => 'app', :procfile => 'Procfile'})
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              describe '#export' do
         | 
| 18 | 
            +
                it 'should make cleanup before export' do
         | 
| 19 | 
            +
                  exporter.should_receive(:clear)
         | 
| 20 | 
            +
                  exporter.export
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                it 'should create upstart scripts, folders and sh helpers' do
         | 
| 24 | 
            +
                  exporter.export
         | 
| 25 | 
            +
                  %w{/h/p-app-ls_cmd.sh /u/p-app.conf /u/p-app-ls_cmd.conf}.each do |f|
         | 
| 26 | 
            +
                    FileTest.file?(f).should be_true
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
                
         | 
| 30 | 
            +
                it 'created scripts, folders and sh helpers should have valid content' do
         | 
| 31 | 
            +
                  exporter.export
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  File.read('/h/p-app-ls_cmd.sh').should == tpl.helper(:cmd => ' ls')
         | 
| 34 | 
            +
                  File.read('/u/p-app.conf').should == tpl.app(:run_user => 'u', :app_name => 'p-app')
         | 
| 35 | 
            +
                  File.read('/u/p-app-ls_cmd.conf').should == tpl.command(:run_user => 'u', :app_name => 'p-app', :cmd_name => 'ls_cmd', :helper_cmd_conf => '/h/p-app-ls_cmd.sh')
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              describe '#clear' do
         | 
| 40 | 
            +
                it 'should remove exported app helpers an scripts' do
         | 
| 41 | 
            +
                  exporter.export
         | 
| 42 | 
            +
                  exporter.clear
         | 
| 43 | 
            +
                  Dir['/h/*'].should be_empty
         | 
| 44 | 
            +
                  Dir['/u/*'].should be_empty
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
                
         | 
| 47 | 
            +
                it 'should keep files of other apps' do
         | 
| 48 | 
            +
                  exporter.export
         | 
| 49 | 
            +
                  
         | 
| 50 | 
            +
                  make_procfile('Procfile1', 'ls_cmd: ls')
         | 
| 51 | 
            +
                  other_exporter = described_class.new({:app_name => 'other_app', :procfile => 'Procfile1'})
         | 
| 52 | 
            +
                  other_exporter.export
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  exporter.clear
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  %w{/h/p-other_app-ls_cmd.sh /u/p-other_app.conf /u/p-other_app-ls_cmd.conf}.each do |f|
         | 
| 57 | 
            +
                    FileTest.file?(f).should be_true
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            end
         | 
| 63 | 
            +
             | 
    
        data/spec/spec_helper.rb
    ADDED
    
    | @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require 'rubygems'
         | 
| 2 | 
            +
            require 'bundler/setup'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            Bundler.require(:default, :test, :development)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            require 'fakefs/spec_helpers'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            require 'upstart-exporter'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            Dir['spec/support/**/*.rb'].each do |f|
         | 
| 11 | 
            +
              require f
         | 
| 12 | 
            +
            end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            RSpec.configure do |config|
         | 
| 15 | 
            +
              config.include FakeFS::SpecHelpers
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            require 'stringio'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            def capture(*streams)
         | 
| 4 | 
            +
              streams.map! { |stream| stream.to_s }
         | 
| 5 | 
            +
              begin
         | 
| 6 | 
            +
                result = StringIO.new
         | 
| 7 | 
            +
                streams.each { |stream| eval "$#{stream} = result" }
         | 
| 8 | 
            +
                yield
         | 
| 9 | 
            +
              ensure
         | 
| 10 | 
            +
                streams.each { |stream| eval("$#{stream} = #{stream.upcase}") }
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
              result.string
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
             | 
    
        data/upstart-exporter.gemspec
    CHANGED
    
    | @@ -16,8 +16,4 @@ Gem::Specification.new do |s| | |
| 16 16 | 
             
              s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
         | 
| 17 17 | 
             
              s.require_paths = ["lib"]
         | 
| 18 18 |  | 
| 19 | 
            -
              s.add_development_dependency("rake")
         | 
| 20 | 
            -
              s.add_development_dependency("rspec")
         | 
| 21 | 
            -
              s.add_development_dependency("yard")
         | 
| 22 | 
            -
              s.add_development_dependency("redcarpet")
         | 
| 23 19 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: upstart-exporter
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              hash:  | 
| 4 | 
            +
              hash: 27
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 0
         | 
| 8 | 
            +
              - 1
         | 
| 8 9 | 
             
              - 0
         | 
| 9 | 
            -
               | 
| 10 | 
            -
              version: 0.0.6
         | 
| 10 | 
            +
              version: 0.1.0
         | 
| 11 11 | 
             
            platform: ruby
         | 
| 12 12 | 
             
            authors: 
         | 
| 13 13 | 
             
            - Ilya Averyanov
         | 
| @@ -15,64 +15,9 @@ autorequire: | |
| 15 15 | 
             
            bindir: bin
         | 
| 16 16 | 
             
            cert_chain: []
         | 
| 17 17 |  | 
| 18 | 
            -
            date: 2011-12- | 
| 19 | 
            -
            dependencies: 
         | 
| 20 | 
            -
             | 
| 21 | 
            -
              version_requirements: &id001 !ruby/object:Gem::Requirement 
         | 
| 22 | 
            -
                none: false
         | 
| 23 | 
            -
                requirements: 
         | 
| 24 | 
            -
                - - ">="
         | 
| 25 | 
            -
                  - !ruby/object:Gem::Version 
         | 
| 26 | 
            -
                    hash: 3
         | 
| 27 | 
            -
                    segments: 
         | 
| 28 | 
            -
                    - 0
         | 
| 29 | 
            -
                    version: "0"
         | 
| 30 | 
            -
              requirement: *id001
         | 
| 31 | 
            -
              type: :development
         | 
| 32 | 
            -
              prerelease: false
         | 
| 33 | 
            -
              name: rake
         | 
| 34 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 35 | 
            -
              version_requirements: &id002 !ruby/object:Gem::Requirement 
         | 
| 36 | 
            -
                none: false
         | 
| 37 | 
            -
                requirements: 
         | 
| 38 | 
            -
                - - ">="
         | 
| 39 | 
            -
                  - !ruby/object:Gem::Version 
         | 
| 40 | 
            -
                    hash: 3
         | 
| 41 | 
            -
                    segments: 
         | 
| 42 | 
            -
                    - 0
         | 
| 43 | 
            -
                    version: "0"
         | 
| 44 | 
            -
              requirement: *id002
         | 
| 45 | 
            -
              type: :development
         | 
| 46 | 
            -
              prerelease: false
         | 
| 47 | 
            -
              name: rspec
         | 
| 48 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 49 | 
            -
              version_requirements: &id003 !ruby/object:Gem::Requirement 
         | 
| 50 | 
            -
                none: false
         | 
| 51 | 
            -
                requirements: 
         | 
| 52 | 
            -
                - - ">="
         | 
| 53 | 
            -
                  - !ruby/object:Gem::Version 
         | 
| 54 | 
            -
                    hash: 3
         | 
| 55 | 
            -
                    segments: 
         | 
| 56 | 
            -
                    - 0
         | 
| 57 | 
            -
                    version: "0"
         | 
| 58 | 
            -
              requirement: *id003
         | 
| 59 | 
            -
              type: :development
         | 
| 60 | 
            -
              prerelease: false
         | 
| 61 | 
            -
              name: yard
         | 
| 62 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 63 | 
            -
              version_requirements: &id004 !ruby/object:Gem::Requirement 
         | 
| 64 | 
            -
                none: false
         | 
| 65 | 
            -
                requirements: 
         | 
| 66 | 
            -
                - - ">="
         | 
| 67 | 
            -
                  - !ruby/object:Gem::Version 
         | 
| 68 | 
            -
                    hash: 3
         | 
| 69 | 
            -
                    segments: 
         | 
| 70 | 
            -
                    - 0
         | 
| 71 | 
            -
                    version: "0"
         | 
| 72 | 
            -
              requirement: *id004
         | 
| 73 | 
            -
              type: :development
         | 
| 74 | 
            -
              prerelease: false
         | 
| 75 | 
            -
              name: redcarpet
         | 
| 18 | 
            +
            date: 2011-12-22 00:00:00 Z
         | 
| 19 | 
            +
            dependencies: []
         | 
| 20 | 
            +
             | 
| 76 21 | 
             
            description: Gem for converting Procfile-like files to upstart scripts
         | 
| 77 22 | 
             
            email: 
         | 
| 78 23 | 
             
            - ilya@averyanov.org
         | 
| @@ -85,6 +30,7 @@ extra_rdoc_files: [] | |
| 85 30 | 
             
            files: 
         | 
| 86 31 | 
             
            - .gitignore
         | 
| 87 32 | 
             
            - .rbenv-version
         | 
| 33 | 
            +
            - .rspec
         | 
| 88 34 | 
             
            - .yardoc/checksums
         | 
| 89 35 | 
             
            - .yardoc/objects/root.dat
         | 
| 90 36 | 
             
            - .yardoc/proxy_types
         | 
| @@ -110,7 +56,20 @@ files: | |
| 110 56 | 
             
            - doc/method_list.html
         | 
| 111 57 | 
             
            - doc/top-level-namespace.html
         | 
| 112 58 | 
             
            - lib/upstart-exporter.rb
         | 
| 59 | 
            +
            - lib/upstart-exporter/errors.rb
         | 
| 60 | 
            +
            - lib/upstart-exporter/options/command_line.rb
         | 
| 61 | 
            +
            - lib/upstart-exporter/options/global.rb
         | 
| 62 | 
            +
            - lib/upstart-exporter/templates.rb
         | 
| 113 63 | 
             
            - lib/upstart-exporter/version.rb
         | 
| 64 | 
            +
            - spec/lib/upstart-exporter/errors_spec.rb
         | 
| 65 | 
            +
            - spec/lib/upstart-exporter/options/command_line_spec.rb
         | 
| 66 | 
            +
            - spec/lib/upstart-exporter/options/global_spec.rb
         | 
| 67 | 
            +
            - spec/lib/upstart-exporter/templates_spec.rb
         | 
| 68 | 
            +
            - spec/lib/upstart-exporter_spec.rb
         | 
| 69 | 
            +
            - spec/spec_helper.rb
         | 
| 70 | 
            +
            - spec/support/global_config.rb
         | 
| 71 | 
            +
            - spec/support/procfile.rb
         | 
| 72 | 
            +
            - spec/support/streams.rb
         | 
| 114 73 | 
             
            - upstart-exporter.gemspec
         | 
| 115 74 | 
             
            homepage: ""
         | 
| 116 75 | 
             
            licenses: []
         | 
| @@ -145,6 +104,14 @@ rubygems_version: 1.8.10 | |
| 145 104 | 
             
            signing_key: 
         | 
| 146 105 | 
             
            specification_version: 3
         | 
| 147 106 | 
             
            summary: Gem for converting Procfile-like files to upstart scripts
         | 
| 148 | 
            -
            test_files:  | 
| 149 | 
            -
             | 
| 107 | 
            +
            test_files: 
         | 
| 108 | 
            +
            - spec/lib/upstart-exporter/errors_spec.rb
         | 
| 109 | 
            +
            - spec/lib/upstart-exporter/options/command_line_spec.rb
         | 
| 110 | 
            +
            - spec/lib/upstart-exporter/options/global_spec.rb
         | 
| 111 | 
            +
            - spec/lib/upstart-exporter/templates_spec.rb
         | 
| 112 | 
            +
            - spec/lib/upstart-exporter_spec.rb
         | 
| 113 | 
            +
            - spec/spec_helper.rb
         | 
| 114 | 
            +
            - spec/support/global_config.rb
         | 
| 115 | 
            +
            - spec/support/procfile.rb
         | 
| 116 | 
            +
            - spec/support/streams.rb
         | 
| 150 117 | 
             
            has_rdoc: 
         |