fanforce-cli 1.7.1 → 2.0.0.rc1

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.
@@ -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
-