nimbu 0.4 → 0.5.1
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/lib/nimbu.rb +3 -19
- data/lib/nimbu/auth.rb +106 -95
- data/lib/nimbu/cli.rb +20 -3
- data/lib/nimbu/command.rb +138 -68
- data/lib/nimbu/command/auth.rb +21 -3
- data/lib/nimbu/command/base.rb +38 -75
- data/lib/nimbu/command/browse.rb +63 -0
- data/lib/nimbu/command/help.rb +1 -1
- data/lib/nimbu/command/helpers.rb +6 -4
- data/lib/nimbu/command/init.rb +5 -6
- data/lib/nimbu/command/server.rb +119 -55
- data/lib/nimbu/command/sites.rb +32 -0
- data/lib/nimbu/command/themes.rb +29 -52
- data/lib/nimbu/helpers.rb +268 -89
- data/lib/nimbu/server/base.rb +56 -41
- data/lib/nimbu/ssh.rb +54 -0
- data/lib/nimbu/version.rb +1 -1
- metadata +128 -42
- data/lib/nimbu/client.rb +0 -289
- data/lib/nimbu/client/rendezvous.rb +0 -76
- data/lib/nimbu/server/views/index.haml +0 -1
    
        data/lib/nimbu/command/auth.rb
    CHANGED
    
    | @@ -4,13 +4,31 @@ require "nimbu/command/base" | |
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            class Nimbu::Command::Auth < Nimbu::Command::Base
         | 
| 6 6 |  | 
| 7 | 
            +
              # auth
         | 
| 8 | 
            +
              #
         | 
| 9 | 
            +
              # Authenticate, display token and current user
         | 
| 10 | 
            +
              def index
         | 
| 11 | 
            +
                Nimbu::Command::Help.new.send(:help_for_command, current_command)
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 7 14 | 
             
              # auth:login
         | 
| 8 15 | 
             
              #
         | 
| 9 16 | 
             
              # log in with your nimbu credentials
         | 
| 10 17 | 
             
              #
         | 
| 18 | 
            +
              #Example:
         | 
| 19 | 
            +
              #
         | 
| 20 | 
            +
              # $ nimbu auth:login
         | 
| 21 | 
            +
              #
         | 
| 22 | 
            +
              # Please enter your Nimbu credentials:
         | 
| 23 | 
            +
              #
         | 
| 24 | 
            +
              # Login: email@example.com (or your Nimbu username)
         | 
| 25 | 
            +
              # Password (typing will be hidden)
         | 
| 26 | 
            +
              #
         | 
| 27 | 
            +
              # Authentication successful.
         | 
| 28 | 
            +
              #
         | 
| 11 29 | 
             
              def login
         | 
| 12 30 | 
             
                Nimbu::Auth.login
         | 
| 13 | 
            -
                display "Authentication successful."
         | 
| 31 | 
            +
                display " => Authentication successful."
         | 
| 14 32 | 
             
              end
         | 
| 15 33 |  | 
| 16 34 | 
             
              alias_command "login", "auth:login"
         | 
| @@ -21,7 +39,7 @@ class Nimbu::Command::Auth < Nimbu::Command::Base | |
| 21 39 | 
             
              #
         | 
| 22 40 | 
             
              def logout
         | 
| 23 41 | 
             
                Nimbu::Auth.logout
         | 
| 24 | 
            -
                display "Local credentials cleared."
         | 
| 42 | 
            +
                display "=> Local credentials cleared."
         | 
| 25 43 | 
             
              end
         | 
| 26 44 |  | 
| 27 45 | 
             
              alias_command "logout", "auth:logout"
         | 
| @@ -31,7 +49,7 @@ class Nimbu::Command::Auth < Nimbu::Command::Base | |
| 31 49 | 
             
              # display your api token
         | 
| 32 50 | 
             
              #
         | 
| 33 51 | 
             
              def token
         | 
| 34 | 
            -
                display Nimbu::Auth. | 
| 52 | 
            +
                display "=> Your personal API token is: #{Nimbu::Auth.token}"
         | 
| 35 53 | 
             
              end
         | 
| 36 54 |  | 
| 37 55 | 
             
            end
         | 
    
        data/lib/nimbu/command/base.rb
    CHANGED
    
    | @@ -1,6 +1,5 @@ | |
| 1 1 | 
             
            require "fileutils"
         | 
| 2 2 | 
             
            require "nimbu/auth"
         | 
| 3 | 
            -
            require "nimbu/client/rendezvous"
         | 
| 4 3 | 
             
            require "nimbu/command"
         | 
| 5 4 |  | 
| 6 5 | 
             
            class Nimbu::Command::Base
         | 
| @@ -16,28 +15,8 @@ class Nimbu::Command::Base | |
| 16 15 | 
             
              def initialize(args=[], options={})
         | 
| 17 16 | 
             
                @args = args
         | 
| 18 17 | 
             
                @options = options
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                Nimbu.debug = args.include?("--debug")
         | 
| 21 | 
            -
                Nimbu.development = args.include?("--development") || args.include?("--dev")
         | 
| 22 | 
            -
                Nimbu.v2 = args.include?("--v2")
         | 
| 23 | 
            -
              end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
              def app
         | 
| 26 | 
            -
                @app ||= if options[:app].is_a?(String)
         | 
| 27 | 
            -
                  if confirm_mismatch?
         | 
| 28 | 
            -
                    raise Nimbu::Command::CommandFailed, "Mismatch between --app and --confirm"
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
                  options[:app]
         | 
| 31 | 
            -
                elsif options[:confirm].is_a?(String)
         | 
| 32 | 
            -
                  options[:confirm]
         | 
| 33 | 
            -
                elsif app_from_dir = extract_app_in_dir(Dir.pwd)
         | 
| 34 | 
            -
                  app_from_dir
         | 
| 35 | 
            -
                else
         | 
| 36 | 
            -
                  raise Nimbu::Command::CommandFailed, "No app specified.\nRun this command from an app folder or specify which app to use with --app <app name>"
         | 
| 37 | 
            -
                end
         | 
| 38 18 | 
             
              end
         | 
| 39 19 |  | 
| 40 | 
            -
             | 
| 41 20 | 
             
              def nimbu
         | 
| 42 21 | 
             
                Nimbu::Auth.client
         | 
| 43 22 | 
             
              end
         | 
| @@ -45,14 +24,14 @@ class Nimbu::Command::Base | |
| 45 24 | 
             
            protected
         | 
| 46 25 |  | 
| 47 26 | 
             
              def self.inherited(klass)
         | 
| 48 | 
            -
                 | 
| 27 | 
            +
                unless klass == Nimbu::Command::Base
         | 
| 28 | 
            +
                  help = extract_help_from_caller(caller.first)
         | 
| 49 29 |  | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
                   | 
| 54 | 
            -
             | 
| 55 | 
            -
                )
         | 
| 30 | 
            +
                  Nimbu::Command.register_namespace(
         | 
| 31 | 
            +
                    :name => klass.namespace,
         | 
| 32 | 
            +
                    :description => help.first
         | 
| 33 | 
            +
                  )
         | 
| 34 | 
            +
                end
         | 
| 56 35 | 
             
              end
         | 
| 57 36 |  | 
| 58 37 | 
             
              def self.method_added(method)
         | 
| @@ -64,20 +43,17 @@ protected | |
| 64 43 | 
             
                resolved_method = (method.to_s == "index") ? nil : method.to_s
         | 
| 65 44 | 
             
                command = [ self.namespace, resolved_method ].compact.join(":")
         | 
| 66 45 | 
             
                banner = extract_banner(help) || command
         | 
| 67 | 
            -
                permute = !banner.index("*")
         | 
| 68 | 
            -
                banner.gsub!("*", "")
         | 
| 69 46 |  | 
| 70 47 | 
             
                Nimbu::Command.register_command(
         | 
| 71 48 | 
             
                  :klass       => self,
         | 
| 72 49 | 
             
                  :method      => method,
         | 
| 73 50 | 
             
                  :namespace   => self.namespace,
         | 
| 74 51 | 
             
                  :command     => command,
         | 
| 75 | 
            -
                  :banner      => banner,
         | 
| 76 | 
            -
                  :help        => help,
         | 
| 52 | 
            +
                  :banner      => banner.strip,
         | 
| 53 | 
            +
                  :help        => help.join("\n"),
         | 
| 77 54 | 
             
                  :summary     => extract_summary(help),
         | 
| 78 55 | 
             
                  :description => extract_description(help),
         | 
| 79 | 
            -
                  :options     => extract_options(help) | 
| 80 | 
            -
                  :permute     => permute
         | 
| 56 | 
            +
                  :options     => extract_options(help)
         | 
| 81 57 | 
             
                )
         | 
| 82 58 | 
             
              end
         | 
| 83 59 |  | 
| @@ -91,19 +67,6 @@ protected | |
| 91 67 | 
             
                app
         | 
| 92 68 | 
             
              end
         | 
| 93 69 |  | 
| 94 | 
            -
              #
         | 
| 95 | 
            -
              # Parse the caller format and identify the file and line number as identified
         | 
| 96 | 
            -
              # in : http://www.ruby-doc.org/core/classes/Kernel.html#M001397.  This will
         | 
| 97 | 
            -
              # look for a colon followed by a digit as the delimiter.  The biggest
         | 
| 98 | 
            -
              # complication is windows paths, which have a color after the drive letter.
         | 
| 99 | 
            -
              # This regex will match paths as anything from the beginning to a colon
         | 
| 100 | 
            -
              # directly followed by a number (the line number).
         | 
| 101 | 
            -
              #
         | 
| 102 | 
            -
              # Examples of the caller format :
         | 
| 103 | 
            -
              # * c:/Ruby192/lib/.../lib/nimbu/command/addons.rb:8:in `<module:Command>'
         | 
| 104 | 
            -
              # * c:/Ruby192/lib/.../nimbu-2.0.1/lib/nimbu/command/pg.rb:96:in `<class:Pg>'
         | 
| 105 | 
            -
              # * /Users/ph7/...../xray-1.1/lib/xray/thread_dump_signal_handler.rb:9
         | 
| 106 | 
            -
              #
         | 
| 107 70 | 
             
              def self.extract_help_from_caller(line)
         | 
| 108 71 | 
             
                # pull out of the caller the information for the file path and line number
         | 
| 109 72 | 
             
                if line =~ /^(.+?):(\d+)/
         | 
| @@ -112,50 +75,46 @@ protected | |
| 112 75 | 
             
                raise "unable to extract help from caller: #{line}"
         | 
| 113 76 | 
             
              end
         | 
| 114 77 |  | 
| 115 | 
            -
              def self.extract_help(file,  | 
| 78 | 
            +
              def self.extract_help(file, line_number)
         | 
| 116 79 | 
             
                buffer = []
         | 
| 117 | 
            -
                lines | 
| 118 | 
            -
             | 
| 119 | 
            -
                 | 
| 120 | 
            -
                   | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
             | 
| 80 | 
            +
                lines = Nimbu::Command.files[file]
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                (line_number.to_i-2).downto(0) do |i|
         | 
| 83 | 
            +
                  line = lines[i]
         | 
| 84 | 
            +
                  case line[0..0]
         | 
| 85 | 
            +
                    when ""
         | 
| 86 | 
            +
                    when "#"
         | 
| 87 | 
            +
                      buffer.unshift(line[1..-1])
         | 
| 88 | 
            +
                    else
         | 
| 89 | 
            +
                      break
         | 
| 125 90 | 
             
                  end
         | 
| 126 91 | 
             
                end
         | 
| 127 92 |  | 
| 128 | 
            -
                buffer | 
| 129 | 
            -
                  line.strip.gsub(/^#/, "")
         | 
| 130 | 
            -
                end
         | 
| 131 | 
            -
             | 
| 132 | 
            -
                buffer.reverse.join("\n").strip
         | 
| 93 | 
            +
                buffer
         | 
| 133 94 | 
             
              end
         | 
| 134 95 |  | 
| 135 96 | 
             
              def self.extract_banner(help)
         | 
| 136 | 
            -
                help. | 
| 97 | 
            +
                help.first
         | 
| 137 98 | 
             
              end
         | 
| 138 99 |  | 
| 139 100 | 
             
              def self.extract_summary(help)
         | 
| 140 | 
            -
                extract_description(help).split("\n").first
         | 
| 101 | 
            +
                extract_description(help).split("\n")[2].to_s.split("\n").first
         | 
| 141 102 | 
             
              end
         | 
| 142 103 |  | 
| 143 104 | 
             
              def self.extract_description(help)
         | 
| 144 | 
            -
                 | 
| 145 | 
            -
             | 
| 146 | 
            -
                 | 
| 147 | 
            -
                  line =~ /^-(.+)#(.+)/
         | 
| 148 | 
            -
                end.join("\n").strip
         | 
| 105 | 
            +
                help.reject do |line|
         | 
| 106 | 
            +
                  line =~ /^\s+-(.+)#(.+)/
         | 
| 107 | 
            +
                end.join("\n")
         | 
| 149 108 | 
             
              end
         | 
| 150 109 |  | 
| 151 110 | 
             
              def self.extract_options(help)
         | 
| 152 | 
            -
                help. | 
| 153 | 
            -
                  line =~  | 
| 154 | 
            -
                end.inject( | 
| 155 | 
            -
                   | 
| 156 | 
            -
                   | 
| 157 | 
            -
                   | 
| 158 | 
            -
                   | 
| 111 | 
            +
                help.select do |line|
         | 
| 112 | 
            +
                  line =~ /^\s+-(.+)#(.+)/
         | 
| 113 | 
            +
                end.inject([]) do |options, line|
         | 
| 114 | 
            +
                  args = line.split('#', 2).first
         | 
| 115 | 
            +
                  args = args.split(/,\s*/).map {|arg| arg.strip}.sort.reverse
         | 
| 116 | 
            +
                  name = args.last.split(' ', 2).first[2..-1]
         | 
| 117 | 
            +
                  options << { :name => name, :args => args }
         | 
| 159 118 | 
             
                end
         | 
| 160 119 | 
             
              end
         | 
| 161 120 |  | 
| @@ -170,6 +129,10 @@ protected | |
| 170 129 | 
             
                options[:confirm] && (options[:confirm] != options[:app])
         | 
| 171 130 | 
             
              end
         | 
| 172 131 |  | 
| 132 | 
            +
              def current_command
         | 
| 133 | 
            +
                Nimbu::Command.current_command
         | 
| 134 | 
            +
              end
         | 
| 135 | 
            +
             | 
| 173 136 | 
             
              def extract_app_in_dir(dir)
         | 
| 174 137 | 
             
                return unless remotes = git_remotes(dir)
         | 
| 175 138 |  | 
| @@ -0,0 +1,63 @@ | |
| 1 | 
            +
            require "nimbu/command/base"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # open the current site in your browser (simulator, admin)
         | 
| 4 | 
            +
            #
         | 
| 5 | 
            +
            class Nimbu::Command::Browse < Nimbu::Command::Base
         | 
| 6 | 
            +
              # index
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # open the current site in your browser
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              def index
         | 
| 11 | 
            +
                cmd = browse_command(args) do
         | 
| 12 | 
            +
                  dest = args.shift
         | 
| 13 | 
            +
                  dest = nil if dest == '--'
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  if dest
         | 
| 16 | 
            +
                    #site = nimbu browser dest
         | 
| 17 | 
            +
                  else
         | 
| 18 | 
            +
                    # $ nimbu browse
         | 
| 19 | 
            +
                    site = Nimbu::Auth.site
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  abort "Usage: nimbu browse <SITE>" unless site
         | 
| 23 | 
            +
                  "https://#{site}.#{Nimbu::Auth.admin_host}"
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
                exec(cmd)
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              # index
         | 
| 29 | 
            +
              #
         | 
| 30 | 
            +
              # open the simulator for your current site
         | 
| 31 | 
            +
              #
         | 
| 32 | 
            +
              def simulator
         | 
| 33 | 
            +
                cmd = browse_command(args) do
         | 
| 34 | 
            +
                  "http://localhost:4567"
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
                exec(cmd)
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              # index
         | 
| 40 | 
            +
              #
         | 
| 41 | 
            +
              # open the admin area for your current site
         | 
| 42 | 
            +
              #
         | 
| 43 | 
            +
              def admin
         | 
| 44 | 
            +
                cmd = browse_command(args) do
         | 
| 45 | 
            +
                  "https://#{Nimbu::Auth.site}.#{Nimbu::Auth.admin_host}/admin"
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
                exec(cmd)
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              protected
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              def browse_command(args)
         | 
| 53 | 
            +
                url_only = args.delete('-u')
         | 
| 54 | 
            +
                url = yield
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                exec_args = []
         | 
| 57 | 
            +
                exec_args.push(url_only ? 'echo' : browser_launcher)
         | 
| 58 | 
            +
                exec_args.push url
         | 
| 59 | 
            +
                exec_args.join(" ")
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            end
         | 
| 63 | 
            +
             | 
    
        data/lib/nimbu/command/help.rb
    CHANGED
    
    
| @@ -261,10 +261,12 @@ module Nimbu | |
| 261 261 | 
             
                  display(format_with_bang(message), new_line)
         | 
| 262 262 | 
             
                end
         | 
| 263 263 |  | 
| 264 | 
            -
                def error_with_failure | 
| 265 | 
            -
                   | 
| 266 | 
            -
             | 
| 267 | 
            -
             | 
| 264 | 
            +
                def self.error_with_failure
         | 
| 265 | 
            +
                  @@error_with_failure ||= false
         | 
| 266 | 
            +
                end
         | 
| 267 | 
            +
             | 
| 268 | 
            +
                def self.error_with_failure=(new_error_with_failure)
         | 
| 269 | 
            +
                  @@error_with_failure = new_error_with_failure
         | 
| 268 270 | 
             
                end
         | 
| 269 271 |  | 
| 270 272 | 
             
                def self.included_into
         | 
    
        data/lib/nimbu/command/init.rb
    CHANGED
    
    | @@ -1,24 +1,23 @@ | |
| 1 1 | 
             
            require "nimbu/command/base"
         | 
| 2 2 | 
             
            require 'term/ansicolor'
         | 
| 3 3 |  | 
| 4 | 
            -
            #  | 
| 4 | 
            +
            # working directory initialization
         | 
| 5 5 | 
             
            #
         | 
| 6 6 | 
             
            class Nimbu::Command::Init < Nimbu::Command::Base
         | 
| 7 7 | 
             
              include Term::ANSIColor
         | 
| 8 8 |  | 
| 9 9 | 
             
              # index
         | 
| 10 10 | 
             
              #
         | 
| 11 | 
            -
              #  | 
| 11 | 
            +
              # initialize your working directory to code a selected theme
         | 
| 12 12 | 
             
              #
         | 
| 13 13 | 
             
              def index
         | 
| 14 14 | 
             
                if Nimbu::Auth.read_configuration && Nimbu::Auth.read_credentials
         | 
| 15 15 | 
             
                  print green(bold("CONGRATULATIONS!")), ": this directory is already configured as a Nimbu theme."
         | 
| 16 16 | 
             
                else
         | 
| 17 | 
            -
                   | 
| 18 | 
            -
                  config = Nimbu::Auth.get_configuration
         | 
| 17 | 
            +
                  credentials = Nimbu::Auth.get_credentials
         | 
| 19 18 |  | 
| 20 | 
            -
                  display " | 
| 21 | 
            -
                  config = Nimbu::Auth. | 
| 19 | 
            +
                  display "Initializing the Nimbu configuration file."
         | 
| 20 | 
            +
                  config = Nimbu::Auth.get_configuration
         | 
| 22 21 |  | 
| 23 22 | 
             
                  display "Initializing directories:"
         | 
| 24 23 | 
             
                  display " - layouts"
         | 
    
        data/lib/nimbu/command/server.rb
    CHANGED
    
    | @@ -1,8 +1,6 @@ | |
| 1 1 | 
             
            require "nimbu/command/base"
         | 
| 2 2 | 
             
            require "nimbu/server/base"
         | 
| 3 3 | 
             
            require 'term/ansicolor'
         | 
| 4 | 
            -
            require 'compass'
         | 
| 5 | 
            -
            require 'compass/exec'
         | 
| 6 4 | 
             
            require 'thin'
         | 
| 7 5 |  | 
| 8 6 | 
             
            # running a local server to speed up designing Nimbu themes
         | 
| @@ -11,124 +9,190 @@ class Nimbu::Command::Server < Nimbu::Command::Base | |
| 11 9 | 
             
              include Term::ANSIColor
         | 
| 12 10 | 
             
              # server
         | 
| 13 11 | 
             
              #
         | 
| 14 | 
            -
              #  | 
| 12 | 
            +
              # starts a local development server, using the data from the Nimbu cloud in real time.
         | 
| 13 | 
            +
              #
         | 
| 14 | 
            +
              # -p PORT, --port PORT      # set the port on which to start the http server
         | 
| 15 | 
            +
              # -h,  --haml           # start local HAML watcher
         | 
| 16 | 
            +
              # -c,  --compass        # start local Compass watcher
         | 
| 17 | 
            +
              # -d,  --debug          # enable debugging output
         | 
| 15 18 | 
             
              #
         | 
| 16 19 | 
             
              def index
         | 
| 17 20 | 
             
                # Check if config file is present?
         | 
| 18 21 | 
             
                if !Nimbu::Auth.read_configuration || !Nimbu::Auth.read_credentials
         | 
| 19 22 | 
             
                  print red(bold("ERROR")), ": this directory does not seem to contain any Nimbu theme or your credentials are not set. \n ==> Run \"", bold { "nimbu init"}, "\" to initialize this directory."
         | 
| 20 23 | 
             
                else
         | 
| 21 | 
            -
                   | 
| 22 | 
            -
                   | 
| 24 | 
            +
                  no_compilation = true #! options[:'no-compile']
         | 
| 25 | 
            +
                  with_haml = options[:haml]
         | 
| 26 | 
            +
                  with_compass = options[:compass]
         | 
| 23 27 |  | 
| 24 | 
            -
                  if  | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 28 | 
            +
                  if with_compass
         | 
| 29 | 
            +
                    require 'compass'
         | 
| 30 | 
            +
                    require 'compass/exec'
         | 
| 27 31 | 
             
                  end
         | 
| 28 32 |  | 
| 29 | 
            -
                   | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
                        "            / | / (_)____ ___  / /_  __  __\n" +
         | 
| 33 | 
            -
                        "           /  |/ / // __ `__ \\/ __ \\/ / / /\n" +
         | 
| 34 | 
            -
                        "          / /|  / // / / / / / /_/ / /_/ / \n" +
         | 
| 35 | 
            -
                        "         /_/ |_/_//_/ /_/ /_/_.___/\\__,_/  \n")
         | 
| 33 | 
            +
                  if with_haml
         | 
| 34 | 
            +
                    require 'haml'
         | 
| 35 | 
            +
                  end
         | 
| 36 36 |  | 
| 37 | 
            -
                   | 
| 37 | 
            +
                  services = []
         | 
| 38 | 
            +
                  services << "HAML" if with_haml
         | 
| 39 | 
            +
                  services << "Compass" if with_compass
         | 
| 40 | 
            +
                  title = "Starting up Nimbu Server"
         | 
| 41 | 
            +
                  title << "(with local #{services.join(' and ')} watcher)" if with_compass || with_haml
         | 
| 42 | 
            +
                  title << "..."
         | 
| 43 | 
            +
                  puts white("\n#{title}")
         | 
| 44 | 
            +
                  puts green(nimbu_header)
         | 
| 45 | 
            +
                  puts green("\nConnnected to '#{Nimbu::Auth.site}.#{Nimbu::Auth.admin_host}', using '#{Nimbu::Auth.theme}' theme#{Nimbu.debug ? ' (in debug mode)'.red : nil}.\n")
         | 
| 38 46 |  | 
| 39 | 
            -
                   | 
| 40 | 
            -
                   | 
| 41 | 
            -
                   | 
| 47 | 
            +
                  server_read, server_write = IO::pipe
         | 
| 48 | 
            +
                  haml_read, haml_write = IO::pipe
         | 
| 49 | 
            +
                  compass_read, compass_write = IO::pipe
         | 
| 50 | 
            +
                  compiler_read, compiler_write = IO::pipe
         | 
| 42 51 |  | 
| 43 52 | 
             
                  server_pid = Process.fork do
         | 
| 44 | 
            -
                    $stdout.reopen( | 
| 45 | 
            -
                     | 
| 46 | 
            -
                    puts "Starting..."
         | 
| 47 | 
            -
                     | 
| 48 | 
            -
                      :Port               => 4567,
         | 
| 53 | 
            +
                    $stdout.reopen(server_write)
         | 
| 54 | 
            +
                    server_read.close
         | 
| 55 | 
            +
                    puts "Starting server..."
         | 
| 56 | 
            +
                    server_options = {
         | 
| 57 | 
            +
                      :Port               => options[:port] || 4567,
         | 
| 49 58 | 
             
                      :DocumentRoot       => Dir.pwd
         | 
| 50 59 | 
             
                    }
         | 
| 51 | 
            -
                    Rack::Handler::Thin.run Nimbu::Server::Base,  | 
| 60 | 
            +
                    Rack::Handler::Thin.run Nimbu::Server::Base, server_options  do |server|
         | 
| 52 61 | 
             
                      [:INT, :TERM].each { |sig| trap(sig) { server.respond_to?(:stop!) ? server.stop! : server.stop } }
         | 
| 53 62 | 
             
                    end
         | 
| 54 63 | 
             
                  end
         | 
| 55 64 |  | 
| 65 | 
            +
                  # assets_pid = Process.fork do
         | 
| 66 | 
            +
                  #   $stdout.reopen(compiler_write)
         | 
| 67 | 
            +
                  #   compiler_read.close
         | 
| 68 | 
            +
                  #   puts "Starting watcher..."
         | 
| 69 | 
            +
                  #   HamlWatcher.watch
         | 
| 70 | 
            +
                  # end unless no_compilation
         | 
| 71 | 
            +
             | 
| 56 72 | 
             
                  haml_pid = Process.fork do
         | 
| 57 | 
            -
                    $stdout.reopen( | 
| 58 | 
            -
                     | 
| 73 | 
            +
                    $stdout.reopen(haml_write)
         | 
| 74 | 
            +
                    haml_read.close
         | 
| 59 75 | 
             
                    puts "Starting..."
         | 
| 60 | 
            -
                    HamlWatcher.watch
         | 
| 61 | 
            -
             | 
| 76 | 
            +
                    haml_listener = HamlWatcher.watch
         | 
| 77 | 
            +
                    [:INT, :TERM].each do |sig|
         | 
| 78 | 
            +
                      Signal.trap(sig) do
         | 
| 79 | 
            +
                        puts green("== Stopping HAML watcher\n")
         | 
| 80 | 
            +
                        haml_listener.stop
         | 
| 81 | 
            +
                        puts haml_listener
         | 
| 82 | 
            +
                      end
         | 
| 83 | 
            +
                    end
         | 
| 84 | 
            +
                    Process.waitall
         | 
| 85 | 
            +
                  end if with_haml
         | 
| 62 86 |  | 
| 63 87 | 
             
                  compass_pid = Process.fork do
         | 
| 64 | 
            -
                    $stdout.reopen( | 
| 65 | 
            -
                     | 
| 88 | 
            +
                    $stdout.reopen(compass_write)
         | 
| 89 | 
            +
                    compass_read.close
         | 
| 66 90 | 
             
                    puts "Starting..."
         | 
| 67 91 | 
             
                    Compass::Exec::SubCommandUI.new(["watch","."]).run!
         | 
| 68 | 
            -
                  end  | 
| 69 | 
            -
             | 
| 92 | 
            +
                  end if with_compass
         | 
| 70 93 |  | 
| 71 94 | 
             
                  watch_server_pid = Process.fork do
         | 
| 72 95 | 
             
                    trap('INT') { exit }
         | 
| 73 | 
            -
                     | 
| 74 | 
            -
                     | 
| 96 | 
            +
                    server_write.close
         | 
| 97 | 
            +
                    server_read.each do |line|
         | 
| 75 98 | 
             
                      print cyan("SERVER:  ") + white(line) + ""
         | 
| 76 99 | 
             
                    end
         | 
| 77 100 | 
             
                  end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                  # watch_assets_pid = Process.fork do
         | 
| 103 | 
            +
                  #   trap('INT') { exit }
         | 
| 104 | 
            +
                  #   compiler_write.close
         | 
| 105 | 
            +
                  #   compiler_read.each do |line|
         | 
| 106 | 
            +
                  #     print magenta("ASSETS:    ") + white(line) + ""
         | 
| 107 | 
            +
                  #   end
         | 
| 108 | 
            +
                  # end unless no_compilation
         | 
| 109 | 
            +
             | 
| 78 110 | 
             
                  watch_haml_pid = Process.fork do
         | 
| 79 111 | 
             
                    trap('INT') { exit }
         | 
| 80 | 
            -
                     | 
| 81 | 
            -
                     | 
| 112 | 
            +
                    haml_write.close
         | 
| 113 | 
            +
                    haml_read.each do |line|
         | 
| 82 114 | 
             
                      print magenta("HAML:    ") + white(line) + ""
         | 
| 83 115 | 
             
                    end
         | 
| 84 | 
            -
                  end  | 
| 116 | 
            +
                  end if with_haml
         | 
| 85 117 |  | 
| 86 118 | 
             
                  watch_compass_pid = Process.fork do
         | 
| 87 119 | 
             
                    trap('INT') { exit }
         | 
| 88 | 
            -
                     | 
| 89 | 
            -
                     | 
| 120 | 
            +
                    compass_write.close
         | 
| 121 | 
            +
                    compass_read.each do |line|
         | 
| 90 122 | 
             
                      print yellow("COMPASS: ") + white(line) + ""
         | 
| 91 123 | 
             
                    end
         | 
| 92 | 
            -
                  end  | 
| 124 | 
            +
                  end if with_compass
         | 
| 93 125 |  | 
| 94 | 
            -
                  [:INT, :TERM].each do |sig| | 
| 126 | 
            +
                  [:INT, :TERM].each do |sig|
         | 
| 95 127 | 
             
                    trap(sig) do
         | 
| 96 128 | 
             
                      puts yellow("\n== Waiting for all processes to finish...")
         | 
| 129 | 
            +
                      Process.kill('INT', haml_pid) if haml_pid && running?(haml_pid)
         | 
| 97 130 | 
             
                      Process.waitall
         | 
| 98 131 | 
             
                      puts green("== Nimbu has ended its work " + bold("(crowd applauds!)\n"))
         | 
| 99 132 | 
             
                    end
         | 
| 100 133 | 
             
                  end
         | 
| 101 134 |  | 
| 102 | 
            -
                  Process.waitall | 
| 135 | 
            +
                  Process.waitall
         | 
| 136 | 
            +
                end
         | 
| 137 | 
            +
              end
         | 
| 138 | 
            +
             | 
| 139 | 
            +
              protected
         | 
| 140 | 
            +
             | 
| 141 | 
            +
              def nimbu_header
         | 
| 142 | 
            +
                h = ""
         | 
| 143 | 
            +
                h << "\n             o8o                     .o8"
         | 
| 144 | 
            +
                h << "\n             `\"'                    \"888"
         | 
| 145 | 
            +
                h << "\nooo. .oo.   oooo  ooo. .oo.  .oo.    888oooo.  oooo  oooo"
         | 
| 146 | 
            +
                h << "\n`888P\"Y88b  `888  `888P\"Y88bP\"Y88b   d88' `88b `888  `888"
         | 
| 147 | 
            +
                h << "\n 888   888   888   888   888   888   888   888  888   888"
         | 
| 148 | 
            +
                h << "\n 888   888   888   888   888   888   888   888  888   888"
         | 
| 149 | 
            +
                h << "\no888o o888o o888o o888o o888o o888o  `Y8bod8P'  `V88V\"V8P'"
         | 
| 150 | 
            +
              end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
              def running?(pid)
         | 
| 153 | 
            +
                begin
         | 
| 154 | 
            +
                  Process.getpgid( pid )
         | 
| 155 | 
            +
                  true
         | 
| 156 | 
            +
                rescue Errno::ESRCH
         | 
| 157 | 
            +
                  false
         | 
| 103 158 | 
             
                end
         | 
| 104 159 | 
             
              end
         | 
| 105 160 | 
             
            end
         | 
| 106 161 |  | 
| 107 162 | 
             
            require 'rubygems'
         | 
| 108 | 
            -
            require ' | 
| 163 | 
            +
            require 'listen'
         | 
| 109 164 | 
             
            require 'haml'
         | 
| 110 165 |  | 
| 111 166 | 
             
            class HamlWatcher
         | 
| 112 167 | 
             
              class << self
         | 
| 113 168 | 
             
                include Term::ANSIColor
         | 
| 114 | 
            -
             | 
| 169 | 
            +
             | 
| 115 170 | 
             
                def watch
         | 
| 116 171 | 
             
                  refresh
         | 
| 117 172 | 
             
                  puts ">>> Haml is polling for changes. Press Ctrl-C to Stop."
         | 
| 118 | 
            -
                   | 
| 119 | 
            -
             | 
| 173 | 
            +
                  listener = Listen.to('haml')
         | 
| 174 | 
            +
                  listener.relative_paths(true)
         | 
| 175 | 
            +
                  listener.filter(/\.haml$/)
         | 
| 176 | 
            +
                  modifier = lambda do |modified, added, removed|
         | 
| 177 | 
            +
                    puts modified.inspect
         | 
| 178 | 
            +
                    modified.each do |relative|
         | 
| 120 179 | 
             
                      puts ">>> Change detected to: #{relative}"
         | 
| 121 180 | 
             
                      HamlWatcher.compile(relative)
         | 
| 122 | 
            -
                    end
         | 
| 123 | 
            -
             | 
| 181 | 
            +
                    end if modified
         | 
| 182 | 
            +
             | 
| 183 | 
            +
                    added.each do |relative|
         | 
| 124 184 | 
             
                      puts ">>> File created: #{relative}"
         | 
| 125 185 | 
             
                      HamlWatcher.compile(relative)
         | 
| 126 | 
            -
                    end
         | 
| 127 | 
            -
             | 
| 186 | 
            +
                    end if added
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                    removed.each do |relative|
         | 
| 128 189 | 
             
                      puts ">>> File deleted: #{relative}"
         | 
| 129 190 | 
             
                      HamlWatcher.remove(relative)
         | 
| 130 | 
            -
                    end
         | 
| 191 | 
            +
                    end if removed
         | 
| 131 192 | 
             
                  end
         | 
| 193 | 
            +
                  listener.change(&modifier)
         | 
| 194 | 
            +
                  listener.start(false)
         | 
| 195 | 
            +
                  listener
         | 
| 132 196 | 
             
                end
         | 
| 133 197 |  | 
| 134 198 | 
             
                def output_file(filename)
         | 
| @@ -153,7 +217,7 @@ class HamlWatcher | |
| 153 217 | 
             
                    puts "\033[0;#{color}m#{action}\033[0m #{output_file_name}"
         | 
| 154 218 | 
             
                    FileUtils.mkdir_p(File.dirname(output_file_name))
         | 
| 155 219 | 
             
                    File.open(output_file_name,'w') {|f| f.write(result)}
         | 
| 156 | 
            -
                  rescue Exception => e | 
| 220 | 
            +
                  rescue Exception => e
         | 
| 157 221 | 
             
                    print red("#{plainError e, file}\n")
         | 
| 158 222 | 
             
                    output_file_name = output_file(file)
         | 
| 159 223 | 
             
                    result = goHere(e, file)
         | 
| @@ -194,7 +258,7 @@ class HamlWatcher | |
| 194 258 | 
             
                  return (exception.message.scan(/:(\d+)/).first || ["??"]).first if exception.is_a?(::SyntaxError)
         | 
| 195 259 | 
             
                  (exception.backtrace[0].scan(/:(\d+)/).first || ["??"]).first
         | 
| 196 260 | 
             
                end
         | 
| 197 | 
            -
             | 
| 261 | 
            +
             | 
| 198 262 | 
             
                def plainError(message, nameoffile)
         | 
| 199 263 | 
             
                  @plainMessage = ""
         | 
| 200 264 | 
             
                  @plainMessage += "Error: #{message} \n"
         | 
| @@ -202,7 +266,7 @@ class HamlWatcher | |
| 202 266 | 
             
                  @plainMessage += "File error detected: #{nameoffile}"
         | 
| 203 267 | 
             
                  return @plainMessage
         | 
| 204 268 | 
             
                end
         | 
| 205 | 
            -
             | 
| 269 | 
            +
             | 
| 206 270 | 
             
                def sassErrorLine message
         | 
| 207 271 | 
             
                  return message
         | 
| 208 272 | 
             
                end
         |