fable 3.0.118 → 3.0.120

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fable",
3
- "version": "3.0.118",
3
+ "version": "3.0.120",
4
4
  "description": "Anentity behavior management and API bundling library.",
5
5
  "main": "source/Fable.js",
6
6
  "scripts": {
@@ -50,7 +50,7 @@
50
50
  },
51
51
  "homepage": "https://github.com/stevenvelozo/fable",
52
52
  "devDependencies": {
53
- "quackage": "^1.0.25"
53
+ "quackage": "^1.0.29"
54
54
  },
55
55
  "dependencies": {
56
56
  "async.eachlimit": "^0.5.2",
@@ -59,12 +59,12 @@
59
59
  "cachetrax": "^1.0.4",
60
60
  "cookie": "^0.6.0",
61
61
  "data-arithmatic": "^1.0.7",
62
- "dayjs": "^1.11.10",
62
+ "dayjs": "^1.11.11",
63
63
  "fable-log": "^3.0.13",
64
- "fable-serviceproviderbase": "^3.0.12",
64
+ "fable-serviceproviderbase": "^3.0.13",
65
65
  "fable-settings": "^3.0.9",
66
66
  "fable-uuid": "^3.0.6",
67
- "manyfest": "^1.0.28",
67
+ "manyfest": "^1.0.29",
68
68
  "simple-get": "^4.0.1"
69
69
  }
70
70
  }
package/source/Fable.js CHANGED
@@ -75,9 +75,9 @@ class Fable extends libFableServiceBase.CoreServiceProviderBase
75
75
  this.addServiceType('RestClient', require('./services/Fable-Service-RestClient.js'));
76
76
  this.addServiceType('Manifest', require('manyfest'));
77
77
  this.addServiceType('ObjectCache', require('cachetrax'));
78
- this.addServiceType('Operation', require('./services/Fable-Service-Operation.js'));
79
- this.addServiceType('ProgressTracker', require('./services/Fable-Service-ProgressTracker.js'));
80
78
  this.addAndInstantiateServiceType('ProgressTime', require('./services/Fable-Service-ProgressTime.js'));
79
+ this.addServiceType('ProgressTrackerSet', require('./services/Fable-Service-ProgressTrackerSet.js'));
80
+ this.addServiceType('Operation', require('./services/Fable-Service-Operation.js'));
81
81
  this.addServiceType('CSVParser', require('./services/Fable-Service-CSVParser.js'));
82
82
  this.addServiceType('FilePersistence', require('./services/Fable-Service-FilePersistence.js'));
83
83
  }
@@ -27,9 +27,9 @@ class FableOperation extends libFableServiceBase
27
27
  this.state.Metadata.Name = (typeof(this.options.Name) == 'string') ? this.options.Name : `Unnamed Operation ${this.state.Metadata.UUID}`;
28
28
  this.name = this.state.Metadata.Name;
29
29
 
30
- this.progressTrackers = this.fable.instantiateServiceProviderWithoutRegistration('ProgressTracker');
30
+ this.progressTrackerSet = this.fable.instantiateServiceProviderWithoutRegistration('ProgressTrackerSet');
31
31
 
32
- this.state.OverallProgressTracker = this.progressTrackers.createProgressTracker(`Overall-${this.state.Metadata.UUID}`);
32
+ this.state.OverallProgressTracker = this.progressTrackerSet.createProgressTracker(`Overall-${this.state.Metadata.UUID}`);
33
33
 
34
34
  // This is here to use the pass-through logging functions in the operation itself.
35
35
  this.log = this;
@@ -45,8 +45,8 @@ class FableOperation extends libFableServiceBase
45
45
 
46
46
  let tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');
47
47
 
48
- this.progressTrackers.setProgressTrackerTotalOperations(this.state.OverallProgressTracker.Hash, this.state.Status.StepCount);
49
- this.progressTrackers.startProgressTracker(this.state.OverallProgressTracker.Hash);
48
+ this.progressTrackerSet.setProgressTrackerTotalOperations(this.state.OverallProgressTracker.Hash, this.state.Status.StepCount);
49
+ this.progressTrackerSet.startProgressTracker(this.state.OverallProgressTracker.Hash);
50
50
  this.info(`Operation [${this.state.Metadata.UUID}] ${this.state.Metadata.Name} starting...`);
51
51
 
52
52
  for (let i = 0; i < this.state.Steps.length; i++)
@@ -55,7 +55,7 @@ class FableOperation extends libFableServiceBase
55
55
  function(fNext)
56
56
  {
57
57
  this.fable.log.info(`Step #${i} [${this.state.Steps[i].GUIDStep}] ${this.state.Steps[i].Name} starting...`);
58
- this.progressTrackers.startProgressTracker(this.state.Steps[i].ProgressTracker.Hash);
58
+ this.progressTrackerSet.startProgressTracker(this.state.Steps[i].ProgressTracker.Hash);
59
59
  return fNext();
60
60
  }.bind(this));
61
61
  // Steps are executed in a custom context with
@@ -65,26 +65,10 @@ class FableOperation extends libFableServiceBase
65
65
  fable:this.fable,
66
66
  options:this.state.Steps[i].Metadata,
67
67
  metadata:this.state.Steps[i].Metadata,
68
- ProgressTracker:this.progressTrackers.getProgressTracker(this.state.Steps[i].ProgressTracker.Hash),
69
- updateProgressTracker: function(pProgressAmount)
70
- {
71
- return this.progressTrackers.updateProgressTracker(this.state.Steps[i].ProgressTracker.Hash, pProgressAmount);
72
- }.bind(this),
73
- incrementProgressTracker: function(pProgressIncrementAmount)
74
- {
75
- return this.progressTrackers.incrementProgressTracker(this.state.Steps[i].ProgressTracker.Hash, pProgressIncrementAmount);
76
- }.bind(this),
77
- setProgressTrackerTotalOperations: function(pTotalOperationCount)
78
- {
79
- return this.progressTrackers.setProgressTrackerTotalOperations(this.state.Steps[i].ProgressTracker.Hash, pTotalOperationCount);
80
- }.bind(this),
81
- getProgressTrackerStatusString: function()
82
- {
83
- return this.progressTrackers.getProgressTrackerStatusString(this.state.Steps[i].ProgressTracker.Hash);
84
- }.bind(this),
68
+ ProgressTracker:this.progressTrackerSet.getProgressTracker(this.state.Steps[i].ProgressTracker.Hash),
85
69
  logProgressTrackerStatus: function()
86
70
  {
87
- return this.log.info(`Step #${i} [${this.state.Steps[i].GUIDStep}]: ${this.progressTrackers.getProgressTrackerStatusString(this.state.Steps[i].ProgressTracker.Hash)}`);
71
+ return this.log.info(`Step #${i} [${this.state.Steps[i].GUIDStep}]: ${this.progressTrackerSet.getProgressTrackerStatusString(this.state.Steps[i].ProgressTracker.Hash)}`);
88
72
  }.bind(this),
89
73
  OperationState:this.state,
90
74
  StepState:this.state.Steps[i]
@@ -92,13 +76,13 @@ class FableOperation extends libFableServiceBase
92
76
  tmpAnticipate.anticipate(
93
77
  function(fNext)
94
78
  {
95
- this.progressTrackers.endProgressTracker(this.state.Steps[i].ProgressTracker.Hash);
96
- let tmpStepTimingMessage = this.progressTrackers.getProgressTrackerStatusString(this.state.Steps[i].ProgressTracker.Hash);
79
+ this.progressTrackerSet.endProgressTracker(this.state.Steps[i].ProgressTracker.Hash);
80
+ let tmpStepTimingMessage = this.progressTrackerSet.getProgressTrackerStatusString(this.state.Steps[i].ProgressTracker.Hash);
97
81
  this.fable.log.info(`Step #${i} [${this.state.Steps[i].GUIDStep}] ${this.state.Steps[i].Name} complete.`);
98
82
  this.fable.log.info(`Step #${i} [${this.state.Steps[i].GUIDStep}] ${this.state.Steps[i].Name} ${tmpStepTimingMessage}.`);
99
83
 
100
- this.progressTrackers.incrementProgressTracker(this.state.OverallProgressTracker.Hash, 1);
101
- let tmpOperationTimingMessage = this.progressTrackers.getProgressTrackerStatusString(this.state.OverallProgressTracker.Hash);
84
+ this.progressTrackerSet.incrementProgressTracker(this.state.OverallProgressTracker.Hash, 1);
85
+ let tmpOperationTimingMessage = this.progressTrackerSet.getProgressTrackerStatusString(this.state.OverallProgressTracker.Hash);
102
86
  this.fable.log.info(`Operation [${this.state.Metadata.UUID}] ${tmpOperationTimingMessage}.`);
103
87
  return fNext();
104
88
  }.bind(this));
@@ -114,13 +98,20 @@ class FableOperation extends libFableServiceBase
114
98
  return fExecutionCompleteCallback(pError);
115
99
  }
116
100
  this.info(`Operation [${this.state.Metadata.UUID}] ${this.state.Metadata.Name} complete.`);
117
- let tmpOperationTimingMessage = this.progressTrackers.getProgressTrackerStatusString(this.state.OverallProgressTracker.Hash);
118
- this.progressTrackers.endProgressTracker(this.state.OverallProgressTracker.Hash);
101
+ let tmpOperationTimingMessage = this.progressTrackerSet.getProgressTrackerStatusString(this.state.OverallProgressTracker.Hash);
102
+ this.progressTrackerSet.endProgressTracker(this.state.OverallProgressTracker.Hash);
119
103
  this.fable.log.info(`Operation [${this.state.Metadata.UUID}] ${tmpOperationTimingMessage}.`);
120
104
  return fExecutionCompleteCallback();
121
105
  });
122
106
  }
123
107
 
108
+ // There are three ways to add steps:
109
+ // 1. As a basic javascript function
110
+ // --
111
+ // This is the most basic, java"script" way to add a step. It will
112
+ // setup a "this" context that has the following properties:
113
+ // - log: A reference to the operation's log object
114
+
124
115
  addStep(fStepFunction, pStepMetadata, pStepName, pStepDescription, pGUIDStep)
125
116
  {
126
117
  let tmpStep = {};
@@ -133,7 +124,7 @@ class FableOperation extends libFableServiceBase
133
124
  tmpStep.Name = (typeof(pStepName) !== 'undefined') ? pStepName : `Step [${tmpStep.GUIDStep}]`;
134
125
  tmpStep.Description = (typeof(pStepDescription) !== 'undefined') ? pStepDescription : `Step execution of ${tmpStep.Name}.`;
135
126
 
136
- tmpStep.ProgressTracker = this.progressTrackers.createProgressTracker(tmpStep.GUIDStep);
127
+ tmpStep.ProgressTracker = this.progressTrackerSet.createProgressTracker(tmpStep.GUIDStep);
137
128
 
138
129
  tmpStep.Metadata = (typeof(pStepMetadata) === 'object') ? pStepMetadata : {};
139
130
 
@@ -156,7 +147,7 @@ class FableOperation extends libFableServiceBase
156
147
  return new Error(`Step [${pGUIDStep}] does not exist in operation [${this.state.Metadata.UUID}] ${this.state.Metadata.Name} when attempting to set total operations to ${pTotalOperationCount}.`);
157
148
  }
158
149
 
159
- this.progressTrackers.setProgressTrackerTotalOperations(this.stepMap[pGUIDStep].ProgressTracker.Hash, pTotalOperationCount);
150
+ this.progressTrackerSet.setProgressTrackerTotalOperations(this.stepMap[pGUIDStep].ProgressTracker.Hash, pTotalOperationCount);
160
151
  }
161
152
 
162
153
  writeOperationLog(pLogLevel, pLogText, pLogObject)
@@ -0,0 +1,32 @@
1
+ class ProgressTracker
2
+ {
3
+ constructor(pProgressTrackerSet, pProgressTrackerHash)
4
+ {
5
+ this.progressTrackerSet = pProgressTrackerSet;
6
+ this.progressTrackerHash = pProgressTrackerHash;
7
+
8
+ this.data = this.progressTrackerSet.getProgressTrackerData(this.progressTrackerHash);
9
+ }
10
+
11
+ updateProgressTracker(pProgressAmount)
12
+ {
13
+ return this.progressTrackerSet.updateProgressTracker(this.progressTrackerHash, pProgressAmount);
14
+ }
15
+
16
+ incrementProgressTracker(pProgressIncrementAmount)
17
+ {
18
+ return this.progressTrackerSet.incrementProgressTracker(this.progressTrackerHash, pProgressIncrementAmount);
19
+ }
20
+
21
+ setProgressTrackerTotalOperations(pTotalOperationCount)
22
+ {
23
+ return this.progressTrackerSet.setProgressTrackerTotalOperations(this.progressTrackerHash, pTotalOperationCount);
24
+ }
25
+
26
+ getProgressTrackerStatusString()
27
+ {
28
+ return this.progressTrackerSet.getProgressTrackerStatusString(this.progressTrackerHash);
29
+ }
30
+ }
31
+
32
+ module.exports = ProgressTracker;
@@ -1,12 +1,14 @@
1
1
  const libFableServiceBase = require('fable-serviceproviderbase');
2
2
 
3
- class FableServiceProgressTracker extends libFableServiceBase
3
+ const libProgressTrackerClass = require('./Fable-Service-ProgressTracker/ProgressTracker.js');
4
+
5
+ class FableServiceProgressTrackerSet extends libFableServiceBase
4
6
  {
5
7
  constructor(pFable, pOptions, pServiceHash)
6
8
  {
7
9
  super(pFable, pOptions, pServiceHash);
8
10
 
9
- this.serviceType = 'ProgressTracker';
11
+ this.serviceType = 'ProgressTrackerSet';
10
12
 
11
13
  this.progressTrackers = {};
12
14
 
@@ -27,6 +29,19 @@ class FableServiceProgressTracker extends libFableServiceBase
27
29
  this.createProgressTracker(tmpProgressTrackerHash, 100);
28
30
  }
29
31
 
32
+ return new libProgressTrackerClass(this, pProgressTrackerHash);
33
+ }
34
+
35
+ getProgressTrackerData(pProgressTrackerHash)
36
+ {
37
+ let tmpProgressTrackerHash = (typeof(pProgressTrackerHash) == 'string') ? pProgressTrackerHash : 'Default';
38
+
39
+ if (!this.progressTrackers.hasOwnProperty(tmpProgressTrackerHash))
40
+ {
41
+ this.fable.log.warn(`ProgressTracker ${tmpProgressTrackerHash} does not exist! Creating a new tracker...`);
42
+ this.createProgressTracker(tmpProgressTrackerHash, 100);
43
+ }
44
+
30
45
  return this.progressTrackers[tmpProgressTrackerHash];
31
46
  }
32
47
 
@@ -337,7 +352,7 @@ class FableServiceProgressTracker extends libFableServiceBase
337
352
  // 4. Done
338
353
  else
339
354
  {
340
- return `ProgressTracker ${tmpProgressTracker.Hash} is done. It completed ${tmpProgressTracker.CurrentCount} / ${tmpProgressTracker.TotalCount} operations in ${this.progressTimes.formatTimeDuration(tmpProgressTracker.ElapsedTime)} (median ${this.progressTimes.formatTimeDuration(tmpProgressTracker.AverageOperationTime)} per).`;
355
+ return `ProgressTracker ${tmpProgressTracker.Hash} is done. ${tmpProgressTracker.CurrentCount} / ${tmpProgressTracker.TotalCount} operations were completed in ${this.progressTimes.formatTimeDuration(tmpProgressTracker.ElapsedTime)} (median ${this.progressTimes.formatTimeDuration(tmpProgressTracker.AverageOperationTime)} per).`;
341
356
  }
342
357
  }
343
358
  }
@@ -348,4 +363,4 @@ class FableServiceProgressTracker extends libFableServiceBase
348
363
  }
349
364
  }
350
365
 
351
- module.exports = FableServiceProgressTracker;
366
+ module.exports = FableServiceProgressTrackerSet;
@@ -115,7 +115,7 @@ suite
115
115
  () =>
116
116
  {
117
117
  this.log.info(`Work done for iteration ${i}.`);
118
- this.incrementProgressTracker(1);
118
+ this.ProgressTracker.incrementProgressTracker(1);
119
119
  this.logProgressTrackerStatus();
120
120
  return fWorkComplete();
121
121
  }, tmpDelay);
@@ -131,7 +131,7 @@ suite
131
131
  {
132
132
  let tmpShortOperationCount = 300;
133
133
 
134
- this.setProgressTrackerTotalOperations(tmpShortOperationCount);
134
+ this.ProgressTracker.setProgressTrackerTotalOperations(tmpShortOperationCount);
135
135
  this.logProgressTrackerStatus();
136
136
 
137
137
  let tmpAnticipate = testFable.newAnticipate();
@@ -146,7 +146,7 @@ suite
146
146
  () =>
147
147
  {
148
148
  this.log.info(`Leetle work done for iteration ${i}.`);
149
- this.incrementProgressTracker(1);
149
+ this.ProgressTracker.incrementProgressTracker(1);
150
150
  this.logProgressTrackerStatus();
151
151
  return fWorkComplete();
152
152
  }, tmpDelay);
@@ -13,7 +13,7 @@ var Expect = Chai.expect;
13
13
 
14
14
  suite
15
15
  (
16
- 'Progress Tracker Tests',
16
+ 'Progress Tracker Set Tests',
17
17
  function()
18
18
  {
19
19
  suite
@@ -28,7 +28,7 @@ suite
28
28
  {
29
29
  let testFable = new libFable();
30
30
 
31
- let tmpProgressTracker = testFable.instantiateServiceProvider('ProgressTracker');
31
+ let tmpProgressTracker = testFable.instantiateServiceProvider('ProgressTrackerSet');
32
32
 
33
33
  Expect(tmpProgressTracker).to.be.an('object');
34
34
  Expect(tmpProgressTracker).to.have.property('incrementProgressTracker');
@@ -36,6 +36,83 @@ suite
36
36
  return fDone();
37
37
  }
38
38
  );
39
+ test
40
+ (
41
+ 'Simple Progress Tracker',
42
+ function(fTestComplete)
43
+ {
44
+ let testFable = new libFable();
45
+ let tmpProgressTracker = testFable.instantiateServiceProvider('ProgressTrackerSet');
46
+
47
+ tmpProgressTracker.createProgressTracker('TestTracker', 200);
48
+ tmpProgressTracker.logProgressTrackerStatus('TestTracker');
49
+
50
+ let tmpAnticipate = testFable.newAnticipate();
51
+
52
+ tmpAnticipate.anticipate(
53
+ function (fDone)
54
+ {
55
+ let tmpWaitTime = Math.floor(Math.random() * 10) + 10;
56
+ this.log.trace(`Starting tracker in ${tmpWaitTime}ms...`);
57
+ setTimeout(
58
+ () =>
59
+ {
60
+ testFable.ProgressTrackerSet.startProgressTracker('TestTracker');
61
+ testFable.ProgressTrackerSet.logProgressTrackerStatus('TestTracker');
62
+ return fDone();
63
+ }, tmpWaitTime);
64
+ }.bind(testFable));
65
+
66
+ for (let i = 0; i < 201; i++)
67
+ {
68
+ tmpAnticipate.anticipate(
69
+ function (fDone)
70
+ {
71
+ let tmpTracker = testFable.ProgressTrackerSet.getProgressTracker('TestTracker');
72
+
73
+ if (tmpTracker.data.PercentComplete >= 100)
74
+ {
75
+ return fDone();
76
+ }
77
+
78
+ let tmpWaitTime = Math.floor(Math.random() * 10) + 10;
79
+ let tmpIncrementAmount = Math.floor(Math.random() * 2) + 2;
80
+
81
+ setTimeout(
82
+ () =>
83
+ {
84
+ if (tmpTracker.data.PercentComplete < 100)
85
+ {
86
+ testFable.ProgressTrackerSet.incrementProgressTracker('TestTracker', tmpIncrementAmount);
87
+ testFable.ProgressTrackerSet.logProgressTrackerStatus('TestTracker');
88
+ }
89
+ return fDone();
90
+ }, tmpWaitTime);
91
+ }.bind(testFable));
92
+ }
93
+
94
+ tmpAnticipate.wait(
95
+ function (pError)
96
+ {
97
+ if (pError)
98
+ {
99
+ testFable.log.error(`Error: ${pError}`);
100
+ }
101
+
102
+ let tmpWaitTime = Math.floor(Math.random() * 10) + 10;
103
+ this.log.trace(`Ending tracker in ${tmpWaitTime}ms...`);
104
+
105
+ setTimeout(
106
+ () =>
107
+ {
108
+ testFable.ProgressTrackerSet.endProgressTracker('TestTracker');
109
+ testFable.ProgressTrackerSet.logProgressTrackerStatus('TestTracker');
110
+ return fTestComplete();
111
+ }, tmpWaitTime);
112
+ }.bind(testFable));
113
+
114
+ }
115
+ )
39
116
  }
40
117
  );
41
118
  }