pagoda 0.3.2 → 0.5.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.
Files changed (65) hide show
  1. data/.DS_Store +0 -0
  2. data/Gemfile +3 -3
  3. data/Gemfile.lock +33 -24
  4. data/README.md +68 -0
  5. data/Rakefile +4 -7
  6. data/bin/pagoda +100 -8
  7. data/lib/pagoda/cli/commands/clone.rb +13 -0
  8. data/lib/pagoda/cli/commands/create.rb +13 -0
  9. data/lib/pagoda/cli/commands/deploy.rb +12 -0
  10. data/lib/pagoda/cli/commands/destroy.rb +16 -0
  11. data/lib/pagoda/cli/commands/info.rb +13 -0
  12. data/lib/pagoda/cli/commands/init.rb +13 -0
  13. data/lib/pagoda/cli/commands/list.rb +20 -0
  14. data/lib/pagoda/cli/commands/rename.rb +17 -0
  15. data/lib/pagoda/cli/commands/rollback.rb +12 -0
  16. data/lib/pagoda/cli/commands/ssh_key.rb +27 -0
  17. data/lib/pagoda/cli/commands/tunnel.rb +18 -0
  18. data/lib/pagoda/cli/commands.rb +11 -0
  19. data/lib/pagoda/{helpers.rb → cli/core_ext.rb} +10 -118
  20. data/lib/pagoda/cli/helpers/app.rb +143 -0
  21. data/lib/pagoda/cli/helpers/base.rb +199 -0
  22. data/lib/pagoda/cli/helpers/key.rb +69 -0
  23. data/lib/pagoda/cli/helpers/tunnel.rb +36 -0
  24. data/lib/pagoda/cli/helpers.rb +127 -0
  25. data/lib/pagoda/cli/override.rb +23 -0
  26. data/lib/pagoda/cli/version.rb +5 -0
  27. data/lib/pagoda/cli.rb +11 -0
  28. data/lib/pagoda-cli.rb +1 -0
  29. data/pagoda.gemspec +20 -24
  30. data/pagoda.rdoc +139 -0
  31. data/pkg/newpagoda-0.1.10.gem +0 -0
  32. data/pkg/newpagoda-0.1.11.gem +0 -0
  33. data/pkg/newpagoda-0.1.12.gem +0 -0
  34. data/pkg/newpagoda-0.1.13.gem +0 -0
  35. data/pkg/newpagoda-0.1.15.gem +0 -0
  36. data/pkg/newpagoda-0.1.4.gem +0 -0
  37. data/pkg/newpagoda-0.1.6.gem +0 -0
  38. data/pkg/newpagoda-0.1.7.gem +0 -0
  39. data/pkg/newpagoda-0.1.8.gem +0 -0
  40. data/pkg/newpagoda-0.1.9.gem +0 -0
  41. data/pkg/newpagoda-0.5.0.gem +0 -0
  42. data/spec/lib/helper_spec.rb +32 -0
  43. data/spec/lib/helpers/app_spec.rb +104 -0
  44. data/spec/lib/helpers/base_spec.rb +27 -0
  45. data/spec/lib/helpers/key_spec.rb +42 -0
  46. data/spec/lib/helpers/tunnel_spec.rb +30 -0
  47. data/spec/spec_helper.rb +17 -0
  48. metadata +74 -50
  49. data/.bundle/config +0 -1
  50. data/README +0 -3
  51. data/lib/pagoda/client.rb +0 -225
  52. data/lib/pagoda/command.rb +0 -96
  53. data/lib/pagoda/commands/app.rb +0 -247
  54. data/lib/pagoda/commands/auth.rb +0 -149
  55. data/lib/pagoda/commands/base.rb +0 -184
  56. data/lib/pagoda/commands/db.rb +0 -18
  57. data/lib/pagoda/commands/help.rb +0 -100
  58. data/lib/pagoda/commands/tunnel.rb +0 -49
  59. data/lib/pagoda/tunnel_proxy.rb +0 -130
  60. data/lib/pagoda/version.rb +0 -3
  61. data/lib/pagoda.rb +0 -3
  62. data/spec/base.rb +0 -21
  63. data/spec/client_spec.rb +0 -255
  64. data/spec/command_spec.rb +0 -26
  65. data/spec/commands/auth_spec.rb +0 -57
data/.DS_Store ADDED
Binary file
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source 'http://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in pagoda.gemspec
4
- gemspec
3
+ # Specify your gem's dependencies in pagoda-cli.gemspec
4
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,41 +1,50 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pagoda (0.3.1)
5
- crack
6
- iniparse
7
- json_pure
8
- rest-client
4
+ pagoda (0.1.15)
5
+ gli
6
+ pagoda-client
7
+ pagoda-tunnel
9
8
 
10
9
  GEM
11
10
  remote: http://rubygems.org/
12
11
  specs:
13
- addressable (2.2.5)
14
- crack (0.1.8)
15
- diff-lcs (1.1.2)
16
- iniparse (1.1.4)
17
- json_pure (1.5.4)
18
- spruz (~> 0.2.8)
19
- mime-types (1.16)
12
+ coderay (0.9.8)
13
+ diff-lcs (1.1.3)
14
+ gli (1.3.5)
15
+ json_pure (1.6.1)
16
+ method_source (0.6.7)
17
+ ruby_parser (>= 2.3.1)
18
+ mime-types (1.17.2)
19
+ pagoda-client (0.1.2)
20
+ json_pure
21
+ rest-client
22
+ pagoda-tunnel (0.1.2)
23
+ rest-client
24
+ pry (0.9.7.3)
25
+ coderay (~> 0.9.8)
26
+ method_source (~> 0.6.7)
27
+ ruby_parser (>= 2.3.1)
28
+ slop (~> 2.1.0)
20
29
  rest-client (1.6.7)
21
30
  mime-types (>= 1.16)
22
- rspec (2.5.0)
23
- rspec-core (~> 2.5.0)
24
- rspec-expectations (~> 2.5.0)
25
- rspec-mocks (~> 2.5.0)
26
- rspec-core (2.5.1)
27
- rspec-expectations (2.5.0)
31
+ rspec (2.7.0)
32
+ rspec-core (~> 2.7.0)
33
+ rspec-expectations (~> 2.7.0)
34
+ rspec-mocks (~> 2.7.0)
35
+ rspec-core (2.7.1)
36
+ rspec-expectations (2.7.0)
28
37
  diff-lcs (~> 1.1.2)
29
- rspec-mocks (2.5.0)
30
- spruz (0.2.13)
31
- webmock (1.6.2)
32
- addressable (>= 2.2.2)
33
- crack (>= 0.1.7)
38
+ rspec-mocks (2.7.0)
39
+ ruby_parser (2.3.1)
40
+ sexp_processor (~> 3.0)
41
+ sexp_processor (3.0.7)
42
+ slop (2.1.0)
34
43
 
35
44
  PLATFORMS
36
45
  ruby
37
46
 
38
47
  DEPENDENCIES
39
48
  pagoda!
49
+ pry
40
50
  rspec
41
- webmock
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # Pagoda Box Command Line Interface
2
+
3
+ Thank you for choosing pagodabox [Pagoda Box](http://www.pagodabox.com).
4
+
5
+ ## Features
6
+
7
+ This client currently supports:
8
+
9
+ * Application functions
10
+ * Creation
11
+ * Clone
12
+ * init
13
+ * Deploy
14
+ * Rollback
15
+ * Tunnel to live database
16
+
17
+ ## How to use:
18
+
19
+ Using the command line interface can be fun!
20
+
21
+ $ gem install pagoda
22
+
23
+ Fetching: pagoda-0.3.2.gem (100%)
24
+ Successfully installed pagoda-0.3.2
25
+ 1 gem installed
26
+ Installing ri documentation for pagoda-0.3.2...
27
+ Installing RDoc documentation for pagoda-0.3.2...
28
+
29
+ $ pagoda launch workflowdemo
30
+
31
+ +> Registering workflowdemo
32
+ +> Launching........
33
+ +> workflowdemo launched
34
+
35
+ +> deploying to match current branch and commit.....
36
+ +> deployed
37
+
38
+ -----------------------------------------------
39
+
40
+ LIVE URL : http://workflowdemo.pagodabox.com
41
+ ADMIN PANEL : http://dashboard.pagodabox.com
42
+
43
+ -----------------------------------------------
44
+
45
+
46
+ ## Get Started
47
+
48
+ ### Install Pagoda
49
+
50
+ Install ruby and the gem thing. then do "gem install pagoda"
51
+
52
+ ### Navigate
53
+
54
+ Navigate into the folder of your repo
55
+
56
+ $ cd /path/to/repo
57
+
58
+ ### Launch your app
59
+
60
+ Select a app name and launch it
61
+
62
+ $ pagoda launch <appname>
63
+
64
+
65
+ ## More Information
66
+
67
+ More information can be found in our [Guides](http://guides.pagodabox.com/getting-started/pagoda-terminal-client)
68
+
data/Rakefile CHANGED
@@ -1,11 +1,8 @@
1
- require 'bundler'
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
2
3
  require "rspec/core/rake_task"
3
4
 
4
- Bundler::GemHelper.install_tasks
5
-
6
5
  desc "Run all specs"
7
6
  RSpec::Core::RakeTask.new('spec') do |t|
8
- t.rspec_opts = ['--colour --format progress']
9
- end
10
-
11
- task :default => :spec
7
+ t.rspec_opts = ['--colour --format documentation']
8
+ end
data/bin/pagoda CHANGED
@@ -1,13 +1,105 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
- $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
3
+ require 'rubygems'
4
+ require 'rest_client'
5
+ require 'gli'
5
6
 
6
- require 'pagoda/client'
7
- require 'pagoda/command'
7
+ require 'pagoda/cli/version'
8
+ require 'pagoda/cli/override'
8
9
 
9
- args = ARGV.dup
10
- ARGV.clear
11
- command = args.shift.strip rescue 'help'
10
+ # command = ARGV.shift.strip rescue 'help'
11
+ include GLI
12
+ config_file '.pagodarc'
12
13
 
13
- Pagoda::Command.run(command, args)
14
+ program_desc 'Command line client for Pagoda Box'
15
+
16
+ version Pagoda::CLI::VERSION
17
+
18
+ desc "Username created on pagoda Box"
19
+ arg_name "Username"
20
+ flag [:u, :username]
21
+
22
+ desc "Password to connect to Pagoda Box"
23
+ arg_name "Password"
24
+ flag [:p, :password]
25
+
26
+ desc 'The app name for Pagoda Box'
27
+ arg_name 'APP_NAME'
28
+ flag [:a, :app]
29
+
30
+ desc "Help"
31
+ switch [:h, :help]
32
+
33
+ require 'pagoda/cli'
34
+
35
+ GLI::DefaultHelpCommand.skips_pre = true
36
+
37
+ pre do |global,command,options,args|
38
+ # Pre logic here
39
+ # Return true to proceed; false to abourt and not call the
40
+ # chosen command
41
+ # Use skips_pre before a command to skip this block
42
+ # on that command only
43
+ if global[:help] or options[:help]
44
+ if command
45
+ GLI.commands[:help].execute(global, {}, [ command.name ])
46
+ else
47
+ GLI.commands[:help].execute(global, {}, [])
48
+ end
49
+ false
50
+ else
51
+ if command and not global[:username] and not global[:password]
52
+ puts "it appears this is the first time you have used our client"
53
+ user, password = Pagoda::Command::Base.ask_for_credentials
54
+ GLI.run(["-u",user,'-p',password,'initconfig', '--force'])
55
+ global.merge!(:username => user, :password => password)
56
+ end
57
+
58
+ true
59
+ end
60
+ end
61
+
62
+ post do |global,command,options,args|
63
+ # Post logic here
64
+ # Use skips_post before a command to skip this
65
+ # block on that command only
66
+ end
67
+
68
+ on_error do |exception|
69
+ if exception.class == RestClient::Unauthorized
70
+ Pagoda::Command::Base.error "Username or Password is invald"
71
+ elsif exception.class == RestClient::ResourceNotFound
72
+ Pagoda::Command::Base.error "It appears we cant find your 'resource', please try again later"
73
+ elsif exception.class == RestClient::InternalServerError
74
+ Pagoda::Command::Base.error "It appears pagodabox is having some trouble, please try again later"
75
+ elsif exception.class == GLI::UnknownGlobalArgument or exception.class == GLI::UnknownCommandArgument or exception.class == GLI::UnknownCommand
76
+ Pagoda::Command::Base.error " -- #{exception.message} -- "
77
+ elsif exception.class == RestClient::UnprocessableEntity
78
+ errors = []
79
+ errors << ":: Unable to process your request"
80
+ body = JSON.load(exception.response.body)
81
+ body.each do |key, value|
82
+ value.each do |problem|
83
+ errors << " +> #{key.gsub(/\_/, "-")} #{problem}"
84
+ end
85
+ end
86
+ Pagoda::Command::Base.error errors
87
+ elsif exception.class == SystemExit or exception.class == Interrupt
88
+ else
89
+ errors = [
90
+ "The Client has had an unexpected error:",
91
+ " -- #{exception.message} -- ",
92
+ exception.backtrace.join("\n"),
93
+ "Please report this error to support@pagodabox.com so we can fix it.",
94
+ "Thank you."
95
+ ]
96
+ Pagoda::Command::Base.error errors
97
+ end
98
+
99
+ # Error logic here
100
+ # return false to skip default error handling
101
+ # ENV['GLI_DEBUG'] = 'true'
102
+ # false
103
+ end
104
+
105
+ exit GLI.run(ARGV)
@@ -0,0 +1,13 @@
1
+ desc 'Clone an application from pagodabox'
2
+ arg_name 'Application Name'
3
+ command :clone do |c|
4
+
5
+ c.desc 'Your application name on pagodabox'
6
+ c.arg_name 'APP_NAME'
7
+ c.flag [:a, :app]
8
+
9
+ c.action do |global_options,options,args|
10
+ require 'pagoda/cli/helpers/app'
11
+ Pagoda::Command::App.new(global_options,options,args).clone
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ desc 'Create a new application on pagodabox'
2
+ arg_name 'new-application-name'
3
+ command :create do |c|
4
+
5
+ c.desc 'New app name'
6
+ c.arg_name 'APP_NAME'
7
+ c.flag [:a, :app]
8
+
9
+ c.action do |global_options,options,args|
10
+ require 'pagoda/cli/helpers/app'
11
+ Pagoda::Command::App.new(global_options,options,args).create
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ desc 'Deploy your current code branch and commit to your Pagoda Box app'
2
+ command :deploy do |c|
3
+
4
+ c.desc 'Your application name on pagodabox'
5
+ c.arg_name 'APP_NAME'
6
+ c.flag [:a, :app]
7
+
8
+ c.action do |global_options,options,args|
9
+ require 'pagoda/cli/helpers/app'
10
+ Pagoda::Command::App.new(global_options,options,args).deploy
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ desc 'Destroy your application'
2
+ arg_name 'Describe arguments to destroy here'
3
+ command :destroy do |c|
4
+
5
+ c.desc "Force without confirmation"
6
+ c.switch [:f, :force]
7
+
8
+ c.desc 'New app name'
9
+ c.arg_name 'APP_NAME'
10
+ c.flag [:a, :app]
11
+
12
+ c.action do |global_options,options,args|
13
+ require 'pagoda/cli/helpers/app'
14
+ Pagoda::Command::App.new(global_options,options,args).destroy
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ desc 'Get information for a specific app'
2
+ arg_name 'Application Name'
3
+ command :info do |c|
4
+
5
+ c.desc 'App on pagodabox'
6
+ c.arg_name 'APP_NAME'
7
+ c.flag [:a, :app]
8
+
9
+ c.action do |global_options,options,args|
10
+ require 'pagoda/cli/helpers/app'
11
+ ::Pagoda::Command::App.new(global_options,options,args).info
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ desc 'Connect your local repo with your pagodabox repo.'
2
+ arg_name 'APP_NAME'
3
+ command :init do |c|
4
+
5
+ c.desc 'App name initializing to'
6
+ c.arg_name 'APP_NAME'
7
+ c.flag [:a, :app]
8
+
9
+ c.action do |global_options,options,args|
10
+ require 'pagoda/cli/helpers/app'
11
+ Pagoda::Command::App.new(global_options,options,args).init
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ desc 'List information on pagodabox'
2
+ command :list do |c|
3
+
4
+ c.desc "Web Components"
5
+ c.switch [:w, :web]
6
+
7
+ c.desc "Database Components"
8
+ c.switch [:d, :database]
9
+
10
+ c.desc "Cache Components"
11
+ c.switch [:c, :cache]
12
+
13
+ c.desc "Worker Components"
14
+ c.switch [:r, :worker]
15
+
16
+ c.action do |global_options,options,args|
17
+ require 'pagoda/cli/helpers/app'
18
+ ::Pagoda::Command::App.new(global_options,options,args).list
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ # desc 'Rename your application'
2
+ # command :rename do |c|
3
+
4
+ # c.desc 'New name to apply to application'
5
+ # c.arg_name 'APP_NAME'
6
+ # c.flag [:n, :new]
7
+
8
+ # c.desc 'Old name of application'
9
+ # c.arg_name 'APP_NAME'
10
+ # c.flag [:o, :old]
11
+
12
+
13
+ # c.action do |global_options,options,args|
14
+ # require 'pagoda/cli/helpers/app'
15
+ # Pagoda::Command::App.new(global_options,options,args).rename
16
+ # end
17
+ # end
@@ -0,0 +1,12 @@
1
+ desc 'Rollback your repo to the deploy it was on last'
2
+ command :rollback do |c|
3
+
4
+ c.desc 'Application to be rolled back'
5
+ c.arg_name 'APP_NAME'
6
+ c.flag [:a, :app]
7
+
8
+ c.action do |global_options,options,args|
9
+ require 'pagoda/cli/helpers/app'
10
+ Pagoda::Command::App.new(global_options, options, args).rollback
11
+ end
12
+ end
@@ -0,0 +1,27 @@
1
+ desc 'Generate an ssh key and post it to pagodabox'
2
+ arg_name 'Describe arguments to destroy here'
3
+ command 'key:gen' do |c|
4
+
5
+ c.desc 'File that will contain your ssh key'
6
+ c.arg_name 'FILE_NAME'
7
+ c.flag [:f, :file]
8
+
9
+ c.action do |global_options,options,args|
10
+ require 'pagoda/cli/helpers/key'
11
+ Pagoda::Command::Key.new(global_options,options,args).generate_key_and_push
12
+ end
13
+ end
14
+
15
+ desc 'Post an existiong ssh key to pagodabox'
16
+ command 'key:push' do |c|
17
+
18
+ c.desc 'File that contains your ssh key'
19
+ c.arg_name 'FILE_NAME'
20
+ c.flag [:f, :file]
21
+
22
+
23
+ c.action do |global_options,options,args|
24
+ require 'pagoda/cli/helpers/key'
25
+ Pagoda::Command::Key.new(global_options,options,args).push_existing_key
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ desc 'Tunnel to a component in your application'
2
+ arg_name 'Component name'
3
+ command :tunnel do |c|
4
+
5
+ c.desc 'Component name you want to connect to'
6
+ c.arg_name 'COMPONENT_NAME'
7
+ c.flag [:c, :component]
8
+
9
+ c.desc 'New app name'
10
+ c.arg_name 'APP_NAME'
11
+ c.flag [:a, :app]
12
+
13
+
14
+ c.action do |global_options,options,args|
15
+ require 'pagoda/cli/helpers/tunnel'
16
+ Pagoda::Command::Tunnel.new(global_options,options,args).run
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ require 'pagoda/cli/commands/clone'
2
+ require 'pagoda/cli/commands/create'
3
+ require 'pagoda/cli/commands/deploy'
4
+ require 'pagoda/cli/commands/destroy'
5
+ require 'pagoda/cli/commands/info'
6
+ require 'pagoda/cli/commands/init'
7
+ require 'pagoda/cli/commands/ssh_key'
8
+ require 'pagoda/cli/commands/list'
9
+ require 'pagoda/cli/commands/rename'
10
+ require 'pagoda/cli/commands/rollback'
11
+ require 'pagoda/cli/commands/tunnel'
@@ -1,122 +1,15 @@
1
- require 'crack'
2
-
3
- module Pagoda
4
- module Helpers
5
- INDENT = " "
6
-
7
- def home_directory
8
- running_on_windows? ? ENV['USERPROFILE'] : ENV['HOME']
9
- end
10
-
11
- def running_on_windows?
12
- RUBY_PLATFORM =~ /mswin32|mingw32/
13
- end
14
-
15
- def running_on_a_mac?
16
- RUBY_PLATFORM =~ /-darwin\d/
17
- end
18
-
19
- def display(msg="", newline=true, level=1)
20
- indent = build_indent(level)
21
- if newline
22
- (running_on_windows?) ? puts("#{indent}#{msg}") : puts("#{indent}#{msg}".green)
23
- else
24
- (running_on_windows?) ? print("#{indent}#{msg}") : print("#{indent}#{msg}".green)
25
- STDOUT.flush
26
- end
27
- end
28
-
29
- def option_value(short_hand = nil, long_hand = nil)
30
- match = false
31
- value = nil
32
-
33
- if short_hand
34
- if args.include?(short_hand)
35
- value = args[args.index(short_hand) + 1]
36
- match = true
37
- end
38
- end
39
- if long_hand && !match
40
- if match = args.grep(/#{long_hand}.*/).first
41
- if match.include? "="
42
- value = match.split("=").last
43
- else
44
- value = true
45
- end
46
- end
47
- end
48
-
49
- value
50
- end
51
-
52
- def format_date(date)
53
- date = Time.parse(date) if date.is_a?(String)
54
- date.strftime("%Y-%m-%d %H:%M %Z")
55
- end
56
-
57
- def ask(message=nil, level=1)
58
- display("#{message}", false, level) if message
59
- gets.strip
1
+ # 1.9 adds realpath to resolve symlinks; 1.8 doesn't
2
+ # have this method, so we add it so we get resolved symlinks
3
+ # and compatibility
4
+ unless File.respond_to? :realpath
5
+ class File #:nodoc:
6
+ def self.realpath path
7
+ return realpath(File.readlink(path)) if symlink?(path)
8
+ path
60
9
  end
61
-
62
- def confirm(message="Are you sure you wish to continue? (y/n)?", level=1)
63
- return true if args.include? "-f"
64
- case message
65
- when Array
66
- count = message.length
67
- iteration = 0
68
- message.each do |m|
69
- if iteration == count - 1
70
- (running_on_windows?) ? display("#{m} ", false, level) : display("#{m} ".blue, false, level)
71
- else
72
- (running_on_windows?) ? display("#{m} ", false, level) : display("#{m} ".blue, true, level)
73
- end
74
- iteration += 1
75
- end
76
- when String
77
- (running_on_windows?) ? display("#{message} ", false, level) : display("#{message} ".blue, false, level)
78
- end
79
- ask.downcase == 'y'
80
- end
81
-
82
- def error(msg, exit=true, level=1)
83
- indent = build_indent(level)
84
- STDERR.puts
85
- case msg
86
- when Array
87
- (running_on_windows?) ? STDERR.puts("#{indent}** Error:") : STDERR.puts("#{indent}** Error:".red)
88
- msg.each do |m|
89
- (running_on_windows?) ? STDERR.puts("#{indent}** #{m}") : STDERR.puts("#{indent}** #{m}".red)
90
- end
91
- when String
92
- (running_on_windows?) ? STDERR.puts("#{indent}** Error:") : STDERR.puts("#{indent}** Error:".red)
93
- end
94
- STDERR.puts
95
- exit 1 if exit
96
- end
97
-
98
- def loop_transaction(app_name = nil)
99
- finished = false
100
- until finished
101
- display ".", false, 0
102
- sleep 1
103
- if client.app_info(app_name || app)[:transactions].count < 1
104
- finished = true
105
- display
106
- end
107
- end
108
- end
109
-
110
- def build_indent(level=1)
111
- indent = ""
112
- level.times do
113
- indent += INDENT
114
- end
115
- indent
116
- end
117
-
118
10
  end
119
11
  end
12
+ $: << File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib')
120
13
 
121
14
  unless String.method_defined?(:shellescape)
122
15
  class String
@@ -126,7 +19,6 @@ unless String.method_defined?(:shellescape)
126
19
  end
127
20
  end
128
21
 
129
-
130
22
  class String
131
23
 
132
24
  #
@@ -314,4 +206,4 @@ class String
314
206
  ""
315
207
  end
316
208
  end
317
- end
209
+ end