Как стать автором
Обновить

Комментарии 26

А где опенсорс либа?)

Пока есть только локальная версия, планирую через пару недель выложить на Гитхаб, когда реализация будет чуть менее сырой.

О! Еще одно подтверждение - любой достаточно продвинутый язык конфигурации стремится стать эквивалентом машине тьюринга, и превратиться в язык программирования без адекватных инструментальных средств, проверки синтаксиса, отладчика, но с комьюнити из целых нескольких человек... :-)

; object3_unite 'object1 + 'object2
object3_unite {
	id 2
	name "Object One"
	color red
  • поручик, а почему не объединились числа, строки и идентификаторы?

  • раскладец, батенька, раскладец! (С)

К чему хотелось бы придраться =)

Убрал двоеточие и запятые - если опционально то ок. Иначе зря.
Про запятые говорю те, которые пишутся в столбик (как в sass необязательные ";" в конце свойств). Допустимая запятая после последнего ключа - ок.

кстати, если убрать еще и фигурные скобки, то получится почти yaml =)

Ну и главное - для удобного использования нужны плагины для популярных IDE, f их нет, насколько я понимаю, раз уж сам парсер даже в открытом доступе не присутствует.

ну а так в целом - интересно. на плюсик тянет =)

Да, двоеточия и запятые можно опускать по желанию, любой JSON - это валидный Av. Можно даже смешивать и где-то писать их, а где-то - нет. Мне просто не нравится, как выглядит смешанный вариант, вот и не привёл такой пример.

Если говорить об альтернативных форматах json, то лично для меня основной стоп-фактор их использования - отсутствие поддержки в IDE. Иногда хотелось бы использовать в качестве конфига и при этом не заморачиваться с лишними кавычками (в ключах) и добавлять комментарии. Пакетов полно. Но открываешь такой файл в редакторе и он весь красный. Думаешь - да в *опу, заюзаю конфиг в виде php массива.

HOCON уже видели? :)

Да, видел. Может быть, я ошибаюсь и это на самом деле круто, но мне не очень нравится идея настолько неявной конкатенации строк, массивов и объектов. Плюс там пробелы и переносы строк гораздо важнее, чем в JSON или Av, что мне тоже не очень нравится. Пример ниже (из документации HOCON) как раз демонстрирует то, что мне не приглянулось.

// this is an array with one element, the string "1 2 3 4"
[ 1 2 3 4 ]
// this is an array of four integers
[ 1
  2
  3
  4 ]

// an array of one element, the array [ 1, 2, 3, 4 ]
[ [ 1, 2 ] [ 3, 4 ] ]
// an array of two arrays
[ [ 1, 2 ]
  [ 3, 4 ] ]

Любой JSON - валидный HOCON, так что пробелы и переносы строк там важны только в случаях, когда используется только сокращенный синтаксис без кавычек. Но в HOCON ещё и другие интересные фишки: включения документов, reference.conf, ccылки на иные параметры. Ваша попытка создать шестнадцатый стандарт интересна, конечно, но пока укладывается в картинку https://imgs.xkcd.com/comics/standards.png

Но серьезно, достойно уважения. Я бы присмотрелся скорее к YAML и сделал что-то похожее на него в духе переделки JSON в HOCON. В конце концов для конфигов более всего важна человекочитабельность.

Пару лет назад писал программу, использовавшую очень большие и развесистые конфигурационные файлы - сперва эти файлы были в JSON, но возможности закомментировать часть файла очень не хватало, переделал на YAML, тем более его как-то в целом удобнее было руками редактировать. Через какое-то время стало не хватать возможности, не повторяясь, описывать структуру вложенных директорий, вместо того, чтобы к каждому файлу данных прописывать полный путь (YAML позволяет расширять парсер, дописал сам), как-то типа так:

- myfolder/
  -- somefile.abc
  -- anotherfolder/
  -- -- anotherfile.xyz

Не помню уже синтаксис ни своей писанины, ни даже самого формата YAML, но идея, думаю, понятна. Ваш формат не умеет что-то такое "из коробки"?

в JSON, но возможности закомментировать часть файла очень не хватало

Если вопрос только в этом, почему бы не сделать простейший препроцессор в пару строк bash или Perl, чтобы отфильтровывал закомментированные условным символом строки?

Понятно, что комментировать нужно будет с умом, чтобы сохранить валидный JSON без отфильтрованных строк, но для внутреннего употребления это не проблема?

Если бы уже достаточно много этих конфигов было написано в JSON, то, возможно, так бы и сделал. А так - погуглил, чо там как с поддержкой комментариев, в YAML поддерживаются, да и синтаксис показался погуманнее, чем в JSON. Опять же, синтаксис в редакторах корректно подсвечивается, code folding корректно работает, и вот это вот всё. А "комментировать с умом" - это ж везде надо, хоть в JSON, хоть в YAML, хоть в C++.

Если вопрос только в этом, почему бы не сделать простейший препроцессор в пару строк bash или Perl, чтобы отфильтровывал закомментированные условным символом строки?

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

Для полностью самодельного языка, стало быть, редактор с подсветкой найти проще.

Нет, поэтому полностью самодельный язык ещё хуже :)

Если честно, о таком не задумывался, вот моё решение. Допустим, что в ОС, где мы используем Av, знак вопроса не может встретиться в имени директории. Тогда можно создать мапу, в которой он будет ключом для массива файлов, а имена директорий будут ключами к объектам, которые они описывают.

Допустим, структура проекта такая (не нейронка, у самого похожий есть):

example_project
├── config
│   └── environments
│       ├── development
│       │   ├── database.txt
│       │   └── settings.txt
│       └── production
│           ├── database.txt
│           └── settings.txt
├── app
│   ├── core
│   │   ├── controllers
│   │   │   └── museum
│   │   │       ├── create.txt
│   │   │       ├── read.txt
│   │   │       ├── update.txt
│   │   │       └── delete.txt
│   │   ├── models
│   │   │   └─── museum
│   │   │       ├── schema.txt
│   │   │       └── validations.txt
│   │   └── services
│   │       └── museum
│   │           ├── create_service.txt
│   │           ├── read_service.txt
│   │           ├── update_service.txt
│   │           └── delete_service.txt
│   └── utils
│       └── logging
│           ├── file_logger.txt
│           └── console_logger.txt
├── assets
│   ├── images
│   │   └── logos
│   │       ├── main_logo.png
│   │       └── footer_logo.png
│   └── styles
│       └── themes
│           ├── light.css
│           └── dark.css
├── tests
│   ├── integration
│   │   └── controllers
│   │       └── museum_integration_test.txt
│   └── unit
│       ├── models
│       │   └── museum_unit_test.txt
│       └── services
│           └── museum_service_test.txt
├── main.txt
└── .gitignore

Тогда я описал бы её следующим образом:

; map on value place means that there's inner directory at right
narrow_project {
  ; any name allowed in Av, but forbidden as path part
  ; could be used there
  ? ["main.txt" ".gitignore"]
  config/environments {
    ; array on value place means that there's file list at right
    development ["database.txt" "settings.txt"]
    production ["database.txt" "settings.txt"]
  }
  app {
    core {
      controllers/museum [
          "create.txt"
          "read.txt"
          "update.txt"
          "delete.txt"
      ]
      models/museum ["schema.txt" "validations.txt"]
      services/museum [
          "create_service.txt"
          "read_service.txt"
          "update_service.txt"
          "delete_service.txt"
      ]
    }
    utils/logging ["file_logger.txt" "console_logger.txt"]
  }
  assets {
    images/logos ["main_logo.png" "footer_logo.png"]
    styles/themes ["light.css" "dark.css"]
  }
  tests {
    integration/controllers ["museum_integration_test.txt"]
    unit {
      models ["museum_unit_test.txt"]
      services ["museum_service_test.txt"]
    }
  }
}

То есть:

  • В директории есть другие директории - использую мапу, где по некоторому ключу - у меня это знак вопроса - лежит массив файлов

  • В ней есть только файлы - использую массив с файлами.

В смысле, это идея, как можно сделать, или вы в своей мудрости настолько предусмотрели, что уже так работает?

Я нашёл пример своего ямловского конфига, вот так это выглядело:

# the most basic path prefixes
inp: &inp ../data/input/
out: &out ../data/output/

my_files: !paths
  - *inp
  - - auxiliary_data/
    - - some_file.yaml
      - another_file.yaml

output_dir_prefix: !path &output_dir_prefix
  - *out
  - - result_dir/

final_output_dir1: !path
  - *output_dir_prefix
  - - subdir1/

final_output_dir2: !path
  - *output_dir_prefix
  - - subdir2/
    - - subdir3/

После парсинга переменные my_files, final_output_dir1 и final_output_dir2 содержали в себе полные пути:

['../data/input/auxiliary_data/some_file.yaml', '../data/input/auxiliary_data/another_file.yaml']
../data/output/result_dir/subdir1/
../data/output/result_dir/subdir2/subdir3/

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

Просто идея, да.

Выскажу непопулярное мнение - стандарт он для того и стандарт , чтоб брать и использовать . Один раз ознакомился , и дальше понимаешь как это работает .

История : коллега занимается внедрением по. По всей стране развернуты сотни кластеров. Сервера общаются между собой. Все хорошо пока не происходит сбой. Причем масштабный. Он дампит обмен серверов . А там json не валидный . 2 дня он не мог понять что это за херня , то ли оборудование глючит , то ли пакеты не доходят , то ли хер знает что... Потом выяснилось что этот json не ,json вовсе, а какое то выблеванное подобие.

Какой то мудак, изобрел свой протокол обмена.и уволился. Было это лет 10 назад и до сбоя никто про это не знал.

Вся история к тому что , не едите мозги ни себе ни людям .

Конфигурация - yaml ,.env, и куча другой херни

Обмен данными - json, xml и то же готовых форматов ДОХЕРА!

Не нужно пихать хер в точилку!!!!

Очередной смузихлеб запихает это в проект, не дай бог уйдет в прод. А потом этот понос всей команде выгребать. С дикой болью и седым менеджером проекта. Который пытается обяснить директору какого хера парк серверов лежит, когда контора теряет сотни тысяч каждый час.

Так проблема была в том, что был изобретён свой протокол обмена? Или в том, что его изобретатель был мудак? Или в том, что изобретение было нигде не задокументировано и поэтому стало проблемой, когда он уволился? Протокол-то что был - "лучше", "хуже", "такой же, но другой", может, фичи какие-то имел дополнительные, которые нужны были?

Так-то мнение не то что популярное, а общепринятое - не надо изобретать велосипед. Существует готовое решение, устраивает? Бери, пользуйся. А если не устраивает? Можно было бы до сих пор сидеть у пещеры и красный цветок кормить, а то и не кормить, если не одобрят старшие обезьяны, скажут, был тут мудак, развёл костёр и пошёл леопардом съелся.

Хотя, конечно, постановки проблемы в посте автора как-то не хватает - с чего вдруг захотелось изобрести новый JSON, чего в старом так сильно не хватало?

Согласен, есть же формат .ini, идеален для конфигов, читабелен, больше 30 лет формату. Все эти хипстерские json, yml и прочее даже рядом не стоят, но нет же, пихают в проекты, надо показать что все типа по современному.

Лично мне хватило просто перейти на JSON5 (https://json5.org/). Полностью совместим с JSON, плюс: есть комментарии, запятая после последнего элемента массива не является ошибкой, если имя ключа map слово без пробелов, то кавычки можно не ставить, также есть шестнадцатеричные константы и многострочные сроки.

Хотя тут есть возможность иметь переменные и вычислять что-то на лету. Мне это нравится, но пока не было в этом необходимости.

Я для таких целей просто беру Lua c отрезанной частью стандартных библиотек. Одновременно и нормальный ЯП со всеми средствами разработки, и вполне приемлемый синтаксис для конфигурации.

Примечательно, что один из непосредственных предков Lua был как раз языком конфигурации. И это до сих пор отражено в синтаксисе: вызов функции с одним параметром без скобок родом оттуда.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории