From 012da677daa23048c9bee75baa7335282ab708dd Mon Sep 17 00:00:00 2001 From: Compolomus Date: Thu, 16 Apr 2020 22:51:33 +0200 Subject: [PATCH] Add editorconfig and refactoring Client class --- .editorconfig | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/Client.php | 166 ++++++++++++++++++++++-------------------- 2 files changed, 312 insertions(+), 80 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d975ecf --- /dev/null +++ b/.editorconfig @@ -0,0 +1,226 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = false +max_line_length = 140 +tab_width = 4 +ij_continuation_indent_size = 8 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = false +ij_smart_tabs = false +ij_wrap_on_typing = false + +[{*.module,*.hphp,*.phtml,*.php5,*.php4,*.php,*.ctp,*.inc}] +max_line_length = 999 +ij_continuation_indent_size = 4 +ij_php_align_assignments = true +ij_php_align_class_constants = true +ij_php_align_group_field_declarations = true +ij_php_align_inline_comments = true +ij_php_align_key_value_pairs = true +ij_php_align_multiline_array_initializer_expression = true +ij_php_align_multiline_binary_operation = false +ij_php_align_multiline_chained_methods = false +ij_php_align_multiline_extends_list = false +ij_php_align_multiline_for = true +ij_php_align_multiline_parameters = false +ij_php_align_multiline_parameters_in_calls = false +ij_php_align_multiline_ternary_operation = false +ij_php_align_phpdoc_comments = true +ij_php_align_phpdoc_param_names = true +ij_php_anonymous_brace_style = end_of_line +ij_php_api_weight = 28 +ij_php_array_initializer_new_line_after_left_brace = true +ij_php_array_initializer_right_brace_on_new_line = true +ij_php_array_initializer_wrap = off +ij_php_assignment_wrap = off +ij_php_author_weight = 28 +ij_php_binary_operation_sign_on_next_line = false +ij_php_binary_operation_wrap = off +ij_php_blank_lines_after_class_header = 0 +ij_php_blank_lines_after_function = 1 +ij_php_blank_lines_after_imports = 1 +ij_php_blank_lines_after_opening_tag = 0 +ij_php_blank_lines_after_package = 1 +ij_php_blank_lines_around_class = 1 +ij_php_blank_lines_around_constants = 0 +ij_php_blank_lines_around_field = 0 +ij_php_blank_lines_around_method = 1 +ij_php_blank_lines_before_class_end = 0 +ij_php_blank_lines_before_imports = 1 +ij_php_blank_lines_before_method_body = 0 +ij_php_blank_lines_before_package = 1 +ij_php_blank_lines_before_return_statement = 0 +ij_php_blank_lines_between_imports = 0 +ij_php_block_brace_style = end_of_line +ij_php_call_parameters_new_line_after_left_paren = false +ij_php_call_parameters_right_paren_on_new_line = false +ij_php_call_parameters_wrap = normal +ij_php_catch_on_new_line = false +ij_php_category_weight = 28 +ij_php_class_brace_style = next_line +ij_php_comma_after_last_array_element = false +ij_php_concat_spaces = true +ij_php_copyright_weight = 28 +ij_php_deprecated_weight = 28 +ij_php_do_while_brace_force = always +ij_php_else_if_style = combine +ij_php_else_on_new_line = false +ij_php_example_weight = 28 +ij_php_extends_keyword_wrap = off +ij_php_extends_list_wrap = off +ij_php_fields_default_visibility = private +ij_php_filesource_weight = 28 +ij_php_finally_on_new_line = false +ij_php_for_brace_force = always +ij_php_for_statement_new_line_after_left_paren = false +ij_php_for_statement_right_paren_on_new_line = false +ij_php_for_statement_wrap = off +ij_php_force_short_declaration_array_style = true +ij_php_global_weight = 28 +ij_php_group_use_wrap = on_every_item +ij_php_if_brace_force = always +ij_php_if_lparen_on_next_line = false +ij_php_if_rparen_on_next_line = false +ij_php_ignore_weight = 28 +ij_php_import_sorting = alphabetic +ij_php_indent_break_from_case = true +ij_php_indent_case_from_switch = true +ij_php_indent_code_in_php_tags = false +ij_php_internal_weight = 28 +ij_php_keep_blank_lines_after_lbrace = 2 +ij_php_keep_blank_lines_before_right_brace = 2 +ij_php_keep_blank_lines_in_code = 2 +ij_php_keep_blank_lines_in_declarations = 2 +ij_php_keep_control_statement_in_one_line = true +ij_php_keep_first_column_comment = true +ij_php_keep_indents_on_empty_lines = false +ij_php_keep_line_breaks = true +ij_php_keep_rparen_and_lbrace_on_one_line = true +ij_php_keep_simple_methods_in_one_line = false +ij_php_lambda_brace_style = end_of_line +ij_php_license_weight = 28 +ij_php_line_comment_add_space = false +ij_php_line_comment_at_first_column = true +ij_php_link_weight = 28 +ij_php_lower_case_boolean_const = true +ij_php_lower_case_null_const = true +ij_php_method_brace_style = next_line +ij_php_method_call_chain_wrap = off +ij_php_method_parameters_new_line_after_left_paren = true +ij_php_method_parameters_right_paren_on_new_line = true +ij_php_method_parameters_wrap = on_every_item +ij_php_method_weight = 28 +ij_php_modifier_list_wrap = false +ij_php_multiline_chained_calls_semicolon_on_new_line = false +ij_php_namespace_brace_style = 1 +ij_php_null_type_position = in_the_end +ij_php_package_weight = 28 +ij_php_param_weight = 0 +ij_php_parentheses_expression_new_line_after_left_paren = false +ij_php_parentheses_expression_right_paren_on_new_line = false +ij_php_phpdoc_blank_line_before_tags = true +ij_php_phpdoc_blank_lines_around_parameters = true +ij_php_phpdoc_keep_blank_lines = true +ij_php_phpdoc_param_spaces_between_name_and_description = 1 +ij_php_phpdoc_param_spaces_between_tag_and_type = 1 +ij_php_phpdoc_param_spaces_between_type_and_name = 1 +ij_php_phpdoc_use_fqcn = true +ij_php_phpdoc_wrap_long_lines = false +ij_php_place_assignment_sign_on_next_line = false +ij_php_place_parens_for_constructor = 0 +ij_php_property_read_weight = 28 +ij_php_property_weight = 28 +ij_php_property_write_weight = 28 +ij_php_return_type_on_new_line = false +ij_php_return_weight = 1 +ij_php_see_weight = 28 +ij_php_since_weight = 28 +ij_php_sort_phpdoc_elements = true +ij_php_space_after_colon = true +ij_php_space_after_colon_in_return_type = true +ij_php_space_after_comma = true +ij_php_space_after_for_semicolon = true +ij_php_space_after_quest = true +ij_php_space_after_type_cast = true +ij_php_space_after_unary_not = false +ij_php_space_before_array_initializer_left_brace = false +ij_php_space_before_catch_keyword = true +ij_php_space_before_catch_left_brace = true +ij_php_space_before_catch_parentheses = true +ij_php_space_before_class_left_brace = true +ij_php_space_before_closure_left_parenthesis = true +ij_php_space_before_colon = true +ij_php_space_before_colon_in_return_type = false +ij_php_space_before_comma = false +ij_php_space_before_do_left_brace = true +ij_php_space_before_else_keyword = true +ij_php_space_before_else_left_brace = true +ij_php_space_before_finally_keyword = true +ij_php_space_before_finally_left_brace = true +ij_php_space_before_for_left_brace = true +ij_php_space_before_for_parentheses = true +ij_php_space_before_for_semicolon = false +ij_php_space_before_if_left_brace = true +ij_php_space_before_if_parentheses = true +ij_php_space_before_method_call_parentheses = false +ij_php_space_before_method_left_brace = true +ij_php_space_before_method_parentheses = false +ij_php_space_before_quest = true +ij_php_space_before_switch_left_brace = true +ij_php_space_before_switch_parentheses = true +ij_php_space_before_try_left_brace = true +ij_php_space_before_unary_not = false +ij_php_space_before_while_keyword = true +ij_php_space_before_while_left_brace = true +ij_php_space_before_while_parentheses = true +ij_php_space_between_ternary_quest_and_colon = false +ij_php_spaces_around_additive_operators = true +ij_php_spaces_around_arrow = false +ij_php_spaces_around_assignment_in_declare = false +ij_php_spaces_around_assignment_operators = true +ij_php_spaces_around_bitwise_operators = true +ij_php_spaces_around_equality_operators = true +ij_php_spaces_around_logical_operators = true +ij_php_spaces_around_multiplicative_operators = true +ij_php_spaces_around_null_coalesce_operator = true +ij_php_spaces_around_relational_operators = true +ij_php_spaces_around_shift_operators = true +ij_php_spaces_around_unary_operator = false +ij_php_spaces_around_var_within_brackets = false +ij_php_spaces_within_array_initializer_braces = false +ij_php_spaces_within_brackets = false +ij_php_spaces_within_catch_parentheses = false +ij_php_spaces_within_for_parentheses = false +ij_php_spaces_within_if_parentheses = false +ij_php_spaces_within_method_call_parentheses = false +ij_php_spaces_within_method_parentheses = false +ij_php_spaces_within_parentheses = false +ij_php_spaces_within_short_echo_tags = true +ij_php_spaces_within_switch_parentheses = false +ij_php_spaces_within_while_parentheses = false +ij_php_special_else_if_treatment = false +ij_php_subpackage_weight = 28 +ij_php_ternary_operation_signs_on_next_line = false +ij_php_ternary_operation_wrap = off +ij_php_throws_weight = 2 +ij_php_todo_weight = 28 +ij_php_unknown_tag_weight = 28 +ij_php_upper_case_boolean_const = false +ij_php_upper_case_null_const = false +ij_php_uses_weight = 28 +ij_php_var_weight = 28 +ij_php_variable_naming_style = mixed +ij_php_version_weight = 28 +ij_php_while_brace_force = always +ij_php_while_on_new_line = false + +[{phpunit.xml.dist,*.jhm,*.rng,*.wsdl,*.fxml,*.xslt,*.jrxml,*.ant,*.xul,*.xsl,*.xsd,*.tld,*.jnlp,*.xml}] +ij_xml_block_comment_at_first_column = true +ij_xml_keep_indents_on_empty_lines = false +ij_xml_line_comment_at_first_column = true diff --git a/src/Client.php b/src/Client.php index be1469c..7c94e19 100644 --- a/src/Client.php +++ b/src/Client.php @@ -7,6 +7,17 @@ use RouterOS\Exceptions\ConfigException; use RouterOS\Exceptions\QueryException; use RouterOS\Helpers\ArrayHelper; +use function array_shift; +use function chr; +use function count; +use function is_array; +use function is_string; +use function md5; +use function pack; +use function preg_match_all; +use function sleep; +use function trim; + /** * Class Client for RouterOS management * @@ -20,14 +31,14 @@ class Client implements Interfaces\ClientInterface /** * Configuration of connection * - * @var \RouterOS\Config + * @var Config */ private $_config; /** * API communication object * - * @var \RouterOS\APIConnector + * @var APIConnector */ private $_connector; @@ -35,16 +46,16 @@ class Client implements Interfaces\ClientInterface /** * Client constructor. * - * @param array|\RouterOS\Config $config + * @param array|Config $config * - * @throws \RouterOS\Exceptions\ClientException - * @throws \RouterOS\Exceptions\ConfigException - * @throws \RouterOS\Exceptions\QueryException + * @throws ClientException + * @throws ConfigException + * @throws QueryException */ public function __construct($config) { // If array then need create object - if (\is_array($config)) { + if (is_array($config)) { $config = new Config($config); } @@ -68,7 +79,7 @@ class Client implements Interfaces\ClientInterface * @param string $parameter Name of required parameter * * @return mixed - * @throws \RouterOS\Exceptions\ConfigException + * @throws ConfigException */ private function config(string $parameter) { @@ -78,20 +89,20 @@ class Client implements Interfaces\ClientInterface /** * Send write query to RouterOS * - * @param string|array|\RouterOS\Query $query + * @param string|array|Query $query * - * @return \RouterOS\Client - * @throws \RouterOS\Exceptions\QueryException + * @return Client + * @throws QueryException * @deprecated * @codeCoverageIgnore */ public function write($query): Client { - if (\is_string($query)) { + if (is_string($query)) { $query = new Query($query); - } elseif (\is_array($query)) { + } elseif (is_array($query)) { $endpoint = array_shift($query); - $query = new Query($endpoint, $query); + $query = new Query($endpoint, $query); } if (!$query instanceof Query) { @@ -105,14 +116,14 @@ class Client implements Interfaces\ClientInterface /** * Send write query to RouterOS (modern version of write) * - * @param string|Query $endpoint Path of API query or Query object - * @param array|null $where List of where filters - * @param string|null $operations Some operations which need make on response - * @param string|null $tag Mark query with tag + * @param string|Query $endpoint Path of API query or Query object + * @param array|null $where List of where filters + * @param string|null $operations Some operations which need make on response + * @param string|null $tag Mark query with tag * - * @return \RouterOS\Client - * @throws \RouterOS\Exceptions\QueryException - * @throws \RouterOS\Exceptions\ClientException + * @return Client + * @throws QueryException + * @throws ClientException * @since 1.0.0 */ public function query($endpoint, array $where = null, string $operations = null, string $tag = null): Client @@ -128,48 +139,10 @@ class Client implements Interfaces\ClientInterface // If array is multidimensional, then parse each line if (is_array($where[0])) { foreach ($where as $item) { - - // Null by default - $key = null; - $operator = null; - $value = null; - - switch (\count($item)) { - case 1: - list($key) = $item; - break; - case 2: - list($key, $operator) = $item; - break; - case 3: - list($key, $operator, $value) = $item; - break; - default: - throw new ClientException('From 1 to 3 parameters of "where" condition is allowed'); - } - $query->where($key, $operator, $value); + $query = $this->preQuery($item, $query); } } else { - // Null by default - $key = null; - $operator = null; - $value = null; - - switch (\count($where)) { - case 1: - list($key) = $where; - break; - case 2: - list($key, $operator) = $where; - break; - case 3: - list($key, $operator, $value) = $where; - break; - default: - throw new ClientException('From 1 to 3 parameters of "where" condition is allowed'); - } - - $query->where($key, $operator, $value); + $query = $this->preQuery($where, $query); } } @@ -189,12 +162,45 @@ class Client implements Interfaces\ClientInterface } /** + * Query helper + * + * @param array $item + * @param Query $query + * @return Query + * @throws ClientException + * @throws QueryException + */ + private function preQuery(array $item, Query $query): Query + { + // Null by default + $key = null; + $operator = null; + $value = null; + + switch (count($item)) { + case 1: + [$key] = $item; + break; + case 2: + [$key, $operator] = $item; + break; + case 3: + [$key, $operator, $value] = $item; + break; + default: + throw new ClientException('From 1 to 3 parameters of "where" condition is allowed'); + } + + return $query->where($key, $operator, $value); + } + + /** * Send write query object to RouterOS * - * @param \RouterOS\Query $query + * @param Query $query * - * @return \RouterOS\Client - * @throws \RouterOS\Exceptions\QueryException + * @return Client + * @throws QueryException * @since 1.0.0 */ private function writeRAW(Query $query): Client @@ -278,7 +284,7 @@ class Client implements Interfaces\ClientInterface /** * Read using Iterators to improve performance on large dataset * - * @return \RouterOS\ResponseIterator + * @return ResponseIterator * @since 1.0.0 */ public function readAsIterator(): ResponseIterator @@ -302,9 +308,9 @@ class Client implements Interfaces\ClientInterface private function rosario(array $raw): array { // This RAW should't be an error - $positions = array_keys($raw, '!re'); - $count = count($raw); - $result = []; + $positions = \array_keys($raw, '!re'); + $count = count($raw); + $result = []; if (isset($positions[1])) { @@ -341,8 +347,8 @@ class Client implements Interfaces\ClientInterface public function parseResponse(array $response): array { $result = []; - $i = -1; - $lines = \count($response); + $i = -1; + $lines = count($response); foreach ($response as $key => $value) { switch ($value) { case '!re': @@ -379,9 +385,9 @@ class Client implements Interfaces\ClientInterface * Parse result from RouterOS by regular expression * * @param string $value - * @param array $matches + * @param array $matches */ - private function pregResponse(string $value, &$matches) + private function pregResponse(string $value, &$matches): void { preg_match_all('/^[=|\.](.*)=(.*)/', $value, $matches); } @@ -392,9 +398,9 @@ class Client implements Interfaces\ClientInterface * @param bool $legacyRetry Retry login if we detect legacy version of RouterOS * * @return bool - * @throws \RouterOS\Exceptions\ClientException - * @throws \RouterOS\Exceptions\ConfigException - * @throws \RouterOS\Exceptions\QueryException + * @throws ClientException + * @throws ConfigException + * @throws QueryException */ private function login(bool $legacyRetry = false): bool { @@ -406,7 +412,7 @@ class Client implements Interfaces\ClientInterface // Now need use this hash for authorization $query = new Query('/login', [ '=name=' . $this->config('user'), - '=response=00' . md5(\chr(0) . $this->config('pass') . pack('H*', $response['after']['ret'])) + '=response=00' . md5(chr(0) . $this->config('pass') . pack('H*', $response['after']['ret'])) ]); } else { // Just login with our credentials @@ -452,16 +458,16 @@ class Client implements Interfaces\ClientInterface */ private function isLegacy(array &$response): bool { - return \count($response) > 1 && $response[0] === '!done' && !$this->config('legacy'); + return count($response) > 1 && $response[0] === '!done' && !$this->config('legacy'); } /** * Connect to socket server * * @return bool - * @throws \RouterOS\Exceptions\ClientException - * @throws \RouterOS\Exceptions\ConfigException - * @throws \RouterOS\Exceptions\QueryException + * @throws ClientException + * @throws ConfigException + * @throws QueryException */ private function connect(): bool {