fanforce-cli 1.7.1 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,12 @@
1
+ class Fanforce::CLI::Scripts
2
+ include Fanforce::CLI::Utils
3
+
4
+ Fanforce::CLI.register self, :version, [nil, 'Display your current Fanforce CLI version number']
5
+
6
+ def version(*args)
7
+ puts divider '++----------------------------------------------------------------------------------------------------'
8
+ puts "You are using Fanforce::CLI v#{Fanforce::CLI::VERSION}"
9
+ puts divider '----------------------------------------------------------------------------------------------------++'
10
+ end
11
+
12
+ end
@@ -1,70 +1,90 @@
1
1
  module Fanforce::CLI::Utils
2
- extend Fanforce::CLI::Utils
2
+ extend self
3
+ def self.included(base) base.extend(self) end
3
4
 
4
- def format(text, *args)
5
+ def divider(template)
6
+ line_width = 150
7
+ line_width = line_width - $1.size if template =~ /(\s+)[=-]+/
8
+ template.gsub('+', "\n").gsub(/[-]+/, '-' * line_width).gsub(/[=]+/, '=' * line_width)
9
+ end
10
+
11
+ def log(msg='')
12
+ puts msg
13
+ end
14
+
15
+ def error(msg, command=nil)
16
+ puts divider '+-+'
17
+ puts 'ERROR '.format(:red,:bold) + msg
18
+ puts divider '-++'
19
+ exit
20
+ end
21
+
22
+ def fmt(text, *args)
23
+ "#{fmt_start(*args)}#{text}#{fmt_end}"
24
+ end
25
+
26
+ def fmt_start(*args)
5
27
  effect = args.include?(:bold) ? 1 : 0
6
28
  color = if args.include?(:red) then 31
7
29
  elsif args.include?(:green) then 32
8
30
  elsif args.include?(:magenta) then 35
9
31
  else 39 end
10
- "\033[#{effect};#{color}m#{text}\033[0m"
32
+ "\033[#{effect};#{color}m"
11
33
  end
12
34
 
13
- def format_config(hash)
14
- hash.values.select{|v| v.is_a? Hash}.each{|h| format_config(h)}
15
- hash.symbolize_keys!
35
+ def fmt_end
36
+ "\033[0m"
16
37
  end
17
38
 
18
- def unknown
19
- puts '---------------------------------------------------------------------------------------------------------------'
20
- puts 'OOPS'.format(:bold,:red) + '... unknown command'.format(:red)
21
- puts Fanforce::CLI::Help.commands(@allowed_commands)
22
- exit 1
23
- end
24
-
25
- def error(msg, command=nil)
26
- puts '---------------------------------------------------------------------------------------------------------------'
27
- puts 'ERROR... '.format(:bold,:red) + msg
28
- puts '---------------------------------------------------------------------------------------------------------------'
29
- puts ''
30
- if command.present?
31
- puts Fanforce::CLI::Help.for(command, @allowed_commands)
32
- else
33
- puts Fanforce::CLI::Help.commands(@allowed_commands)
34
- end
35
- exit 1
36
- end
37
-
38
- def confirm(msg)
39
- puts '---------------------------------------------------------------------------------------------------------------'
39
+ def confirm(msg, exit_unless_confirmed=true)
40
40
  print "#{msg} [y/n]: "
41
41
  input = $stdin.gets.strip
42
- exit 0 if input.downcase == 'n'
42
+ confirmed = !input.downcase.include?('n')
43
+ (!confirmed && exit_unless_confirmed) ? exit(0) : confirmed
43
44
  end
44
45
 
45
- def env(environment)
46
- return if environment.blank?
47
- is_symbol = environment.is_a?(Symbol)
48
- env = case environment.to_sym
49
- when :development then :dev
50
- when :staging then :stg
51
- when :production then :prd
52
- else raise 'unknown environment'
53
- end
54
- is_symbol ? env : env.to_s
46
+ def prompt(msg, required=false)
47
+ print "#{msg}"
48
+ response = $stdin.gets.strip
49
+ (required && response.blank?) ? prompt(msg, required) : response
55
50
  end
56
51
 
57
- def get_heroku_app_name(app, environment)
58
- raise 'unknown environment' if ![:production, :staging].include?(environment)
52
+ def find_cli_type(home_dir)
53
+ dir_names = home_dir.split('/')
54
+ types = {
55
+ directory_of_internals: false,
56
+ single_internal: false,
57
+ directory_of_apps: false,
58
+ single_app: false
59
+ }
60
+
61
+ types[:single_app] = true if File.exists?("#{home_dir}/config.json") and File.exists?("#{home_dir}/../.fanforce-app-factory")
62
+ types[:directory_of_apps] = true if File.exists?("#{home_dir}/.fanforce-app-factory")
63
+
64
+ if [dir_names[-1],dir_names[-2]].include?('Fanforce') && !File.exists?("#{home_dir}/.git") && !File.exists?("#{home_dir}/.fanforce-app-factory")
65
+ types[:directory_of_internals] = true
66
+ end
67
+
68
+ if [dir_names[-1],dir_names[-2],dir_names[-2]].include?('Fanforce') and File.exists?("#{home_dir}/.git") and !File.exists?("#{home_dir}/../.fanforce-app-factory")
69
+ types[:single_internal] = true
70
+ end
71
+
72
+ found_types = types.inject([]) {|found_types, (key,bool)| bool ? found_types << key : found_types }
73
+
74
+ if found_types.size != 1
75
+ divider '+-'
76
+ (found_types.size == 0) ? log('COULD NOT DEDUCE CLI TYPE') : log("CONFLICTING CLI TYPES: #{found_types.to_s}")
77
+ divider '+-'
78
+ exit
79
+ end
59
80
 
60
- heroku_app_name = "#{env(environment)}-#{app.dir_name}"
61
- heroku_app_name.length > 30 ? heroku_app_name.gsub!(/(a|e|i|o|u)/, '') : heroku_app_name
81
+ return found_types.first
62
82
  end
63
83
 
64
84
  end
65
85
 
66
86
  class String
67
87
  def format(*args)
68
- Fanforce::CLI::Utils.format(self, *args)
88
+ Fanforce::CLI::Utils.fmt(self, *args)
69
89
  end
70
90
  end
@@ -1,5 +1,5 @@
1
1
  class Fanforce
2
2
  class CLI
3
- VERSION = '1.7.1'
3
+ VERSION = '2.0.0.rc1'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,57 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fanforce-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.1
4
+ version: 2.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Caleb Clark
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-13 00:00:00.000000000 Z
11
+ date: 2014-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: redis
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '>='
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - '>='
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: rest-client
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>='
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: iron_worker_ng
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '>='
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
13
  - !ruby/object:Gem::Dependency
56
14
  name: activesupport
57
15
  requirement: !ruby/object:Gem::Requirement
@@ -67,81 +25,24 @@ dependencies:
67
25
  - !ruby/object:Gem::Version
68
26
  version: '0'
69
27
  - !ruby/object:Gem::Dependency
70
- name: heroku-api
28
+ name: fanforce-base
71
29
  requirement: !ruby/object:Gem::Requirement
72
30
  requirements:
73
- - - '='
31
+ - - ~>
74
32
  - !ruby/object:Gem::Version
75
- version: 0.3.8
33
+ version: '1.2'
76
34
  type: :runtime
77
35
  prerelease: false
78
36
  version_requirements: !ruby/object:Gem::Requirement
79
37
  requirements:
80
- - - '='
38
+ - - ~>
81
39
  - !ruby/object:Gem::Version
82
- version: 0.3.8
83
- - !ruby/object:Gem::Dependency
84
- name: multi_json
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - '>='
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - '>='
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: bitbucket_rest_api
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - '>='
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :runtime
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: fanforce
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :runtime
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '>='
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: fanforce-api
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - '>='
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :runtime
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - '>='
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- description: CLI for managing a folder of Fanforce apps
40
+ version: '1.2'
41
+ description:
140
42
  email:
141
43
  - cclark@mobilizationlabs.com
142
44
  executables:
143
45
  - fanforce
144
- - fanforce-supercharge
145
46
  extensions: []
146
47
  extra_rdoc_files: []
147
48
  files:
@@ -153,21 +54,15 @@ files:
153
54
  - README.md
154
55
  - Rakefile
155
56
  - bin/fanforce
156
- - bin/fanforce-supercharge
157
57
  - fanforce-cli.gemspec
158
58
  - lib/fanforce/cli.rb
159
- - lib/fanforce/cli/_base.rb
59
+ - lib/fanforce/cli/_load.rb
160
60
  - lib/fanforce/cli/app.rb
161
61
  - lib/fanforce/cli/apps.rb
162
- - lib/fanforce/cli/commands.rb
163
- - lib/fanforce/cli/commands_support.rb
164
- - lib/fanforce/cli/env.rb
165
- - lib/fanforce/cli/files.rb
166
- - lib/fanforce/cli/help.rb
167
- - lib/fanforce/cli/run.rb
62
+ - lib/fanforce/cli/scripts/version.rb
168
63
  - lib/fanforce/cli/utils.rb
169
64
  - lib/fanforce/cli/version.rb
170
- homepage: ''
65
+ homepage: http://github.com/fanforce/gem-fanforce-cli
171
66
  licenses: []
172
67
  metadata: {}
173
68
  post_install_message:
@@ -181,13 +76,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
181
76
  version: '0'
182
77
  required_rubygems_version: !ruby/object:Gem::Requirement
183
78
  requirements:
184
- - - '>='
79
+ - - '>'
185
80
  - !ruby/object:Gem::Version
186
- version: '0'
81
+ version: 1.3.1
187
82
  requirements: []
188
83
  rubyforge_project:
189
84
  rubygems_version: 2.0.14
190
85
  signing_key:
191
86
  specification_version: 4
192
- summary: Manage a folder of Fanforce apps
87
+ summary: command-line interface for fanforce developers
193
88
  test_files: []
89
+ has_rdoc:
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'fanforce/cli'
3
-
4
- Fanforce::CLI.new('fanforce-supercharge').start(
5
- :runtype => :forked,
6
- :allowed => [:update, :push, :restart, :bundle, :git, :iron, :version, :config, :cleanorgs],
7
- )
@@ -1,263 +0,0 @@
1
- require 'iron_worker_ng'
2
- require 'fanforce/cli'
3
-
4
- class Fanforce::CLI
5
- require 'fanforce/cli/utils'
6
- require 'fanforce/cli/files'
7
- require 'fanforce/cli/app'
8
- require 'fanforce/cli/apps'
9
- require 'fanforce/cli/run'
10
- require 'fanforce/cli/env'
11
- require 'fanforce/cli/help'
12
- require 'fanforce/cli/commands'
13
- include Fanforce::CLI::Utils
14
-
15
- def initialize(executable)
16
- @executable = executable
17
- $HomeDir = Shell.new.pwd
18
- end
19
-
20
- def start(options)
21
- @runtype = options[:runtype]
22
- @allowed_commands = options[:allowed]
23
- setup_config
24
- init_counter(Process.pid) if @runtype == :forked
25
- parse_app_filter
26
- parse_command
27
- destroy_counter(Process.pid) if @runtype == :forked
28
- end
29
-
30
- def setup_config
31
- puts 'ERROR: Fanforce CLI could not find the required config file.'.format(:red) if !File.exists?("#{$HomeDir}/.fanforce-cli")
32
- $Config = format_config(YAML.load_file("#{$HomeDir}/.fanforce-cli"))
33
- end
34
-
35
- def parse_app_filter
36
- if ARGV[0] =~ /^:((app)-(.+))$/
37
- $Filter = {dir_name: $1}
38
- ARGV.shift
39
- end
40
- end
41
-
42
- #################################################################################
43
-
44
- def parse_command
45
-
46
- #################################################################
47
-
48
- if ARGV.length == 0 or !@allowed_commands.include?(ARGV[0].to_sym)
49
- puts Fanforce::CLI::Help.intro(@executable, @runtype)
50
- puts Fanforce::CLI::Help.commands(@allowed_commands)
51
-
52
- #################################################################
53
-
54
- elsif ARGV[0] == 'list'
55
- list_apps
56
-
57
- #################################################################
58
-
59
- elsif ARGV[0] == 'create'
60
- ARGV[1] =~ /^app-([a-z0-9-]+)$/i || error('You supplied an invalid create command.', :create)
61
- create_app($1)
62
-
63
- #################################################################
64
-
65
- elsif ARGV[0] == 'update'
66
- ARGV[1] =~ /^(all|files|bundle|pow|get|env)$/i || error('You supplied an invalid update command.', :update)
67
- run(:update, $1.to_sym)
68
-
69
- #################################################################
70
-
71
- elsif ARGV[0] == 'delete'
72
- ARGV[1] =~ /^app-([a-z0-9-]+)$/ || error('You supplied an invalid delete command.', :delete)
73
- confirm("Are you sure you want to delete all files, repositories, and other items for #{ARGV[1]}?")
74
- delete_app($1)
75
-
76
- #################################################################
77
-
78
- elsif ARGV[0] == 'push'
79
- ARGV[1] =~ /^(all|development|staging|production)$/i || error('You supplied an invalid push command.', :push)
80
- environment = $1.to_sym
81
-
82
- ARGV[2] =~ /^(all|heroku|iron|bitbucket)$/i || error('You supplied an invalid push command.', :push)
83
- command = $1.to_sym
84
-
85
- confirm('Are you sure you want to push to all environments, including production?') if environment == :all
86
- confirm('Are you sure you want to push to production?') if environment == :production
87
- confirm("Are you sure you want to push to all services on #{environment}?") if command == :all
88
-
89
- run(:push, environment, command)
90
-
91
- #################################################################
92
-
93
- elsif ARGV[0] == 'restart'
94
- if ARGV[1].present?
95
- ARGV[1] =~ /^(development|staging|production|all)?$/ || error('You supplied an invalid restart command.', :restart)
96
- environment = $1.to_sym
97
- else
98
- environment = :development
99
- end
100
-
101
- confirm('Are you sure you want to restart all environments?') if environment == :all
102
- run(:restart, environment)
103
-
104
- #################################################################
105
-
106
- elsif ARGV[0] == 'count'
107
- count
108
-
109
- #################################################################
110
-
111
- elsif ARGV[0] == 'bundle'
112
- ARGV[1] =~ /^(install|update)$/ || error('You supplied an invalid bundle command.', :bundle)
113
-
114
- run(:bundle, $1.to_sym, ARGV[3..-1] || [])
115
-
116
- #################################################################
117
-
118
- elsif ARGV[0] == 'git' and ARGV[1] == 'status:overview'
119
- run(:git_overview)
120
-
121
- elsif ARGV[0] == 'git'
122
- run(:git, ARGV[1..-1] || [])
123
-
124
- #################################################################
125
-
126
- elsif ARGV[0] == 'iron'
127
- ARGV[1] =~ /^(upload|reset|delete)$/i || error('You supplied an invalid iron command.', :iron)
128
- command = $1.to_sym
129
-
130
- ARGV[2] =~ /^(all|development|staging|production)$/i || error('You supplied an invalid iron environment.', :iron)
131
- environment = $1.to_sym
132
- confirm("Are you sure you want to #{command} workers in all environments?") if environment == :all
133
-
134
- if command == :delete
135
- delete_all_iron_workers(environment)
136
- else
137
- run(:iron, command, environment)
138
- end
139
-
140
- #################################################################
141
-
142
- elsif ARGV[0] == 'cleanorgs'
143
- ARGV[1] =~ /^(development|staging|production)$/ || error('You supplied an invalid cleanorgs command.', :cleanorgs)
144
- environment = $1.to_sym
145
-
146
- supercore_api_key = ARGV[2] || error('You supplied an invalid cleanorgs command.', :cleanorgs)
147
-
148
- run(:cleanorgs, environment, supercore_api_key)
149
-
150
- #################################################################
151
-
152
- elsif ARGV[0] == 'version'
153
- puts '---------------------------------------------------------------------------------------------------------------'
154
- puts "You are using version #{Fanforce::CLI::VERSION} of Fanforce CLI"
155
- puts '---------------------------------------------------------------------------------------------------------------'
156
-
157
- elsif ARGV[0] == 'config'
158
- puts '---------------------------------------------------------------------------------------------------------------'
159
- if !File.exists?("#{$HomeDir}/.fanforce-cli")
160
- puts 'Oops'.format(:red,:bold) + '... no ".fanforce-cli" file was found in this directory.'.format(:red)
161
- else
162
- puts $Config
163
- end
164
- puts '---------------------------------------------------------------------------------------------------------------'
165
-
166
- elsif ARGV[0] == 'upgrade'
167
- run(:upgrade)
168
-
169
- end
170
-
171
- end
172
-
173
- #################################################################################
174
-
175
- def run(method, *args)
176
- (@runtype == :forked) ? run_forked(method, *args) : run_multiple(method, *args)
177
- end
178
-
179
- def run_multiple(method, *args)
180
- if (dirs = Apps.dirs).size == 0
181
- puts "\n---------------------------------------------------------------------------------------------------------------"
182
- puts "#{'Oops'.format(:bold)}... no fanforce apps were found in this directory."
183
- puts "---------------------------------------------------------------------------------------------------------------\n"
184
- return
185
- end
186
-
187
- if self.respond_to?(:"preprocess_#{method}")
188
- args << self.method(:"preprocess_#{method}").call
189
- end
190
- Apps.each do |app, processed_count, total_count|
191
- self.method(:"run_#{method}").call(app.dir, processed_count, total_count, *args)
192
- end
193
- if self.respond_to?(:"postprocess_#{method}")
194
- self.method(:"postprocess_#{method}").call
195
- else
196
- puts "\n---------------------------------------------------------------------------------------------------------------"
197
- puts 'DONE!'
198
- puts '---------------------------------------------------------------------------------------------------------------'
199
- end
200
- end
201
-
202
- def run_forked(method, *args)
203
- counter_id = Process.pid
204
- processes = []
205
- dirs = Apps.dirs
206
- puts "\n---------------------------------------------------------------------------------------------------------------"
207
- dirs.each_with_index do |app_dir, i|
208
- puts "#{'Forking'.format(:white,:bold)} #{app_dir}"
209
- end
210
- dirs.each_with_index do |app_dir, i|
211
- processes << fork do
212
- response = capture_stdout do
213
- self.method(:"run_#{method}").call(app_dir, 'PROCESSED_APPS_COUNT', dirs.size, *args)
214
- end
215
- puts response.gsub('PROCESSED_APPS_COUNT', incr_counter(counter_id).to_s)
216
- end
217
- sleep(0.25)
218
- end
219
-
220
- processes.each { |pid| Process.waitpid(pid) }
221
- puts "\n---------------------------------------------------------------------------------------------------------------"
222
- puts 'DONE!'
223
- puts '---------------------------------------------------------------------------------------------------------------'
224
- end
225
-
226
- require 'stringio'
227
- def capture_stdout
228
- previous_stdout, previous_stderr = $stdout, $stderr
229
- io = StringIO.new
230
- $stdout = io
231
- $stderr = io
232
- IronCore::Logger.logger = ::Logger.new(io)
233
- IronCore::Logger.logger.level = ::Logger::INFO
234
- yield
235
- io.string
236
- ensure
237
- $stdout = previous_stdout
238
- $stderr = previous_stderr
239
- end
240
-
241
- def init_counter(counter_id)
242
- File.open("#{$HomeDir}/.forked-counter-#{counter_id}", 'w') {|f| f.write('0') }
243
- end
244
-
245
- def incr_counter(counter_id)
246
- new_count = nil
247
- File.open("#{$HomeDir}/.forked-counter-#{counter_id}", File::RDWR|File::CREAT, 0644) do |f|
248
- f.flock(File::LOCK_EX)
249
- new_count = f.read.to_i + 1
250
- f.rewind
251
- f.write("#{new_count}\n")
252
- f.flush
253
- f.truncate(f.pos)
254
- end
255
- new_count
256
- end
257
-
258
- def destroy_counter(counter_id)
259
- File.delete("#{$HomeDir}/.forked-counter-#{counter_id}")
260
- end
261
-
262
- end
263
-