brightpearl-cli 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/bin/bp +1 -1
- data/bin/brightpearl +1 -1
- data/lib/brightpearl_cli.rb +161 -168
- data/lib/core/api.rb +1 -1
- data/lib/core/config.rb +10 -133
- data/lib/core/config_unique.rb +113 -0
- data/lib/core/encrypter.rb +6 -6
- data/lib/core/enums.rb +1 -1
- data/lib/core/git.rb +123 -108
- data/lib/core/git_delete.rb +89 -0
- data/lib/core/jira.rb +2 -2
- data/lib/core/mysql.rb +14 -14
- data/lib/core/pom.rb +129 -0
- data/lib/core/terminal.rb +28 -8
- data/lib/core/tools.rb +6 -6
- data/lib/core/utils_files.rb +92 -0
- data/lib/core/utils_routes.rb +25 -0
- data/lib/core/utils_strings.rb +45 -0
- data/lib/core/validate.rb +1 -1
- data/lib/routes/build.rb +16 -17
- data/lib/routes/dummy_order.rb +5 -5
- data/lib/routes/fix.rb +49 -0
- data/lib/routes/git_branch.rb +6 -6
- data/lib/routes/git_checkout.rb +42 -33
- data/lib/routes/git_delete.rb +8 -62
- data/lib/routes/git_merge.rb +198 -111
- data/lib/routes/git_pull.rb +11 -11
- data/lib/routes/git_push.rb +21 -12
- data/lib/routes/git_stash.rb +13 -8
- data/lib/routes/git_update.rb +17 -22
- data/lib/routes/jira.rb +3 -3
- data/lib/routes/production_logs.rb +12 -12
- data/lib/routes/reset.rb +1 -1
- data/lib/routes/review.rb +6 -5
- data/lib/routes/scripts_api_docs.rb +5 -5
- data/lib/routes/scripts_branch_cleaner.rb +58 -79
- data/lib/routes/scripts_color.rb +1 -1
- data/lib/routes/scripts_pom_fixer.rb +5 -62
- data/lib/routes/scripts_sonar.rb +82 -0
- data/lib/routes/setup.rb +6 -6
- data/lib/routes/tail.rb +5 -5
- data/lib/routes/test.rb +3 -3
- data/lib/routes/update.rb +1 -1
- metadata +16 -9
- data/lib/routes/scripts_code_sniffer.rb +0 -36
data/lib/core/mysql.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'mysql'
|
2
2
|
|
3
|
-
module
|
3
|
+
module App
|
4
4
|
|
5
5
|
class MySQL
|
6
6
|
|
7
7
|
DEFAULT_VM_SCHEMA = 'app'
|
8
8
|
DEFAULT_EC2_SCHEMA = 'brightpearl'
|
9
9
|
|
10
|
-
@vm_connection =
|
10
|
+
@vm_connection = {}
|
11
11
|
@ec2_connection = nil
|
12
12
|
|
13
13
|
@ids_customers = []
|
@@ -15,15 +15,15 @@ module Brightpearl
|
|
15
15
|
|
16
16
|
def self.vm(schema = DEFAULT_VM_SCHEMA)
|
17
17
|
|
18
|
-
if @vm_connection.nil?
|
19
|
-
@vm_connection = Mysql.new(
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
if @vm_connection[schema].nil?
|
19
|
+
@vm_connection[schema] = Mysql.new(
|
20
|
+
App::Config.param(App::Config::VM_IP),
|
21
|
+
App::Config.param(App::Config::VM_MYSQL_USER),
|
22
|
+
App::Config.param(App::Config::VM_MYSQL_PASSWORD),
|
23
23
|
schema
|
24
24
|
)
|
25
25
|
end
|
26
|
-
@vm_connection
|
26
|
+
@vm_connection[schema]
|
27
27
|
|
28
28
|
end
|
29
29
|
|
@@ -32,11 +32,11 @@ module Brightpearl
|
|
32
32
|
if @ec2_connection.nil?
|
33
33
|
|
34
34
|
encrypter = Encrypter.new
|
35
|
-
host =
|
36
|
-
user =
|
37
|
-
pass =
|
35
|
+
host = App::Config.param(App::Config::EC2_HOST)
|
36
|
+
user = App::Config.param(App::Config::EC2_USER)
|
37
|
+
pass = App::Config.param(App::Config::EC2_PASS)
|
38
38
|
if host.nil? || user.nil? || pass.nil? || host == '' || user == '' || pass == ''
|
39
|
-
|
39
|
+
App::Terminal::error('EC2 access data not found', ["The command you're trying to run requires access to an EC2 database.", "In order for this to work you will need valid #{App::Terminal::format_highlight('access data')}.", "Please speak to #{App::Terminal::format_highlight('Albert')} (or team Raptor) for more info."], true)
|
40
40
|
end
|
41
41
|
@ec2_connection = Mysql.new(
|
42
42
|
encrypter.decrypt(host),
|
@@ -51,7 +51,7 @@ module Brightpearl
|
|
51
51
|
|
52
52
|
def self.get_random_customer_id
|
53
53
|
unless @ids_customers.any?
|
54
|
-
customers =
|
54
|
+
customers = App::MySQL::vm.query('SELECT customers_id FROM customers ORDER BY customers_id DESC LIMIT 100')
|
55
55
|
customers.each_hash do |row|
|
56
56
|
@ids_customers << row['customers_id']
|
57
57
|
end
|
@@ -61,7 +61,7 @@ module Brightpearl
|
|
61
61
|
|
62
62
|
def self.get_random_shipping_id
|
63
63
|
unless @ids_shipping.any?
|
64
|
-
ship_methods =
|
64
|
+
ship_methods = App::MySQL::vm.query('SELECT ship_method_id FROM ship_methods ORDER BY ship_method_id DESC LIMIT 100')
|
65
65
|
ship_methods.each_hash do |row|
|
66
66
|
@ids_shipping << row['ship_method_id']
|
67
67
|
end
|
data/lib/core/pom.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
module App
|
2
|
+
|
3
|
+
class Pom
|
4
|
+
|
5
|
+
# Initialise credentials
|
6
|
+
# @return void
|
7
|
+
def initialize
|
8
|
+
end
|
9
|
+
|
10
|
+
# Retrieves list of pom.xml files which need to be un-snapshotted
|
11
|
+
# @return Array
|
12
|
+
def self.get_files_to_change
|
13
|
+
|
14
|
+
command = "find #{ App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE)} -name 'pom.xml'"
|
15
|
+
files = App::Terminal::command_capture(command)
|
16
|
+
files = files[0].split("\n")
|
17
|
+
|
18
|
+
unless files.any?
|
19
|
+
App::Terminal::error('No files found', ["The command: #{App::Terminal::format_command(command)} didn't return any files.", 'It might be possible that the directory structure of our codebase has changed and this script needs to be updated.', nil, "Speak to #{App::Terminal::format_highlight('Albert')}."], true)
|
20
|
+
end
|
21
|
+
|
22
|
+
blank_line_inserted = false
|
23
|
+
|
24
|
+
files_to_change = []
|
25
|
+
files.each do |filename|
|
26
|
+
file_lines = File.open(filename, 'rb').read
|
27
|
+
file_lines.split("\n").each do |line|
|
28
|
+
if line.match(/<version>\d+\.\d+\.\d+-(.*)-(snapshot)<\/version>/i)
|
29
|
+
|
30
|
+
unless blank_line_inserted
|
31
|
+
puts
|
32
|
+
blank_line_inserted = true
|
33
|
+
end
|
34
|
+
|
35
|
+
puts " \x1B[38;5;240mMatched line:\x1B[0m \x1B[38;5;11m#{line.strip}\x1B[0m"
|
36
|
+
files_to_change << filename
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
files_to_change
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.unsnapshot_files(files_to_change, current_branch_code_repo, add_branch_tag = true)
|
47
|
+
|
48
|
+
unless files_to_change.any?
|
49
|
+
App::Terminal::info('No feature-tagged POMs found', 'Nothing to un-snapshot.')
|
50
|
+
return
|
51
|
+
end
|
52
|
+
|
53
|
+
unless App::Terminal::prompt_yes_no('Un-snapshot POMs', generate_confirmation_text(files_to_change))
|
54
|
+
App::Terminal::abort(nil, nil, true, false)
|
55
|
+
end
|
56
|
+
|
57
|
+
files_to_change.each do |filename|
|
58
|
+
App::Terminal::output("Un-snapshotting: #{App::Terminal::format_directory(filename)}")
|
59
|
+
if current_branch_code_repo == App::Git::MASTER || add_branch_tag == false
|
60
|
+
new_snapshot_tag = '-SNAPSHOT'
|
61
|
+
else
|
62
|
+
new_snapshot_tag = "-#{current_branch_code_repo}-SNAPSHOT"
|
63
|
+
end
|
64
|
+
contents = File.read(filename)
|
65
|
+
contents_new = contents.gsub(/-(.*)-SNAPSHOT/, new_snapshot_tag)
|
66
|
+
File.open(filename, 'w') { |file| file.puts contents_new }
|
67
|
+
end
|
68
|
+
|
69
|
+
diff_result = App::Terminal::command_capture('git diff | grep "+ \|- "', App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE))
|
70
|
+
puts
|
71
|
+
diff_result[0].split("\n").each do |line|
|
72
|
+
if line[0] == '+'
|
73
|
+
puts " \x1B[38;5;46m#{line.gsub(' ', '')}\x1B[0m"
|
74
|
+
else
|
75
|
+
puts " \x1B[38;5;196m#{line.gsub(' ', '')}\x1B[0m"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
puts
|
79
|
+
|
80
|
+
App::Terminal::command(['git add .', 'git status'], App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE))
|
81
|
+
|
82
|
+
# Figure out the commit message.
|
83
|
+
git = App::Git.new
|
84
|
+
current_branch_name = git.current_branch_for_repo(App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE))
|
85
|
+
if current_branch_name =~ /\A(bp|bug)-\d{4,5}\z/i
|
86
|
+
jira_number = current_branch_name.gsub(/\D/, '')
|
87
|
+
else
|
88
|
+
jira_number = '0000'
|
89
|
+
end
|
90
|
+
commit_message = "BP-#{jira_number} Updated POM tags on #{current_branch_code_repo}."
|
91
|
+
|
92
|
+
unless current_branch_code_repo == App::Git::MASTER
|
93
|
+
|
94
|
+
if App::Terminal::prompt_yes_no('Commit to GIT', ["This will commit your changes to GIT with message: #{App::Terminal::format_highlight(commit_message)}"])
|
95
|
+
App::Terminal::command(["git commit -m '#{commit_message.gsub("'", "\\'")}'"], App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE))
|
96
|
+
else
|
97
|
+
App::Terminal::info('Un-snapshotting complete', "Please note that your changes #{App::Terminal::format_highlight('HAVE NOT')} been #{App::Terminal::format_action('committed')} to Git.", false)
|
98
|
+
return
|
99
|
+
end
|
100
|
+
|
101
|
+
if App::Terminal::prompt_yes_no('Push changes to origin')
|
102
|
+
App::Terminal::command('git push', App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE))
|
103
|
+
App::Terminal::info('Un-snapshotting complete', "Your POMs have been un-snapshotted, the changes #{App::Terminal::format_action('committed')} to Git and #{App::Terminal::format_action('pushed')} to origin.")
|
104
|
+
else
|
105
|
+
App::Terminal::info('Un-snapshotting complete', ["Your POMs have been un-snapshotted and the changes #{App::Terminal::format_action('committed')} to Git.", 'However, nothing has been pushed to origin. You will need to do this manually.'], false)
|
106
|
+
end
|
107
|
+
else
|
108
|
+
App::Terminal::info('Un-snapshotting complete', ["Your POMs have been un-snapshotted. However, nothing has been committed to Git or pushed to origin because you are on #{App::Git::MASTER}.", 'You will need to do this manually.'], false)
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
def self.generate_confirmation_text(files_to_change)
|
116
|
+
|
117
|
+
confirmation_text = ['The following files will have their branch tags removed:', nil]
|
118
|
+
files_to_change.each do |file_name|
|
119
|
+
unless file_name == ''
|
120
|
+
confirmation_text << App::Terminal::format_directory(file_name)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
confirmation_text
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
data/lib/core/terminal.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'highline/import'
|
2
2
|
require 'columnist'
|
3
3
|
|
4
|
-
module
|
4
|
+
module App
|
5
5
|
|
6
6
|
class Terminal
|
7
7
|
|
@@ -12,6 +12,8 @@ module Brightpearl
|
|
12
12
|
MSG_ERROR = 'error'
|
13
13
|
MSG_TODO = 'todo'
|
14
14
|
MSG_AUTOMATIC = 'automatic'
|
15
|
+
MSG_GENERATED = 'generated'
|
16
|
+
MSG_PROCESSED = 'processed'
|
15
17
|
|
16
18
|
# Runs a series of commands in the terminal.
|
17
19
|
# @return void
|
@@ -20,18 +22,18 @@ module Brightpearl
|
|
20
22
|
commands = [commands]
|
21
23
|
end
|
22
24
|
unless location.nil?
|
23
|
-
unless File.directory?(location)
|
25
|
+
unless File.directory?(File.expand_path(location))
|
24
26
|
error('Directory not found.', "Cannot find the following directory: \x1B[38;5;205m#{location}\x1B[0m", true)
|
25
27
|
end
|
26
28
|
end
|
27
29
|
output = []
|
28
30
|
if verbose_cd && verbose && commands.any? && !location.nil?
|
29
|
-
puts "\x1B[42m Executing \x1B[0m \x1B[0m\xe2\x86\x92\x1B[0m #{
|
31
|
+
puts "\x1B[42m Executing \x1B[0m \x1B[0m\xe2\x86\x92\x1B[0m #{App::Terminal::format_command("cd #{location}")}"
|
30
32
|
end
|
31
33
|
if commands.any?
|
32
34
|
commands.each do |command|
|
33
35
|
if verbose
|
34
|
-
puts "\x1B[42m Executing \x1B[0m \x1B[0m\xe2\x86\x92\x1B[0m #{
|
36
|
+
puts "\x1B[42m Executing \x1B[0m \x1B[0m\xe2\x86\x92\x1B[0m #{App::Terminal::format_command("#{command}")}"
|
35
37
|
end
|
36
38
|
if location.nil?
|
37
39
|
if capture_real_output
|
@@ -74,6 +76,10 @@ module Brightpearl
|
|
74
76
|
puts "\x1B[48;5;199m @TODO \x1B[0m \x1B[0m\xe2\x86\x92\x1B[0m \x1B[0m#{message}\x1B[0m"
|
75
77
|
when MSG_AUTOMATIC
|
76
78
|
puts "\x1B[48;5;96m Automatic \x1B[0m \x1B[0m\xe2\x86\x92\x1B[0m \x1B[0m#{message}\x1B[0m"
|
79
|
+
when MSG_GENERATED
|
80
|
+
puts "\x1B[48;5;96m Generated \x1B[0m \x1B[0m\xe2\x86\x92\x1B[0m \x1B[0m#{message}\x1B[0m"
|
81
|
+
when MSG_PROCESSED
|
82
|
+
puts "\x1B[48;5;238m Processed \x1B[0m \x1B[0m\xe2\x86\x92\x1B[0m \x1B[0m#{message}\x1B[0m"
|
77
83
|
else
|
78
84
|
puts "'#{type}' is not a valid Terminal::output() type."
|
79
85
|
exit
|
@@ -89,7 +95,7 @@ module Brightpearl
|
|
89
95
|
if message.nil?
|
90
96
|
message = "You have chosen to \x1B[38;5;9mABORT\x1B[38;5;240m the script."
|
91
97
|
end
|
92
|
-
|
98
|
+
App::Terminal::error(title, message, exit_script, preceding_blank_line, 'ABORT')
|
93
99
|
end
|
94
100
|
|
95
101
|
# Displays error and exits script by default.
|
@@ -174,7 +180,21 @@ module Brightpearl
|
|
174
180
|
# Returns flag name in consistent, uniform manner.
|
175
181
|
# @return String
|
176
182
|
def self.format_flag(flag_letter, display_flag_text = true)
|
177
|
-
|
183
|
+
letter_array = []
|
184
|
+
if flag_letter.is_a? String
|
185
|
+
letter_array = Array[flag_letter]
|
186
|
+
elsif flag_letter.is_a? Array
|
187
|
+
letter_array = flag_letter
|
188
|
+
else
|
189
|
+
App::Terminal::error('Terminal::format_flag expects either String or Array.', nil, true)
|
190
|
+
end
|
191
|
+
flag_txt = ''
|
192
|
+
letter_array.each do |letter|
|
193
|
+
flag_txt = "#{flag_txt}, -#{letter}"
|
194
|
+
end
|
195
|
+
xtra_txt = letter_array.length > 1 ? ' flags' : ' flag'
|
196
|
+
flag_txt = flag_txt[2..-1]
|
197
|
+
"\x1B[38;5;152m#{flag_txt}#{display_flag_text ? xtra_txt : ''}\x1B[0m"
|
178
198
|
end
|
179
199
|
|
180
200
|
# Returns action text in consistent, uniform manner.
|
@@ -229,9 +249,9 @@ module Brightpearl
|
|
229
249
|
puts "\n"
|
230
250
|
return false
|
231
251
|
when 'a'
|
232
|
-
|
252
|
+
App::Terminal::error('Abandon ship!', ["You have chosen to \x1B[38;5;9mABORT\x1B[38;5;240m the script.", nil, 'Please note that whenever you do this, any scripted tasks which were running', 'will have been interrupted mid-script. This may (or may not) cause problems.'], true)
|
233
253
|
when 'x'
|
234
|
-
|
254
|
+
App::Terminal::error('Abandon ship!', ["You have chosen to \x1B[38;5;9mABORT\x1B[38;5;240m the script.", nil, 'Please note that whenever you do this, any scripted tasks which were running', 'will have been interrupted mid-script. This may (or may not) cause problems.'], true)
|
235
255
|
else
|
236
256
|
end
|
237
257
|
end
|
data/lib/core/tools.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'open-uri'
|
2
2
|
|
3
|
-
module
|
3
|
+
module App
|
4
4
|
|
5
5
|
class Tools
|
6
6
|
|
@@ -10,20 +10,20 @@ module Brightpearl
|
|
10
10
|
# @return void
|
11
11
|
def self.verify_internet_access
|
12
12
|
if ping('www.google.com') != 0
|
13
|
-
|
13
|
+
App::Terminal::error('You are not connected to the internet', 'Please check your connection and try and again.')
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.verify_vm_is_reachable
|
18
|
-
if ping(
|
19
|
-
|
18
|
+
if ping(App::Config.param(App::Config::VM_IP)) != 0
|
19
|
+
App::Terminal::error('Cannot reach VM', ["The remote host #{App::Terminal::format_highlight(App::Config.param(App::Config::VM_IP))} cannot be reached.", 'Please make sure your VM is online and correctly configured.'])
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
# Ping a URL or IP and returns the exit status. 0 = success, anything else means it failed.
|
24
24
|
# @return Integer
|
25
25
|
def self.ping(ip_or_url, verbose = true)
|
26
|
-
|
26
|
+
App::Terminal::output("Checking that #{App::Terminal::format_highlight(ip_or_url)} is reachable") if verbose == true
|
27
27
|
`ping -t 1 -c 1 #{ip_or_url}`
|
28
28
|
$?.exitstatus
|
29
29
|
end
|
@@ -80,7 +80,7 @@ module Brightpearl
|
|
80
80
|
# Returns TRUE if Mac, FALSE if Linux (or anything else for that matter)
|
81
81
|
# @return boolean
|
82
82
|
def self.this_is_a_mac
|
83
|
-
return
|
83
|
+
return App::Config.param(App::Config::WORKSTATION_OS) == App::Config::MAC
|
84
84
|
end
|
85
85
|
|
86
86
|
private
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'parseconfig'
|
3
|
+
|
4
|
+
module App
|
5
|
+
|
6
|
+
class UtilsFiles
|
7
|
+
|
8
|
+
def self.write_file(full_path_and_file, array_of_lines)
|
9
|
+
|
10
|
+
unless array_of_lines.is_a? Array
|
11
|
+
raise RuntimeError, "Expected an array of lines to write to file, instead got: #{array_of_lines.class}"
|
12
|
+
end
|
13
|
+
|
14
|
+
unless path_exists(File.dirname(full_path_and_file))
|
15
|
+
FileUtils::mkdir_p(File.dirname(full_path_and_file))
|
16
|
+
end
|
17
|
+
|
18
|
+
if file_exists(full_path_and_file)
|
19
|
+
File.delete(full_path_and_file)
|
20
|
+
end
|
21
|
+
|
22
|
+
begin
|
23
|
+
|
24
|
+
File.open(full_path_and_file, 'w') { |file|
|
25
|
+
|
26
|
+
array_of_lines.each_with_index do |line, index|
|
27
|
+
if index == array_of_lines.size - 1
|
28
|
+
file.write("#{line}")
|
29
|
+
else
|
30
|
+
file.write("#{line}\n")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
file.close
|
35
|
+
}
|
36
|
+
|
37
|
+
add_file_to_git(full_path_and_file)
|
38
|
+
|
39
|
+
rescue Exception => e
|
40
|
+
|
41
|
+
App::Terminal::error('Something went wrong', "#{e.message}", true)
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.read_file(full_path_and_file)
|
48
|
+
|
49
|
+
unless file_exists(full_path_and_file)
|
50
|
+
App::Terminal::error("The file doesn't exist: #{full_path_and_file}", nil, true)
|
51
|
+
end
|
52
|
+
|
53
|
+
file_content = []
|
54
|
+
file = File.open(full_path_and_file).read
|
55
|
+
file.gsub!(/\r\n?/, "\n")
|
56
|
+
file.each_line do |line|
|
57
|
+
file_content << line
|
58
|
+
end
|
59
|
+
file_content
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.path_exists(full_path)
|
64
|
+
File.directory?(File.expand_path(full_path))
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.file_exists(full_path_and_file)
|
68
|
+
File.exist?(full_path_and_file)
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.get_full_path(path)
|
72
|
+
"/#{App::UtilsStrings.remove_surrounding_slashes(File.expand_path(path))}"
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.get_files_in_dir(path, only_with_extension = nil)
|
76
|
+
path = "/#{App::UtilsStrings.remove_surrounding_slashes(File.expand_path(path))}"
|
77
|
+
unless path_exists(path)
|
78
|
+
raise RuntimeError, "Directory doesn't exist: #{path}"
|
79
|
+
end
|
80
|
+
files = Dir.glob("#{path}/**/*.#{only_with_extension.nil? ? '*' : only_with_extension}")
|
81
|
+
files
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.add_file_to_git(full_path_and_file)
|
85
|
+
|
86
|
+
App::Terminal::error('Must program add_file_to_git', "#{full_path_and_file}", true)
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module App
|
2
|
+
|
3
|
+
class UtilsRoutes
|
4
|
+
|
5
|
+
# Returns number of flags set for route (from @opts variable)
|
6
|
+
# @param Array (@opts)
|
7
|
+
# @return int
|
8
|
+
def self.flags_set(opts)
|
9
|
+
flags_set = 0
|
10
|
+
opts.each do |key, value|
|
11
|
+
# Only here to prevent code-inspector from complaining.
|
12
|
+
key.strip! if key.nil?
|
13
|
+
if value
|
14
|
+
flags_set = flags_set + 1
|
15
|
+
end
|
16
|
+
end
|
17
|
+
if flags_set > 0
|
18
|
+
flags_set = flags_set / 2
|
19
|
+
end
|
20
|
+
flags_set
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module App
|
2
|
+
|
3
|
+
class UtilsStrings
|
4
|
+
|
5
|
+
# Convert 'snake_case' or 'SnAKE_cAse' to 'SnakeCase'.
|
6
|
+
# @param String
|
7
|
+
# @return String
|
8
|
+
def self.snake_case_to_camel_case(string)
|
9
|
+
validate_string(string)
|
10
|
+
string.downcase!
|
11
|
+
return string if string !~ /_/ && string =~ /[A-Z]+.*/
|
12
|
+
string.split('_').map { |e| e.capitalize }.join
|
13
|
+
end
|
14
|
+
|
15
|
+
# Convert 'snake_case' or 'SnAKE_cAse' to 'snakeCase'.
|
16
|
+
# @param String
|
17
|
+
# @return String
|
18
|
+
def self.snake_case_to_camel_case_lower(string)
|
19
|
+
string = snake_case_to_camel_case(string)
|
20
|
+
"#{string[0, 1].downcase}#{string[1..-1]}"
|
21
|
+
end
|
22
|
+
|
23
|
+
# Remove preceding/trailing slashes from a string (and trim preceding/trailing whitespace).
|
24
|
+
# @param String - The string to be trimmed (and returned).
|
25
|
+
# @return String
|
26
|
+
def self.remove_surrounding_slashes(string)
|
27
|
+
string.strip!
|
28
|
+
validate_string(string)
|
29
|
+
string.gsub!(/\A\/+/, '')
|
30
|
+
string.gsub!(/\/+\z/, '')
|
31
|
+
string
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def self.validate_string(string)
|
37
|
+
if string.nil? || !string.is_a?(String)
|
38
|
+
raise RuntimeError, "Expected String, got: #{string.class}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/lib/core/validate.rb
CHANGED
data/lib/routes/build.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module AppCommand
|
2
2
|
|
3
3
|
class Build < ::Convoy::ActionCommand::Base
|
4
4
|
|
@@ -16,7 +16,7 @@ module BrightpearlCommand
|
|
16
16
|
def opts_validate
|
17
17
|
|
18
18
|
if @args[0].nil?
|
19
|
-
|
19
|
+
App::Terminal::error('Must specify service name', "The script cannot build your service because you haven't told it what service to build.", true)
|
20
20
|
end
|
21
21
|
|
22
22
|
# Set 'service only' to default.
|
@@ -32,7 +32,7 @@ module BrightpearlCommand
|
|
32
32
|
suffix = ''
|
33
33
|
end
|
34
34
|
|
35
|
-
service_dir =
|
35
|
+
service_dir = App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE)
|
36
36
|
dir_dev_support = "#{service_dir}/services/dev-support/#{@args[0]}#{suffix}"
|
37
37
|
dir_functional = "#{service_dir}/services/functional/#{@args[0]}#{suffix}"
|
38
38
|
dir_infrastructure = "#{service_dir}/services/infrastructure/#{@args[0]}#{suffix}"
|
@@ -56,7 +56,7 @@ module BrightpearlCommand
|
|
56
56
|
@is_lib = true
|
57
57
|
end
|
58
58
|
if @service_dir.nil?
|
59
|
-
|
59
|
+
App::Terminal::error('Cannot find service', "The script is unable to find a service called: \x1B[38;5;202m#{@args[0].downcase}\x1B[0m\nPlease check your spelling and try again.")
|
60
60
|
end
|
61
61
|
|
62
62
|
end
|
@@ -69,9 +69,9 @@ module BrightpearlCommand
|
|
69
69
|
|
70
70
|
def build_service
|
71
71
|
|
72
|
-
|
72
|
+
App::Tools::verify_vm_is_reachable if @is_lib == false
|
73
73
|
|
74
|
-
if
|
74
|
+
if App::Tools::this_is_a_mac
|
75
75
|
|
76
76
|
args = @args.dup
|
77
77
|
args.shift
|
@@ -81,7 +81,7 @@ module BrightpearlCommand
|
|
81
81
|
]
|
82
82
|
if @is_lib == false
|
83
83
|
|
84
|
-
output =
|
84
|
+
output = App::Terminal::command_capture(commands, @service_dir)
|
85
85
|
|
86
86
|
lines = output[0].chomp
|
87
87
|
lines = lines.split("\n")
|
@@ -106,37 +106,36 @@ module BrightpearlCommand
|
|
106
106
|
end
|
107
107
|
|
108
108
|
if build_failed
|
109
|
-
|
109
|
+
App::Terminal::error('Build failed', nil, false)
|
110
110
|
puts output[0]
|
111
111
|
puts
|
112
|
-
|
113
112
|
# If a build fail URL was found, launch it in default browser.
|
114
113
|
unless build_fail_url.nil?
|
115
|
-
if
|
114
|
+
if App::Terminal::prompt_yes_no("Would you like to #{App::Terminal::format_action('open a stack-trace')} in your default browser?", build_fail_url)
|
116
115
|
system("open -a Google\\ Chrome #{build_fail_url}")
|
117
116
|
end
|
118
117
|
end
|
119
|
-
|
120
118
|
exit
|
121
119
|
end
|
122
120
|
|
121
|
+
puts output
|
122
|
+
|
123
123
|
war_file_ws = war_file_ws.split('war: ')
|
124
124
|
war_file_ws = war_file_ws[1].chomp
|
125
125
|
|
126
126
|
war_file_vm = war_file_ws.split('/')
|
127
127
|
war_file_vm = war_file_vm[war_file_vm.length - 1]
|
128
128
|
|
129
|
-
|
130
129
|
commands = [
|
131
|
-
"scp #{war_file_ws} #{
|
132
|
-
"sshpass -p#{
|
130
|
+
"scp #{war_file_ws} #{App::Config.param(App::Config::VM_USER)}@#{App::Config.param(App::Config::VM_IP)}:/tmp",
|
131
|
+
"sshpass -p#{App::Config.param(App::Config::VM_USER_PASSWORD)} ssh #{App::Config.param(App::Config::VM_USER)}@#{App::Config.param(App::Config::VM_IP)} 'cd /brightpearl-source/dev-vm-control-scripts/scm && ~/generated-scripts/deploy-uploaded-service #{war_file_vm}'"
|
133
132
|
|
134
133
|
]
|
135
|
-
|
134
|
+
App::Terminal::command(commands)
|
136
135
|
|
137
136
|
else
|
138
137
|
|
139
|
-
|
138
|
+
App::Terminal::command(commands, @service_dir)
|
140
139
|
|
141
140
|
end
|
142
141
|
|
@@ -145,7 +144,7 @@ module BrightpearlCommand
|
|
145
144
|
commands = [
|
146
145
|
'mvn clean install -P deploy-service',
|
147
146
|
]
|
148
|
-
|
147
|
+
App::Terminal::command(commands, @service_dir)
|
149
148
|
|
150
149
|
end
|
151
150
|
|
data/lib/routes/dummy_order.rb
CHANGED
@@ -2,7 +2,7 @@ require 'rest_client'
|
|
2
2
|
require 'mysql'
|
3
3
|
require 'json'
|
4
4
|
|
5
|
-
module
|
5
|
+
module AppCommand
|
6
6
|
|
7
7
|
class DummyOrder < ::Convoy::ActionCommand::Base
|
8
8
|
|
@@ -14,7 +14,7 @@ module BrightpearlCommand
|
|
14
14
|
def execute
|
15
15
|
|
16
16
|
@opts = command_options
|
17
|
-
# @database =
|
17
|
+
# @database = App::MySQL::get_database_connection
|
18
18
|
opts_validate
|
19
19
|
opts_routing
|
20
20
|
|
@@ -86,14 +86,14 @@ module BrightpearlCommand
|
|
86
86
|
},
|
87
87
|
'delivery' => {
|
88
88
|
'deliveryDate' => '2014-10-19T11:12:24.000+01:00',
|
89
|
-
'shippingMethodId' =>
|
89
|
+
'shippingMethodId' => App::MySQL::get_random_shipping_id
|
90
90
|
},
|
91
91
|
'currency' => {
|
92
92
|
'orderCurrencyCode' => 'GBP'
|
93
93
|
},
|
94
94
|
'parties' => {
|
95
95
|
'customer' => {
|
96
|
-
'contactId' =>
|
96
|
+
'contactId' => App::MySQL::get_random_customer_id
|
97
97
|
}
|
98
98
|
},
|
99
99
|
'assignment' => {
|
@@ -112,7 +112,7 @@ module BrightpearlCommand
|
|
112
112
|
|
113
113
|
begin
|
114
114
|
response = RestClient.post(
|
115
|
-
"http://#{
|
115
|
+
"http://#{App::Config.param(App::Config::VM_IP)}:#{App::Enum::PORT_ORDER_SERVICE}/order-service/app/order",
|
116
116
|
post_data,
|
117
117
|
:content_type => :json, :accept => :json, :'account-version' => 'admindev', :'effective-user-id' => 6
|
118
118
|
)
|