<commit_before>var vow = require('vow'),
    MagicHelper = require('./magic-helper'),
    STATES = {
        INITIALIZED: 'initialized',
        RUNNING: 'running',
        FULFILLED: 'fulfilled',
        FAILED: 'failed'
    };

/**
 * Фабрика позволяет создавать конфигураторы, помогающие описывать процесс создания новых нод и таргетов. Конфигураторы
 * декларируют процесс создания новых нод и таргетов в тасках.
 *
 * Для удобства использования тасков, создающих ноды и таргеты в процессе выполнения сборки, регистрируется специальный
 * мета-таск, аргументами которого являются ноды или таргеты, которые могут быть не созданы на файловой системе
 * и не задекларированы посредством `ProjectConfig` до запуска процесса сборки.
 *
 * Мета-таск инкапсулирует в себе знания о всех тасках, которые будут зарегистрированы с помощью хелперов, созданных
 * посредством данного модуля. Название этого таска задаётся через переменную окружения `process.env.ENB_MAGIC_TASK`.
 * По умолчанию мета-таск имеет название `__magic__`.
 *
 * @name MagicFactory
 * @param {ProjectConfig} projectConfig
 * @constructor
 */
function MagicFactory(projectConfig) {
    this._state = STATES.INITIALIZED;
    this._projectConfig = projectConfig;
    this._helpers = {};
    this._channels = {};

    this._magicTaskName = process.env.ENB_MAGIC_TASK || '__magic__';
    this._configureMagicTask();
}

/**
 * Создаёт хэлпер.
 *
 * @param {String} taskName
 * @returns {MagicHelper}
 */
MagicFactory.prototype.createHelper = function (taskName) {
    var helper = new MagicHelper(taskName, this._projectConfig);

    this._helpers[taskName] = helper;
    this._channels[taskName] = helper.getEventChannel();

    return helper;
};

/**
 * Возвращает хэлпер по названию таска.
 *
 * @param {String} taskName
 * @returns {MagicHelper}
 */
MagicFactory.prototype.getHelper = function (taskName) {
    return this._helpers[taskName];
};

/**
 * Возвращает канал событий по названию таска.
 *
 * @param {String} taskName
 * @returns {EventEmitter}
 */
MagicFactory.prototype.getEventChannel = function (taskName) {
    return this._channels[taskName];
};

/**
 * Возвращает состояние мета-таска.
 *
 * `initialized` — проинициализирован (не запускался ранее).
 * `running` — выполняется.
 * `fulfilled` — успешно завершил работу.
 * `failed` — завершил работу с ошибкой.
 *
 * @returns {String}
 */
MagicFactory.prototype.getMetaTaskState = function () {
    return this._state;
};

MagicFactory.prototype._configureMagicTask = function () {
    var _this = this;

    this._projectConfig.task(this._magicTaskName, function (task) {
        var taskNames = Object.keys(_this._helpers),
            args = [].slice.call(arguments, 1),
            makePlatform = task.getMakePlatform();

        _this._state = STATES.RUNNING;

        return vow.all(taskNames.map(function (taskName) {
                return makePlatform.buildTask(taskName, args);<commit_msg>Added `getTaskNames` method to `MagicFactory`<commit_after>var vow = require('vow'),
    MagicHelper = require('./magic-helper'),
    STATES = {
        INITIALIZED: 'initialized',
        RUNNING: 'running',
        FULFILLED: 'fulfilled',
        FAILED: 'failed'
    };

/**
 * Фабрика позволяет создавать конфигураторы, помогающие описывать процесс создания новых нод и таргетов. Конфигураторы
 * декларируют процесс создания новых нод и таргетов в тасках.
 *
 * Для удобства использования тасков, создающих ноды и таргеты в процессе выполнения сборки, регистрируется специальный
 * мета-таск, аргументами которого являются ноды или таргеты, которые могут быть не созданы на файловой системе
 * и не задекларированы посредством `ProjectConfig` до запуска процесса сборки.
 *
 * Мета-таск инкапсулирует в себе знания о всех тасках, которые будут зарегистрированы с помощью хелперов, созданных
 * посредством данного модуля. Название этого таска задаётся через переменную окружения `process.env.ENB_MAGIC_TASK`.
 * По умолчанию мета-таск имеет название `__magic__`.
 *
 * @name MagicFactory
 * @param {ProjectConfig} projectConfig
 * @constructor
 */
function MagicFactory(projectConfig) {
    this._state = STATES.INITIALIZED;
    this._projectConfig = projectConfig;
    this._taskNames = {};
    this._helpers = {};
    this._channels = {};

    this._magicTaskName = process.env.ENB_MAGIC_TASK || '__magic__';
    this._configureMagicTask();
}

/**
 * Создаёт хэлпер.
 *
 * @param {String} taskName
 * @returns {MagicHelper}
 */
MagicFactory.prototype.createHelper = function (taskName) {
    var helper = new MagicHelper(taskName, this._projectConfig);

    this._taskNames[taskName] = true;
    this._helpers[taskName] = helper;
    this._channels[taskName] = helper.getEventChannel();

    return helper;
};

/**
 * Возвращает хэлпер по названию таска.
 *
 * @param {String} taskName
 * @returns {MagicHelper}
 */
MagicFactory.prototype.getHelper = function (taskName) {
    return this._helpers[taskName];
};

/**
 * Возвращает канал событий по названию таска.
 *
 * @param {String} taskName
 * @returns {EventEmitter}
 */
MagicFactory.prototype.getEventChannel = function (taskName) {
    return this._channels[taskName];
};

/**
 * Возвращает состояние мета-таска.
 *
 * `initialized` — проинициализирован (не запускался ранее).
 * `running` — выполняется.
 * `fulfilled` — успешно завершил работу.
 * `failed` — завершил работу с ошибкой.
 *
 * @returns {String}
 */
MagicFactory.prototype.getMetaTaskState = function () {
    return this._state;
};

/**
 * Возвращает список тасков, которые используются в мета-таске.
 *
 * @returns {String[]}
 */
MagicFactory.prototype.getTaskNames = function () {
    return Object.keys(this._taskNames);
};

MagicFactory.prototype._configureMagicTask = function () {
    var _this = this;

    this._projectConfig.task(this._magicTaskName, function (task) {
        var taskNames = _this.getTaskNames(),
            args = [].slice.call(arguments, 1),
            makePlatform = task.getMakePlatform();

        _this._state = STATES.RUNNING;

        return vow.all(taskNames.map(function (taskName) {
                return makePlatform.buildTask(taskName, args);
{'fraction_non_alphanumeric': 0.1099544567338972, 'fraction_numerical': 0.00032530904359141186, 'mean_word_length': 3.8531965272296764, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1736804', 'n_tokens_mistral': 2081, 'n_tokens_neox': 2340, 'n_words': 477}