Это старая версия документа.


Общие вопросы

Мануал по работе с фреймворком ABillS

Форматирование кода

  • В форматирование кода не использовать табов только двойные пробелы
  • Форматирование if else
if (expr) {
  ...
}
else {
  ...
}
  • для удобства форматирования кода можно воспользоваться утилитой perltidy

https://support.abills.net.ua/perltidy.cgi

Переменные

  • Пременные указываюстя строчными буками
  $test, @devices, %switch
  • Обєкты указываются с заглавной
$Test = Test->new();
  • Масивы указываюстя в множественном числе
my @devices = ();
my @users = ();
  • Хеши в единсвенном
%status_list = ();
$status_list{disable}=1;

Общий шаблон функций

#**********************************************************
=head2 test_function($attr) - Test function
 
  Arguments:
    $attr   - Extra attributes
       TEXT   - Some text
 
  Returns:
   TRUE or FALSE
 
  Example:
 
    test_function({ TEXT => 'Some text' });
 
=cut
#**********************************************************
sub test_function {
  my ($attr) = @_;
 
  print "Hello world!";
 
  return 1;
}

Рекомендации:

  1. Отделение шапки функции звёздочками (58 штук).
  2. Не игнорируйте создание комментариев перед началом функции.
  3. Называйте функции строчными буквами (маленькими) с разделением нижним подчёркиванием.
  4. По умолчанию, в случае успешного выполнения функция должна возвращать 1, в случае ошибки - 0.
  5. Минимизируйте использование глобальных переменных в функциях.

Можно ли использовать HTML в коде ?

Ни в коем случае не используйте HTML в коде управляющей модели, вместо этого используйте обекты ABillS::HTML или шаблоны

Дополнительные модули

загрузка дополнительных модулей Perl осуществляется командой

  load_pmodule('Simple::XML');

(Библиотека Misc.pm)

С проверкой ошибок код выглядит так

 my $loaded_imager_error = load_pmodule( "Imager", { RETURN => 1 } );
 if ( $loaded_imager_error ){
   print $loaded_imager_error;
   return 0;
 }

Поиск в полях

Для удобства поиска было разработано несколько разделителей

Для цифровых полей

разделитель запятая (,) обозначает AND

пример: искать значения поля 56 и 66

56,66

разделитель запятая (;) обозначает OR

пример: искать значения поля 56 или 66

56;66

Тестирование

Для тестирования системы существует каталог с тестами abills/t

make

Жесткий тест работоспособности, никогда его не выполняйте на рабочей системе, чревато пропажей данных

perl web.t brutal

тестирование синтаксиса и стрес тест веб приложений
НЕ ИСПОЛЬЗОВАТЬ НА ПРОДАКШН СИСТЕМЕ

Тест проверки авторизации и аккаунтинга

t/Aaa.t

проверка DHCP авторизации используя преготовленный RAD PAIRS пакет dhcp.discover

perl Aaa.t dhcp_test dhcp.discovery

Тестирование абон платы тарифного плана

perl Tariffs.t FILENAME=tp_test1.tp
FILENAME файл с описанием тарифного плана и параметров абонента

В системе также есть специальный скрипт запуска выделенных тестов, которые хранятся в отдельных каталогах Запуск тестов для модуля или папки

Создание демона

use Abills::Base;
use Abills::Server;

my $ARGV = parse_arguments(\@ARGV);

# демонизация и ведение лога
if (defined($ARGV->{'-d'})) {
  my $pid_file = daemonize();
  # ведение лога
  #$Log->log_print('LOG_EMERG', '', "$prog_name Daemonize... $pid_file");
}
#Стоп процесса
elsif (defined($ARGV->{stop})) {
  stop_server();
  exit;
}
#проверка не запущен ли уже
elsif (make_pid() == 1) {
  exit;
}

#Таймаут между запусками 100  секунд
my $UPDATE_TIME=100

while (1) {
  check_activity({ ALL => ($ARGV->{RECONFIG_PERIOD}) ? undef : $all });
  sleep $UPDATE_TIME;
}

Языковые маркеры

%lang = ();

обязательно писать большими буквами

отображение в шаблонах

_{LANG_MARKER}_

JSON тестирование

Для того чтобы протестировать функцию: Создайте тест в usr>abills>t
Подключите JSON.t

require "./JSON.t";

Создайте JSON заполнив его. API_KEY текущего администратора

my @test_list = (
  {
    name       => 'InfoFields',
    params     => {
      qindex       => 96,
      API_KEY      => '1523615231263123',
      json         => 1
    },
    result     => '',
    valid_json => 1,
    schema     => {
 
    }
  }
  );

Передайте данные в функцию json_test

json_test(
  \@test_list, 
  { TEST_NAME => 'info_fields_new test' });

Выполните ваш тест запустив програму

  #prove -v <название теста>.t