Skip to content
This repository was archived by the owner on Sep 21, 2022. It is now read-only.

Add 'update' command#339

Merged
sipayRT merged 2 commits intomasterfrom
sipayrt.update
Dec 18, 2015
Merged

Add 'update' command#339
sipayRT merged 2 commits intomasterfrom
sipayrt.update

Conversation

@sipayRT
Copy link
Copy Markdown
Member

@sipayRT sipayRT commented Dec 15, 2015

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Метод не использует ничего, что предоставляет инстанс класса. Нужно сделать статическим.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тогда вместо this.getStateData придется писать что-то типа this.__self.getStateData

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

почему? Сделать его методом класса и писать CaptureProcessor._getStateData(). Что за self?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ты будешь звать его в наследниках, а там хз от кого ты отнаследовался, все время подключать capture-processor - не айс. __self - это ссылка на класс в инстансе

@SwinX
Copy link
Copy Markdown
Contributor

SwinX commented Dec 15, 2015

Начало про refPath и окончание про резолв промиса с какими-то данными одинаково для new-updaterа и diff-updaterа. Нужно бы подумать, как это вынести в базовый класс.

Идея такая: базовый screen-updater делает какой-то warm-up вроде вычисление refPath (может что-то ещё, короче всё общее), отдает эти данные в protected-метод, например _doProcessCapture и в конце цепляется на вернувшийся из _doProcessCapture промис, завершая цепочку отдачей данных.

Как видится реализация:

processCapture: function(capture) {
    var _this = this;
    this._prepareToProcessCapture()
        .then(function(prepared) {
            return _this._doProcessCapture(prepared, capture);
        })
        .thenResolve(this._getStateData(prepared.path, capture));
}

Ещё 1 профит от такого рефакторинга - эти данные не будут считаться 2 раза в meta-updaterе

@SwinX
Copy link
Copy Markdown
Contributor

SwinX commented Dec 15, 2015

Кстати, а зачем вообще остался screen-shooter? В теории всё, что он раньше делал, теперь должен делать new-updater.

@sipayRT
Copy link
Copy Markdown
Member Author

sipayRT commented Dec 15, 2015

Кстати, а зачем вообще остался screen-shooter? В теории всё, что он раньше делал, теперь должен делать new-updater

только потому что буду его выпиливать отдельным коммитом. Изначально я надеялся сделать это все до v2.0.0, поэтому нарочно его не трогал

@SwinX
Copy link
Copy Markdown
Contributor

SwinX commented Dec 15, 2015

< captain mode > нужно покрыть тестами</ captain mode >

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

else не нужен. Ну и в принципе этот if тоже не нужен

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

если if вообще убрать, то получится такая ситуация, при которой я напишу любую опцию и мне вернется NewUpdater. Типа, gemini update --some запустится как с опцией --new. Мы хотим такого поведения?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ну вообще, это бы на уровне commander'а сделать, типа Unknown option

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

как это правильно сделать? у нас сейчас в commander'е включена опция allowUnknownOption, чтобы можно было передавать опции для gemini дальше. отключить мы ее не можем.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ну тогда:

if (opts.diff && !opts.new) {
    return DiffUpdater
}

if (!opts.diff && opts.new) {
    return new NewUpdater
}

return MetaUpdater

и хоть трава не расти

@j0tunn
Copy link
Copy Markdown
Contributor

j0tunn commented Dec 16, 2015

Идея такая: базовый screen-updater делает какой-то warm-up вроде вычисление refPath (может что-то ещё, короче всё общее), отдает эти данные в protected-метод, например _doProcessCapture и в конце цепляется на вернувшийся из _doProcessCapture промис, завершая цепочку отдачей данных.

Это паттерн template method. И да, он сюда просится

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а не будет проблем, что это вызывается в двух местах?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

он только трекает все изменения темповой директории. Ну и тестер не будет вызываться, когда используется update

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

нехорошо использовать чужие private/protected методы. MetaUpdater можно унаследовать от CaptureProcessor и переопределить processCapture

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хотя блин, тогда вся общая логика будет повторяться два раза

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ладно, пускай будет как есть

@j0tunn
Copy link
Copy Markdown
Contributor

j0tunn commented Dec 18, 2015

На meta-updater можно написать только те тесты, которых нет в двух других - типа что там все не запускается по два раза. Ну и еще несколько комплексных: типа 'если есть diff и есть тест без эталона', или 'есть diff, но нет теста без эталона', 'нет diff'а, но есть тест без эталона', 'нет нихрена'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

не зачем, лучше сразу в тестах писать ImageProcessor.prototype.blabla.returns... тогда сразу понятно, что любой инстанс вернет такое значение

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я ее создал, чтобы мне было удобней и короче писать :(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

короче - не всегда понятнее
Если ты видешь в коде теста:

ImageProcessor.prototype.blaBla.returns(true);

то сразу становится понятно, что любой инстанс ImageProcessor'а при вызове blaBla вернет true

А если видишь

imageProcessor.blaBla.returns(true);

то нужно узнать, что это за imageProcessor такой (причем создается впечатление, что как раз и есть какой-то конкретный инстанс), где он создается, кем возвращается

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants