now .readMetadata() is implemented via core.tasks...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2020-12-02 04:47:53 +03:00
parent fa8b6d57cd
commit 2a75ed6530
4 changed files with 37 additions and 34 deletions

View File

@ -35,7 +35,8 @@
* - workspace * - workspace
* XXX needs revision... * XXX needs revision...
* - tasks * - tasks
* XXX not yet used * tasks -- manage long running actions
* queue -- manage lots of small actions as a single task
* - self-test * - self-test
* basic framework for running test actions at startup... * basic framework for running test actions at startup...
* *
@ -2494,11 +2495,25 @@ function(func){
func.__queued__ = true func.__queued__ = true
return func } return func }
//
// queuedAction(name, func)
// queuedAction(name, options, func)
// -> action
//
// func(..)
// -> res
//
// action(..)
// -> promise(res)
//
//
// NOTE: for examples see: // NOTE: for examples see:
// features/examples.js: // features/examples.js:
// ExampleActions.exampleQueuedAction(..) // ExampleActions.exampleQueuedAction(..)
// ExampleActions.exampleMultipleQueuedAction(..) // ExampleActions.exampleMultipleQueuedAction(..)
//
// XXX need to pass a nice log prompt...
// XXX can we return anything other than a promise here???
// XXX the general use-case here is to call the queue method multiple // XXX the general use-case here is to call the queue method multiple
// times for instance to handle array elements, might be nice to // times for instance to handle array elements, might be nice to
// automate this... // automate this...
@ -2514,9 +2529,13 @@ function(name, func){
return object.mixin( return object.mixin(
Queued(function(...args){ Queued(function(...args){
var that = this var that = this
return this.queue(name, opts || {}) // XXX handle errors... (???)
.push(function(){ return new Promise(function(resolve, reject){
return func.call(that, ...args) }) }), that.queue(name, opts || {})
.push(function(){
var res = func.call(that, ...args)
resolve(res)
return res }) }) }),
{ {
toString: function(){ toString: function(){
return `core.queuedAction('${name}',\n\t${ return `core.queuedAction('${name}',\n\t${
@ -2547,10 +2566,8 @@ function(func){
// var action = taskAction('some title', 'sync', function(..){ .. }) // var action = taskAction('some title', 'sync', function(..){ .. })
// or // or
// var action = taskAction('sync', 'some title', function(..){ .. }) // var action = taskAction('sync', 'some title', function(..){ .. })
//
// and on call: // and on call:
// action('sync', ..) // action('sync', ..)
//
// during the later form 'sync' is passed to .Task(..) in the correct // during the later form 'sync' is passed to .Task(..) in the correct
// position... // position...
// (see ig-types' runner.TaskManager(..) for more info) // (see ig-types' runner.TaskManager(..) for more info)
@ -2588,6 +2605,7 @@ function(title, func){
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// XXX add a task manager UI... // XXX add a task manager UI...
// XXX do we need to cache the lister props???
var TaskActions = actions.Actions({ var TaskActions = actions.Actions({
config: { config: {
}, },

View File

@ -270,7 +270,7 @@ var ExampleActions = actions.Actions({
// Tasks... // Tasks...
exampleQueuedAction: ['- Test/', exampleQueuedAction: ['- Test/',
core.queuedAction('exampleQueuedAction', function(timeout=500, ...args){ core.queuedAction('exampleQueuedAction', {quiet: true}, function(timeout=500, ...args){
console.log('Queued action!!', ...args) console.log('Queued action!!', ...args)
return new Promise(function(resolve){ return new Promise(function(resolve){
setTimeout(resolve, timeout) }) })], setTimeout(resolve, timeout) }) })],

View File

@ -119,7 +119,7 @@ var MetadataReaderActions = actions.Actions({
NOTE: also see: .cacheMetadata(..) NOTE: also see: .cacheMetadata(..)
`, `,
function(image, force){ core.queuedAction('readMetadata', function(image, force){
var that = this var that = this
var gid = this.data.getImage(image) var gid = this.data.getImage(image)
@ -179,33 +179,15 @@ var MetadataReaderActions = actions.Actions({
that.markChanged that.markChanged
&& that.markChanged('images', [gid]) } && that.markChanged('images', [gid]) }
resolve(data) }) }) }) }], resolve(data) }) }) }) })],
// XXX make this abortable...
// XXX STUB: add support for this to .readMetadata(..)
readAllMetadata: ['File/Read all metadata', readAllMetadata: ['File/Read all metadata',
function(){ function(){
var that = this var that = this
// XXX make this a global API... //var logger = this.logger && this.logger.push('Read metadata')
var q = this.__reader_queue = this.__reader_queue || tasks.Queue() return this.images.keys()
.mapChunks(7, function(gid){
var logger = this.logger && this.logger.push('Read metadata') return that.readMetadata(gid) }) }],
// XXX is this the right way to go???
q.on('taskQueued', function(t){ logger.emit('queued', t) })
q.on('taskDone', function(t){ logger.emit('done', t) })
q.on('taskFailed', function(t){ logger.emit('error', t) })
var read = function(gid){
return function(){ return that.readMetadata(gid) } }
q.start()
this.images
&& this.images.forEach(function(gid){
q.enqueue('metadata', read(gid)) })
return q }],
// XXX take image Metadata and write it to target... // XXX take image Metadata and write it to target...
writeMetadata: ['- Image/Set metadata data', writeMetadata: ['- Image/Set metadata data',

View File

@ -447,10 +447,9 @@ module.ImagesPrototype = {
for(e of this){ for(e of this){
yield e } }, yield e } },
// XXX remove version...
keys: function(){ keys: function(){
var keys = Object.keys(this) var keys = Object.keys(this)
var i = keys.indexOf('version') var i = keys.lastIndexOf('version')
i >= 0 i >= 0
&& keys.splice(i, 1) && keys.splice(i, 1)
return keys }, return keys },
@ -557,6 +556,7 @@ module.ImagesPrototype = {
size: preview_size, size: preview_size,
} }, } },
// Get image filename... // Get image filename...
// //
// NOTE: this will default to gid if not filename (.path) is set... (???) // NOTE: this will default to gid if not filename (.path) is set... (???)
@ -604,7 +604,9 @@ module.ImagesPrototype = {
return this return this
}, },
// Gid sorters... // Gid sorters...
//
// XXX might be a good idea to add caching... // XXX might be a good idea to add caching...
// XXX chainCmp(..) is loaded from lib/jli.js // XXX chainCmp(..) is loaded from lib/jli.js
sortImages: function(gids, cmp, reverse){ sortImages: function(gids, cmp, reverse){
@ -626,6 +628,7 @@ module.ImagesPrototype = {
// XXX see ../ui/sort.js // XXX see ../ui/sort.js
}, },
// Actions... // Actions...
// Rotate image... // Rotate image...