als/config

Config Manager Component.


Keywords
config, als, package, parser3
License
MIT

Documentation

Config | master-badge | develop-badge

Config Manager.


Designed to simplify access to configuration data within applications. The configuration data may come from a variety of formats supporting hierarchical data storage. Currently provides adapters that read configuration data stored in INI, JSON and XML files.


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса 'als/config/Config':
$config[^als/config/Config::create[]]


# Π§ΠΈΡ‚Π°Π΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ²:
^config.read[/path/to/config_ini.ini]
^config.read[/path/to/config_xml.xml]
^config.read[/path/to/config_json.json]

# Π’ΠΏΠ΅Ρ€Π΅ΡŒ Π½Π°ΠΌ доступны ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ ΠΈΠ· Π½Π°Π·Π²Π°Π½ΠΈΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²:
$ini[$config.config_ini]
$xml[$config.config_xml]
$json[$config.config_json]

# Π’Π°ΠΊ ΠΆΠ΅ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ доступны:
^config.read[cache;/path/to/cache.ini]
#--> $config.cache

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

# ΠŸΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса 'als/config/Config', ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ с ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°ΠΌΠΈ:
$config[^als/config/Config::create[
    $.root[/path/to/configs]
]]

# Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ², Π½Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ:
^config.read[database.xml]


# Π’Π°ΠΊ, ΠΆΠ΅ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса 'als/config/Config', ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ список
# ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π²ΠΎ врСмя создания экзСмпляра класса:
#
# АргумСнт $.configs[] пСрСдаСтся Π² Π²ΠΈΠ΄Π΅ Ρ…Π΅ΡˆΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ:
#  'ΠΊΠ»ΡŽΡ‡'     - это ΠΊΠ»ΡŽΡ‡ ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄ΡƒΡ‚ доступны Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ класса
#  'Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅' - ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
$config[^als/config/Config::create[
    $.configs[
        $.cache[cache.ini]
        $.database[database.xml]
    ]
]]

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ доступа ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса 'als/config/Config':
$config[^als/config/Config::create[]]

# Π§ΠΈΡ‚Π°ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° 'database.json', со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:
#  {
#    "debug": true,
#    "cache": {
#       "path": "/path/to/database/cache"
#    }
#  }
^config.read[db;/path/to/database.json]

# Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ '$config', ΠΊΠ°ΠΊ ΠΊ Ρ…Π΅ΡˆΡƒ:
$debug($config.db.debug)

# Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ '^get[]' (для раздСлСния влоТСнности ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠΈ):
$path[^config.get[db.cache.path]]

# Если Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ '^get[]' Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ρ‚ΠΎ ΠΎΠ½ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Ρ…Π΅Ρˆ со всСми Ρ€Π°Π½Π΅Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°ΠΌΠΈ:
$configs[^config.get[]]

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ²

Π€ΠΎΡ€ΠΌΠ°Ρ‚ .ini

; Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
# ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π² стилС Unix

# ЗначСния Π±Π΅Π· сСкции
param1=value1 ; ΠΈΠ½ΠΎΠ³Π΄Π° допускаСтся ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ
param2=value2

[section]
; ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π΅
param1=section.value1 # ΠΈΠ½ΠΎΠ³Π΄Π° допускаСтся ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ
param2=section.value2

[section.subsection]
param1=section.subsection.value1
param2=section.subsection.value2

; ΠΈΠ½ΠΎΠ³Π΄Π° позволяСтся ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ
[section.subsection2]
param1=section.subsection2.value1
param2=section.subsection2.value2

[section.subsection2.subsection3]
param1=section.subsection2.subsection3.value1
param2=section.subsection2.subsection3.value2

; Иногда значСния ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚
[section.subsection2.subsection4]

[section.subsection2.subsection5]
param1=
param2=

Π€ΠΎΡ€ΠΌΠ°Ρ‚ .xml

<?xml version="1.0" encoding="UTF-8" ?>
<config>
    <param1>value1</param1>
    <param2>value2</param2>

    <section>
        <param1>section.value1</param1>
        <param2>section.value2</param2>

        <subsection>
            <param1>section.subsection.value1</param1>
            <param2>section.subsection.value2</param2>
        </subsection>

        <subsection2>
            <param1>section.subsection2.value1</param1>
            <param2>section.subsection2.value2</param2>

            <subsection3>
                <param1>section.subsection2.subsection3.value1</param1>
                <param2>section.subsection2.subsection3.value2</param2>
            </subsection3>

            <subsection4></subsection4>

            <subsection5>
                <param1></param1>
                <param2></param2>
            </subsection5>
        </subsection2>
    </section>
</config>

Π€ΠΎΡ€ΠΌΠ°Ρ‚ .json

{
  "param1": "value1",
  "param2": "value2",

  "section": {
    "param1": "section.value1",
    "param2": "section.value2",

    "subsection": {
      "param1": "section.subsection.value1",
      "param2": "section.subsection.value2"
    },

    "subsection2": {
      "param1": "section.subsection2.value1",
      "param2": "section.subsection2.value2",

      "subsection3": {
        "param1": "section.subsection2.subsection3.value1",
        "param2": "section.subsection2.subsection3.value2"
      },

      "subsection4": {},

      "subsection5": {
        "param1": "",
        "param2": ""
      }
    }
  }
}

TODO

  • ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ "@parse[]", Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π΅Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ².
  • ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ "@save[]", Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ.
  • ΠŸΠ°Ρ€ΡΠΈΠ½Π³ Π°Ρ‚Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² XML, сСйчас ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° '.xml' парсятся Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π΅ Π°Ρ‚Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

References