LINUX.ORG.RU

А давайте посмотрим на конфиг и подумаем как бы его сделать лучше

 ,


0

1

Это пример конфигурационного файла для кода, который занимается переименовыванием файлов по шаблону. Шаблон формируется массивом rules.

Так, например, этот конфиг скопирует файл ~/src/subdir1/file1.txt в ~/dst/2022-03-06_subdir1_0.txt

Мне очень хотелось бы сделать так, чтобы читать мануал пришлось только в нетиповых случаях когда «хочется странного», а в остальных случаях хватало бы примеров из самого конфига и здравого смысла.

Есть у кого интересные идеи как бы сделать лучше?

source_dir = "~/src";
destination_dir = "~/dst";

keep_dir_structure = false;
copy_or_rename = "copy";

rules = ( 
    {
        type        = "date";
        date_format = "%Y-%m-%d";
    },
    {   
        type        = "text";
        text        = "_";
    },
    {   
        type        = "dir";
        // mode     = "whole path"|"parent dir only"
        mode        = "parent dir only";
        separator   = "-"
      
    },
    {   
        type        = "text";
        text        = "_";
    },
    {   
        type        = "integer";
        // mode     = "global"|"local for every dir"
        mode        = "local for every dir";
        start       = 0;
        step        = 1;
    },
    {   
        type        = "extension";
        // leave the "text" variable empty to use an original extension
        text        = "";
        // register    = "lowercase"|"uppercase";
        register    = "lowercase";
    } 
);



Ответ на: комментарий от Usruser

зачем его читать человеком?
полпрограммы сразу выкинешь которая отвечает за парсинг этого недразумения.

anonymous2 ★★★★★
()
Ответ на: комментарий от anonymous2

зачем его читать человеком?

Потому что это конфиг программы. Конфиг, который нужно править почти перед каждым запуском программы.

парсинг этого недразумения.

libconfig

Usruser
() автор топика
Ответ на: комментарий от bigbit

--- # The Smiths
- {name: John Smith, age: 33}
- name: Mary Smith
  age: 27
- [name, age]: [Rae Smith, 4]   # sequences as keys are supported
--- # People, by gender
men: [John Smith, Bill Jones]
women:
  - Mary Smith
  - Susan Williams


Эту жуть даже питонисты прочитать не смогут.

Usruser
() автор топика
Ответ на: комментарий от Usruser

По-моему, выглядит гораздо лучше, чем твой конфиг:

source_dir: "~/src"
destination_dir: "~/dst"

keep_dir_structure: false
copy_or_rename: "copy"

rules:
  - type: "date"
    date_format: "%Y-%m-%d"

  - type: "text"
    text: "_"

  - type: "dir"
    mode: "parent dir only"
    separator: "-"

  - type: "text"
    text: "_"

  - type: "integer"
    mode: "local for every dir"
    start: 0
    step:  1

  - type: "extension"
    text: ""
    register: "lowercase"

bigbit ★★★★★
()
Последнее исправление: bigbit (всего исправлений: 1)

Я уже писал про это недавно, в вашем случае, для более или менее сложных конфигов, есть такие лучшие пути:

  • Конфиг на общеизвестном современном иерархическом языке конфигов - YAML, JSON
  • Хранение конфига в исходнике в виде переменных современных интерпретируемых языков программирования

Если у вас компилируемый язык - пишите, я тоже дам рекомендации

Во всех языках и форматах конфигов есть комментарии

pup_kin
()
Последнее исправление: pup_kin (всего исправлений: 1)

Конфиг сводится к реляционной модели? Если да, то используй CSV. Если нет, то используй JSON и не парь людям мозг.

Иначе, если пользователи такие тупые делай скрипт/гуй, который будет пользователей интерактивно спрашивать: введи поле1, веди поле2…

здравого смысла

Это какая-то суб’ективная хрень. Для нерда чтение исходников Линукс - легкая прогулка. Для иной пожилой бабушки GUI с двумя кнопками уже неразрешимый квест.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 1)

В данном случае YAML сделает конфиг гораздо читаемее.

theNamelessOne ★★★★★
()
Ответ на: комментарий от seiken

Конфиг сводится к реляционной модели? Если да, то используй CSV. Если нет, то используй JSON и не парь людям мозг.

++

Иначе, если пользователи такие тупые делай скрипт/гуй, который будет пользователей интерактивно спрашивать: введи поле1, веди поле2…

Судя по:

Потому что это конфиг программы. Конфиг, который нужно править почти перед каждым запуском программы.

На самом деле ему нужны аргументы. Каждый день править конфиг ну такое себе.

суб’ективная

Нажми на «ь» и подержи.

phoen ★★
()

Есть у кого интересные идеи как бы сделать лучше?

Конечно, потому что плохо в нём буквально всё - от не несущих функций скобок, кавычек и точек с запятой до кучи бесполезно потраченных строк.

Я всегда говорил - ничего лучше YAML нет:

source_dir: ~/src
destination_dir: ~/dst

keep_dir_structure: false
copy_or_rename: copy

rules:
  - type        : date
    date_format : "%Y-%m-%d"
  - type        : text
    text        : _
  - type        : dir
    # mode     : whole path|parent dir only
    mode        : parent dir only
    separator   : "-"
  - type        : text
    text        : _
  - type        : integer
    # mode     : global|local for every dir
    mode        : local for every dir
    start       : 0
    step        : 1
  - type        : extension
    # leave the "text" variable empty to use an original extension
    text        : ""
    # register : lowercase|uppercase
    register    : lowercase

Кажется что подразумевается что правил будет много, поэтому преступно не давать сократить из до одной строки. YAML это тоже умеет:

source_dir: ~/src
destination_dir: ~/dst

keep_dir_structure: false
copy_or_rename: copy

rules:
  - { type: date, date_format: "%Y-%m-%d" }
  - { type: text, text: "_" }
  - { type: dir, mode: "parent dir only", separator: "-" }
  - { type: text, text: "_" }
  - { type: integer, mode: "local for every dir", start: 0, step: 1 }
  - { type: extension, text: "", register: "lowercase" }

Наверное единственный формат который подходит для конфигов кроме YAML это protobuf text format. Из плюсов - разбор в типизированную структуру и валидация из коробки и enum’ы.

source_dir: "~/src"
destination_dir: "~/dst"

keep_dir_structure: false
copy_or_rename: copy  # это enum, если что

rule {
  type        : date  # тоже enum
  date_format : "%Y-%m-%d"
}
rule {
  type        : text
  text        : "_"
}
rule {
  type        : dir
  # mode      : whole_path|parent_dir_only
  mode        : parent_dir_only
  separator   : "-"
}
rule {
  type        : text
  text        : "_"
}
rule {
  type        : integer
  # mode     : global|local_for_every_dir
  mode        : local_for_every_dir
  start       : 0
  step        : 1
}
rule {
  type        : extension
  # leave the "text" variable empty to use an original extension
  text        : ""
  # register : lowercase|uppercase
  register    : lowercase
}
slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.