brightpearl-cli 1.4.0 → 1.7.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.
@@ -0,0 +1,20 @@
1
+ <?php
2
+ /**
3
+ * Class to handle redirects, used to simulate behaviour of a redirect, as we want the code to stop executing but also need to continue the test
4
+ * @since 16/04/14
5
+ * @package UnitTests
6
+ * @subpackage TestHelpers
7
+ */
8
+
9
+ /**
10
+ * Class to handle redirects, used to simulate behaviour of a redirect, as we want the code to stop executing but also need to continue the test
11
+ * @since 16/04/14
12
+ * @package Lib
13
+ * @subpackage
14
+ */
15
+
16
+ class RedirectException
17
+ extends Exception
18
+ {
19
+
20
+ }
@@ -0,0 +1,27 @@
1
+ <?php
2
+ namespace testHelpers\Contacts;
3
+
4
+ use Lib_Model_Contact_Type;
5
+
6
+ /**
7
+ * Data provider for reserved contact ids for unit tests
8
+ *
9
+ * @since 20/01/2014
10
+ * @package UnitTests
11
+ * @subpackage TestHelpers
12
+ */
13
+ class ReservedContactIds
14
+ {
15
+ /**
16
+ * @return array of integer
17
+ */
18
+ public static function reservedContactIds()
19
+ {
20
+ return array(
21
+ array(Lib_Model_Contact_Type::DEFAULT_CHANNEL_BRAND_CONTACT_ID),
22
+ array(Lib_Model_Contact_Type::SUPER_ADMIN_CONTACT_ID),
23
+ array(Lib_Model_Contact_Type::ACCOUNTANT_CONTACT_ID),
24
+ array(Lib_Model_Contact_Type::PRIMARY_ADMIN_CONTACT_ID)
25
+ );
26
+ }
27
+ }
@@ -0,0 +1,30 @@
1
+ <?php
2
+ /**
3
+ * Test values for unit tests
4
+ *
5
+ * @since 31/01/2013
6
+ * @package UnitTests
7
+ * @subpackage TestHelpers
8
+ */
9
+ class TestHelpers_Values
10
+ {
11
+ /**
12
+ * Provider of a random single digit (0-9) integer
13
+ *
14
+ * @return array
15
+ */
16
+ public static function randomSingleDigitInteger()
17
+ {
18
+ return rand(0,9);
19
+ }
20
+
21
+ /**
22
+ * Provider of a random single digit (1-9) integer
23
+ *
24
+ * @return array
25
+ */
26
+ public static function randomSingleDigitIntegerNotZero()
27
+ {
28
+ return rand(1,9);
29
+ }
30
+ }
@@ -0,0 +1,85 @@
1
+ <?php
2
+
3
+ defined('ENVIRONMENT') || define('ENVIRONMENT', 'testing');
4
+ ini_set('memory_limit', '1024M');
5
+ ini_set('error_log', '/tmp/phpunit.error.log');
6
+
7
+ /** @todo Make this dynamic! **/
8
+ $scriptMount = '/Users/Albert/Repos/shared/brightpearl-static/';
9
+ if ($scriptMount === false) {
10
+ $scriptMount = '';
11
+ }
12
+
13
+ // Set application path (contextually consistent with library use within app)
14
+ if (!defined('APPLICATION_PATH')) {
15
+ define('APPLICATION_PATH', $scriptMount . '/php-public/admindev');
16
+ }
17
+
18
+ $libraryPath = $scriptMount . '/php-private';
19
+ $paths = array(
20
+ "{$libraryPath}/dev/lib-lib",
21
+ "{$libraryPath}/static",
22
+ "{$libraryPath}/static/ZendFramework-1.11.1",
23
+ "{$libraryPath}/static/SymfonyDi",
24
+ "{$libraryPath}/static/SymfonyYaml",
25
+ "{$libraryPath}/static/Spreadsheet",
26
+ "{$libraryPath}/static/Auth"
27
+ );
28
+
29
+ set_include_path(
30
+ implode($paths, PATH_SEPARATOR) . PATH_SEPARATOR . get_include_path()
31
+ );
32
+ unset($paths, $libraryPath);
33
+
34
+ include_once 'Zend/Loader/Autoloader.php';
35
+ $autoloader = Zend_Loader_Autoloader::getInstance();
36
+
37
+ $composerLoader = null;
38
+ $requireVendor = function() use (&$composerLoader)
39
+ {
40
+ $parent = '../';
41
+ $limiter = 0;
42
+ $target = 'vendor/';
43
+ $path = $parent . $target;
44
+
45
+ while (false === realpath($path)) {
46
+ $parent = $parent . $parent;
47
+ $path = $parent . $target;
48
+ $limiter++;
49
+ if ($limiter > 20) {
50
+ throw new Exception('Cannot find vendor folder to load "autoloader.php"');
51
+ }
52
+ }
53
+ $composerLoader = require_once $path . '/autoload.php';
54
+ };
55
+ $requireVendor();
56
+ unset($requireVendor);
57
+
58
+ // Add the namespaces
59
+ $autoloader->registerNamespace('Zend_');
60
+ $autoloader->registerNamespace('Lib_');
61
+ $autoloader->setFallbackAutoloader(true);
62
+
63
+ $isIntegrationTest = (bool)getenv('PHP_INTEGRATION_TEST');
64
+
65
+ if (!$isIntegrationTest) {
66
+ include_once 'Zend/Loader/Autoloader/Interface.php';
67
+ include_once 'Lib/Loader/Autoloader.php';
68
+ $backOfficeAutoloader = new Lib_Loader_Autoloader();
69
+ $backOfficeAutoloader->setApplicationPath(APPLICATION_PATH);
70
+ $autoloader->unshiftAutoloader($backOfficeAutoloader);
71
+ $autoloader->unshiftAutoloader($composerLoader);
72
+ }
73
+
74
+ // Include the test helpers
75
+ $testHelpersPath = realpath(dirname(__FILE__));
76
+
77
+ require_once $testHelpersPath . '/Providers.php';
78
+ require_once $testHelpersPath . '/Message.php';
79
+ require_once $testHelpersPath . '/Values.php';
80
+ require_once $testHelpersPath . '/RedirectException.php';
81
+ require_once $testHelpersPath . '/JournalEntries.php';
82
+ require_once $testHelpersPath . '/IntegrationTestCase.php';
83
+
84
+ // Set timezone
85
+ date_default_timezone_set('Europe/London');
@@ -0,0 +1,60 @@
1
+ <?php
2
+ /**
3
+ * PHPUnit bootstrap file, sets up includes paths and other required details
4
+ * - This is used by Lib and App unit tests also
5
+ *
6
+ * @since 17/05/2010
7
+ * @package Tests
8
+ */
9
+
10
+ define('ENVIRONMENT', 'testing');
11
+ ini_set('memory_limit', '1024M');
12
+
13
+ // Set appication path (contextually consistent with library use within app)
14
+ if (!defined('APPLICATION_PATH')) {
15
+ define(
16
+ 'APPLICATION_PATH',
17
+ realpath(dirname(__FILE__) . '/../../../public/brightpearl')
18
+ );
19
+ }
20
+
21
+
22
+ $libraryPath = realpath(dirname(__FILE__) . '/../../../../static');
23
+ $paths = array(
24
+ "{$libraryPath}/dev/lib-lib",
25
+ "{$libraryPath}/static",
26
+ "{$libraryPath}/static/ZendFramework-1.11.1",
27
+ "{$libraryPath}/static/SymfonyDi",
28
+ "{$libraryPath}/static/SymfonyYaml",
29
+ "{$libraryPath}/static/Spreadsheet",
30
+ "{$libraryPath}/static/Auth"
31
+ );
32
+
33
+ set_include_path(
34
+ implode($paths, PATH_SEPARATOR) . PATH_SEPARATOR . get_include_path()
35
+ );
36
+ unset($paths, $libraryPath);
37
+
38
+ // Setup the libraries to autoload
39
+ include_once 'Zend/Loader/Autoloader.php';
40
+ $autoloader = Zend_Loader_Autoloader::getInstance();
41
+ // Add the namespaces
42
+ $autoloader->registerNamespace('Zend_');
43
+ $autoloader->registerNamespace('Lib_');
44
+ $autoloader->setFallbackAutoloader(true);
45
+
46
+ /*
47
+ * Set error reporting to the level to which code must comply.
48
+ */
49
+ error_reporting(E_ALL | E_STRICT);
50
+
51
+ // Include the test helpers
52
+ $testHelpersPath = realpath(dirname(__FILE__));
53
+
54
+ require_once $testHelpersPath . '/Providers.php';
55
+ require_once $testHelpersPath . '/Message.php';
56
+ require_once $testHelpersPath . '/Values.php';
57
+ require_once $testHelpersPath . '/Accounts/AllocatePayments/JournalEntries.php';
58
+
59
+ // Set timezone
60
+ date_default_timezone_set('Europe/London');
@@ -1,6 +1,7 @@
1
1
  require 'convoy'
2
2
  require 'yaml'
3
3
 
4
+ require 'version'
4
5
  require 'core/api'
5
6
  require 'core/config_unique'
6
7
  require 'core/enums'
@@ -9,13 +10,10 @@ require 'core/git_delete'
9
10
  require 'core/jira'
10
11
  require 'core/mysql'
11
12
  require 'core/pom'
13
+ require 'core/sql_update'
12
14
  require 'core/tools'
13
15
  require 'core/validate'
14
-
15
- require 'core/config'
16
- require 'core/encrypter'
17
- require 'core/terminal'
18
-
16
+ require 'core/vm'
19
17
  require 'routes/build'
20
18
  require 'routes/dummy_order'
21
19
  require 'routes/fix'
@@ -33,14 +31,23 @@ require 'routes/reset'
33
31
  require 'routes/review'
34
32
  require 'routes/scripts_api_docs'
35
33
  require 'routes/scripts_branch_cleaner'
36
- require 'routes/scripts_sonar'
37
34
  require 'routes/scripts_color'
38
35
  require 'routes/scripts_pom_fixer'
39
- require 'routes/setup'
36
+ require 'routes/scripts_sonar'
37
+ require 'routes/scripts_sql_update'
40
38
  require 'routes/update'
41
39
  require 'routes/tail'
42
40
  require 'routes/test'
43
41
 
42
+ # SHARED
43
+ require 'core/config'
44
+ require 'core/encrypter'
45
+ require 'core/terminal'
46
+ require 'core/utils_files'
47
+ require 'core/utils_routes'
48
+ require 'core/utils_strings'
49
+ require 'routes/setup'
50
+
44
51
  module App
45
52
 
46
53
  def self.execute
@@ -56,7 +63,7 @@ module App
56
63
  # COLOR OF TITLE TEXT
57
64
  title_color = 255
58
65
 
59
- brightpearl.version '1.4.0'
66
+ brightpearl.version VERSION
60
67
  brightpearl.summary "\x1B[38;5;166mBRIGHTPEARL-CLI\x1B[0m \x1B[38;5;240m\xe2\x80\x94 BETA\x1B[0m"
61
68
  brightpearl.description "\x1B[38;5;#{title_color}mA command line utility for Brightpearl developers and QAs.\nUsed for automating daily work flows & completing repetitive tasks quicker with less errors.\nDesigned to work from anywhere on your workstation.\n\nUse #{App::Terminal::format_command('brightpearl')}\x1B[38;5;#{title_color}m or #{App::Terminal::format_command('bp')}\x1B[38;5;#{title_color}m to run.\x1B[0m"
62
69
 
@@ -105,7 +112,8 @@ module App
105
112
  brightpearl.command :fix, :aliases => [:f] do |fix|
106
113
  fix.summary 'Quick fixes for common problems'
107
114
  fix.options do |opts|
108
- opts.opt :clear_sessions, 'Clear sessions (to fix login problem)', :short => '-1', :long => '--clear-sessions', :type => :boolean
115
+ opts.opt :login_sessions, 'LOGIN - Clear sessions to fix login problem(s)', :short => '-l', :long => '--login-sessions', :type => :boolean
116
+ opts.opt :sql_updates, 'SQL UPDATE(S) - Run SQL updates from a specific update (specified as 1st argument).', :short => '-s', :long => '--sql-updates', :type => :boolean
109
117
  end
110
118
  fix.action do |opts, args|
111
119
  AppCommand::Fix.new(opts, args).execute
@@ -336,6 +344,14 @@ module App
336
344
  end
337
345
  end
338
346
 
347
+ # SCRIPTS SQL-UPDATE
348
+ scripts.command :sql_update, :aliases => [:S] do |scripts_sql_update|
349
+ scripts_sql_update.summary 'Finish off a SQL Update'
350
+ scripts_sql_update.action do |opts, args|
351
+ AppCommand::ScriptsSqlUpdate.new(opts, args).execute
352
+ end
353
+ end
354
+
339
355
  # SCRIPTS COLOR
340
356
  scripts.command :color, :aliases => [:c] do |scripts_color|
341
357
  scripts_color.summary 'Shows a list of bash/ruby color codes (256-bit)'
@@ -377,6 +393,7 @@ module App
377
393
  opts.opt :cucumber, 'Run Cucumber tests', :short => '-c', :long => '--cucumber', :type => :boolean
378
394
  opts.opt :fitnesse, 'Run FitNesse tests', :short => '-f', :long => '--fitnesse', :type => :boolean
379
395
  opts.opt :php, 'Run PHPUnit tests (default)', :short => '-p', :long => '--php-unit', :type => :boolean
396
+ opts.opt :php_local, 'Run PHPUnit tests locally', :short => '-P', :long => '--php-unit-local', :type => :boolean
380
397
  opts.opt :ruby, 'Run Ruby UI tests', :short => '-r', :long => '--ruby-ui', :type => :boolean
381
398
  end
382
399
  test.action do |opts, args|
data/lib/core/config.rb CHANGED
@@ -99,4 +99,4 @@ module App
99
99
 
100
100
  end
101
101
 
102
- end
102
+ end
data/lib/core/ebay.rb ADDED
@@ -0,0 +1,11 @@
1
+ module App
2
+
3
+ class Ebay
4
+
5
+ def initialize(credentials = App::Ebay)
6
+
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,34 @@
1
+ module App
2
+
3
+ class EbayFactory
4
+
5
+ DEFAULT_CREDENTIALS = 'nimzo_seller'
6
+
7
+ @credentials = {}
8
+
9
+ def self.get(credentials = DEFAULT_CREDENTIALS)
10
+
11
+ if @credentials[credentials].nil?
12
+
13
+ # encrypter = Encrypter.new
14
+ # host = App::Config.param(App::Config::EC2_HOST)
15
+ # user = App::Config.param(App::Config::EC2_USER)
16
+ # pass = App::Config.param(App::Config::EC2_PASS)
17
+ # if host.nil? || user.nil? || pass.nil? || host == '' || user == '' || pass == ''
18
+ # 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)
19
+ # end
20
+ # @ec2_connection = Mysql2::Client.new(
21
+ # :host => encrypter.decrypt(host),
22
+ # :username => encrypter.decrypt(user),
23
+ # :password => encrypter.decrypt(pass),
24
+ # :database => schema
25
+ # )
26
+
27
+ end
28
+ @credentials[credentials]
29
+
30
+ end
31
+
32
+ end
33
+
34
+ end
data/lib/core/enums.rb CHANGED
@@ -6,6 +6,14 @@ module App
6
6
 
7
7
  GIT_MERGE_DEFAULT_FILE = '/tmp/merge.txt'
8
8
 
9
+ # Get PATH to assets, scripts, etc.
10
+ # @return String
11
+ def self.get_base_path
12
+ base_path = File.dirname(File.expand_path(__FILE__))
13
+ base_path = base_path.gsub(/\/\w+\/\w+\z/i, '')
14
+ base_path
15
+ end
16
+
9
17
  end
10
18
 
11
19
  end
data/lib/core/git.rb CHANGED
@@ -533,7 +533,7 @@ module App
533
533
  else
534
534
  if force_stash_message != false
535
535
  abort_message = force_stash_message.is_a?(String) ? force_stash_message : nil
536
- App::Terminal::abort(abort_message,["In this particular scenario, you #{App::Terminal::format_invalid('cannot continue', true)} unless you stash your changes."], true, false)
536
+ App::Terminal::abort(abort_message, ["In this particular scenario, you #{App::Terminal::format_invalid('cannot continue', true)} unless you stash your changes."], true, false)
537
537
  end
538
538
  unless App::Terminal::prompt_yes_no('Continue without stashing?', "By selecting #{App::Terminal::format_action('Yes')}\x1B[38;5;240m, you're changes will be carried over to the next branch.", nil, false)
539
539
  App::Terminal::abort(nil, nil, true, false)
@@ -601,7 +601,6 @@ module App
601
601
  "#{App::Terminal::format_directory(get_repo_shorthand(App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_DB)))} is on #{App::Terminal::format_branch(branch_db)}"
602
602
  ])
603
603
  when SAME_BRANCH_ERROR
604
- else
605
604
  App::Terminal::error("You're on #{App::Terminal::format_highlight('2 different branches')}", [
606
605
  "#{App::Terminal::format_directory(get_repo_shorthand(App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_CODE)))} is on #{App::Terminal::format_branch(branch_code)}",
607
606
  "#{App::Terminal::format_directory(get_repo_shorthand(App::Config.param(App::Config::WORKSTATION_PATH_TO_BP_DB)))} is on #{App::Terminal::format_branch(branch_db)}",
@@ -695,6 +694,10 @@ module App
695
694
  # Checks if branch exists ANYWHERE -- Local, Remote, Code, DB. If the branch name is found anywhere, will return FALSE.
696
695
  # @return boolean
697
696
  def branch_exists_anywhere(branch_name, case_sensitive = false)
697
+ # If new branch is 12345, find possible branches.
698
+ if branch_name =~ /\A\d{4,5}\z/i
699
+ branch_name = resolve_branch_for_jira(branch_name)
700
+ end
698
701
  existing_branches = get_all_branches_as_array
699
702
  if case_sensitive
700
703
  existing_branches.map!(&:downcase)
@@ -782,6 +785,45 @@ module App
782
785
  end
783
786
  end
784
787
 
788
+ # Resolves possible branch names from 12345
789
+ # @return String
790
+ def resolve_branch_for_jira(jira_number)
791
+ resolved_branch = jira_number
792
+ possible_branches = []
793
+ if jira_number =~ /\A\d{4,5}\z/
794
+ get_all_branches_as_array.each do |possible_branch|
795
+ if possible_branch =~ /(bug|bp|feature)-#{jira_number}\z/i
796
+ # If more than one possible branch exists, IE: bug-14145 & bp-14145
797
+ if possible_branches.any?
798
+ App::Terminal::error("More than one possible branch found for jira number: #{App::Terminal::format_highlight(jira_number)}", [App::Terminal::format_branch(possible_branches[0]), App::Terminal::format_branch(possible_branch), nil, "In this case, you must specify the branch name #{App::Terminal::format_highlight('explicitly')}."], true)
799
+ end
800
+ possible_branches << possible_branch
801
+ App::Terminal::output("Resolved branch #{App::Terminal::format_branch(possible_branch)} from jira number: #{App::Terminal::format_highlight(jira_number)}", App::Terminal::MSG_AUTOMATIC)
802
+ end
803
+ end
804
+ unless possible_branches.any?
805
+ App::Terminal::error("No branch found for jira number: #{App::Terminal::format_highlight(jira_number)}", ['Please check your input and try again.'], true)
806
+ end
807
+ resolved_branch = possible_branches[0]
808
+ end
809
+ resolved_branch
810
+ end
811
+
812
+ # Returns TRUE if changes exist or FALSE if there is nothing to commit.
813
+ # @return boolean
814
+ def changes_exist(repo_dir)
815
+ validate_repo_dir(repo_dir)
816
+ git_results = App::Terminal::command_capture('git status', repo_dir)
817
+ changes_exist = true
818
+ git_results = git_results[0].split("\n")
819
+ git_results.each do |line|
820
+ if line =~ /nothing to commit, working directory clean/
821
+ changes_exist = false
822
+ end
823
+ end
824
+ changes_exist
825
+ end
826
+
785
827
  # Get list of files that have changed between 2 branches
786
828
  # @return Array
787
829
  def get_changed_files(repo_dir, branch_to_compare_to = "origin/#{App::Git::MASTER}")