meadow 1.0.34 → 1.0.35

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.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "optOut": false,
3
- "lastUpdateCheck": 1649732399378
3
+ "lastUpdateCheck": 1653488643323
4
4
  }
package/Dockerfile CHANGED
@@ -26,6 +26,21 @@ RUN ( sudo mysqld_safe --skip-grant-tables --skip-networking & ) && sleep 5 &&
26
26
  # Import the initial database
27
27
  RUN sudo service mariadb restart && sleep 5 && mysql -u root -p"123456789" -e "CREATE DATABASE FableTest;"
28
28
 
29
+ RUN echo "...installing vscode extensions..."
30
+ RUN code-server --install-extension rangav.vscode-thunder-client \
31
+ code-server --install-extension hbenl.vscode-mocha-test-adapter \
32
+ code-server --install-extension hbenl.vscode-test-explorer \
33
+ code-server --install-extension hbenl.test-adapter-converter \
34
+ code-server --install-extension cweijan.vscode-mysql-client2 \
35
+ code-server --install-extension daylerees.rainglow \
36
+ code-server --install-extension oderwat.indent-rainbow \
37
+ code-server --install-extension evan-buss.font-switcher \
38
+ code-server --install-extension vscode-icons-team.vscode-icons \
39
+ code-server --install-extension bengreenier.vscode-node-readme \
40
+ code-server --install-extension bierner.color-info \
41
+ code-server --install-extension dbaeumer.vscode-eslint \
42
+ code-server --install-extension PKief.material-icon-theme
43
+
29
44
  SHELL ["/bin/bash", "-c"]
30
45
  USER coder
31
46
 
package/README.md CHANGED
@@ -3,11 +3,6 @@ Meadow
3
3
 
4
4
  A Javascript Data Broker.
5
5
 
6
- [![Coverage Status](https://coveralls.io/repos/stevenvelozo/meadow/badge.svg?branch=master)](https://coveralls.io/r/stevenvelozo/meadow?branch=master)
7
- [![Build Status](https://travis-ci.org/stevenvelozo/meadow.svg?branch=master)](https://travis-ci.org/stevenvelozo/meadow)
8
- [![Dependency Status](https://david-dm.org/stevenvelozo/meadow.svg)](https://david-dm.org/stevenvelozo/meadow)
9
- [![devDependency Status](https://david-dm.org/stevenvelozo/meadow/dev-status.svg)](https://david-dm.org/stevenvelozo/meadow#info=devDependencies)
10
-
11
6
  Who doesn't love writing the same code over and over again? Good question. Anybody who doesn't probably wants something to do simple data access stuff. And some of the complicated interactions as well. Meadow aims to provide a simple “magic where you want it, programmability where you don't” pattern.
12
7
 
13
8
  ## Install
package/debug/Harness.js CHANGED
@@ -1,2 +1 @@
1
1
  var testMeadow = require('../source/Meadow.js').new();
2
- Expect(testMeadow).to.be.an('object', 'Meadow should initialize as an object directly from the require statement.');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "meadow",
3
- "version": "1.0.34",
3
+ "version": "1.0.35",
4
4
  "description": "A data access library.",
5
5
  "main": "source/Meadow.js",
6
6
  "scripts": {
@@ -11,6 +11,24 @@
11
11
  "docker-dev-build-image": "docker build ./ -t retold/meadow:local",
12
12
  "docker-dev-run": "docker run -it -d --name meadow-dev -p 127.0.0.1:12342:8080 -p 12106:3306 -v \"$PWD/.config:/home/coder/.config\" -v \"$PWD:/home/coder/meadow\" -u \"$(id -u):$(id -g)\" -e \"DOCKER_USER=$USER\" retold/meadow:local"
13
13
  },
14
+ "mocha": {
15
+ "diff": true,
16
+ "extension": [
17
+ "js"
18
+ ],
19
+ "package": "./package.json",
20
+ "reporter": "spec",
21
+ "slow": "75",
22
+ "timeout": "5000",
23
+ "ui": "tdd",
24
+ "watch-files": [
25
+ "source/**/*.js",
26
+ "test/**/*.js"
27
+ ],
28
+ "watch-ignore": [
29
+ "lib/vendor"
30
+ ]
31
+ },
14
32
  "repository": {
15
33
  "type": "git",
16
34
  "url": "https://github.com/stevenvelozo/meadow.git"
@@ -28,8 +46,6 @@
28
46
  "devDependencies": {
29
47
  "alasql": "^0.4.0",
30
48
  "chai": "3.5.0",
31
- "codeclimate-test-reporter": "0.4.1",
32
- "coveralls": "2.13.1",
33
49
  "groc": "^0.8.0",
34
50
  "istanbul": "0.4.5",
35
51
  "mocha": "3.4.1",
@@ -38,7 +54,7 @@
38
54
  "dependencies": {
39
55
  "async": "2.4.0",
40
56
  "fable": "~1.0.1",
41
- "foxhound": "^1.0.37",
57
+ "foxhound": "^1.0.39",
42
58
  "is-my-json-valid": "2.16.0",
43
59
  "underscore": "1.8.3"
44
60
  }
package/source/Meadow.js CHANGED
@@ -43,6 +43,7 @@ var Meadow = function()
43
43
  var _ReadsBehavior = require('./behaviors/Meadow-Reads.js');
44
44
  var _UpdateBehavior = require('./behaviors/Meadow-Update.js');
45
45
  var _DeleteBehavior = require('./behaviors/Meadow-Delete.js');
46
+ var _UndeleteBehavior = require('./behaviors/Meadow-Undelete.js');
46
47
  var _CountBehavior = require('./behaviors/Meadow-Count.js');
47
48
 
48
49
  // The data provider
@@ -70,12 +71,12 @@ var Meadow = function()
70
71
  /**
71
72
  * Load a Meadow Package JSON from file, create a Meadow object from it.
72
73
  */
73
- var _MeadowPackageObjectLoader = require('./Meadow-PackageObjectLoader.js');
74
- var loadFromPackageObject = function(pPackage)
75
- {
76
- return _MeadowPackageObjectLoader(this, pPackage);
77
- };
78
-
74
+ var _MeadowPackageObjectLoader = require('./Meadow-PackageObjectLoader.js');
75
+ var loadFromPackageObject = function(pPackage)
76
+ {
77
+ return _MeadowPackageObjectLoader(this, pPackage);
78
+ };
79
+
79
80
  /**
80
81
  * Pass relevant state into the provider
81
82
  *
@@ -276,6 +277,14 @@ var Meadow = function()
276
277
  return _DeleteBehavior(this, pQuery, fCallBack);
277
278
  };
278
279
 
280
+ /**
281
+ * Undelete a record
282
+ */
283
+ var doUndelete = function(pQuery, fCallBack)
284
+ {
285
+ return _UndeleteBehavior(this, pQuery, fCallBack);
286
+ };
287
+
279
288
  /**
280
289
  * Count multiple records
281
290
  */
@@ -366,6 +375,7 @@ var Meadow = function()
366
375
  doReads: doReads,
367
376
  doUpdate: doUpdate,
368
377
  doDelete: doDelete,
378
+ doUndelete: doUndelete,
369
379
  doCount: doCount,
370
380
 
371
381
  validateObject: _Schema.validateObject,
@@ -0,0 +1,42 @@
1
+ // ##### Part of the **[retold](https://stevenvelozo.github.io/retold/)** system
2
+ /**
3
+ * @license MIT
4
+ * @author <steven@velozo.com>
5
+ */
6
+ var libAsync = require('async');
7
+
8
+ /**
9
+ * Meadow Behavior - Undelete a single record
10
+ *
11
+ * @function meadowBehaviorUndelete
12
+ */
13
+ var meadowBehaviorUndelete = function(pMeadow, pQuery, fCallBack)
14
+ {
15
+ // TODO: Check if this recordset has implicit delete tracking, branch in this module?
16
+ // Undelete the record(s) if they were deleted with a bit
17
+ libAsync.waterfall(
18
+ [
19
+ // Step 1: Undelete the record
20
+ function (fStageComplete)
21
+ {
22
+ if (pMeadow.rawQueries.checkQuery('Undelete'))
23
+ {
24
+ pQuery.parameters.queryOverride = pMeadow.rawQueries.getQuery('Undelete');
25
+ }
26
+ pMeadow.provider.Undelete(pQuery, function(){ fStageComplete(pQuery.result.error, pQuery, pQuery.result.value); });
27
+ }
28
+ ],
29
+ function(pError, pQuery, pRecord)
30
+ {
31
+ if (pError)
32
+ {
33
+ pMeadow.fable.log.warn('Error during the undelete waterfall', {Error:pError, Message: pError.message, Query: pQuery.query});
34
+ }
35
+ fCallBack(pError, pQuery, pRecord);
36
+ }
37
+ );
38
+
39
+ return pMeadow;
40
+ };
41
+
42
+ module.exports = meadowBehaviorUndelete;
@@ -304,6 +304,38 @@ var MeadowProvider = function()
304
304
  fCallback();
305
305
  };
306
306
 
307
+ var Undelete = function(pQuery, fCallback)
308
+ {
309
+ var tmpResult = pQuery.parameters.result;
310
+
311
+ checkDataExists(pQuery.parameters);
312
+
313
+ pQuery.setDialect('ALASQL').buildUndeleteQuery();
314
+ var fQuery = libALASQL.compile(pQuery.query.body);
315
+
316
+ if (pQuery.logLevel > 0 ||
317
+ _GlobalLogLevel > 0)
318
+ {
319
+ _Fable.log.trace(pQuery.query.body, pQuery.query.parameters);
320
+ }
321
+
322
+ try
323
+ {
324
+ tmpResult.error = undefined;
325
+ tmpResult.executed = false;
326
+
327
+ tmpResult.value = fQuery(pQuery.query.parameters);
328
+
329
+ tmpResult.executed = true;
330
+ }
331
+ catch (pError)
332
+ {
333
+ tmpResult.error = pError;
334
+ }
335
+
336
+ fCallback();
337
+ };
338
+
307
339
  var Count = function(pQuery, fCallback)
308
340
  {
309
341
  var tmpResult = pQuery.parameters.result;
@@ -463,6 +495,7 @@ var MeadowProvider = function()
463
495
  Read: Read,
464
496
  Update: Update,
465
497
  Delete: Delete,
498
+ Undelete: Undelete,
466
499
  Count: Count,
467
500
 
468
501
  new: createNew
@@ -189,6 +189,45 @@ var MeadowProvider = function()
189
189
  });
190
190
  };
191
191
 
192
+ var Undelete = function(pQuery, fCallback)
193
+ {
194
+ var tmpResult = pQuery.parameters.result;
195
+
196
+ pQuery.setDialect('MySQL').buildUndeleteQuery();
197
+
198
+ if (pQuery.logLevel > 0 ||
199
+ _GlobalLogLevel > 0)
200
+ {
201
+ _Fable.log.trace(pQuery.query.body, pQuery.query.parameters);
202
+ }
203
+
204
+ getSQLPool().getConnection(function(pError, pDBConnection)
205
+ {
206
+ pDBConnection.query
207
+ (
208
+ pQuery.query.body,
209
+ pQuery.query.parameters,
210
+ // The MySQL library also returns the Fields as the third parameter
211
+ function(pError, pRows)
212
+ {
213
+ pDBConnection.release();
214
+ tmpResult.error = pError;
215
+ tmpResult.value = false;
216
+ try
217
+ {
218
+ tmpResult.value = pRows.affectedRows;
219
+ }
220
+ catch(pErrorGettingRowcount)
221
+ {
222
+ _Fable.log.warn('Error getting affected rowcount during delete query',{Body:pQuery.query.body, Parameters:pQuery.query.parameters});
223
+ }
224
+ tmpResult.executed = true;
225
+ return fCallback();
226
+ }
227
+ );
228
+ });
229
+ };
230
+
192
231
  var Count = function(pQuery, fCallback)
193
232
  {
194
233
  var tmpResult = pQuery.parameters.result;
@@ -235,6 +274,7 @@ var MeadowProvider = function()
235
274
  Read: Read,
236
275
  Update: Update,
237
276
  Delete: Delete,
277
+ Undelete: Undelete,
238
278
  Count: Count,
239
279
 
240
280
  new: createNew
@@ -52,6 +52,13 @@ var MeadowProvider = function()
52
52
  fCallback();
53
53
  };
54
54
 
55
+ var Undelete = function(pQuery, fCallback)
56
+ {
57
+ // This does nothing because it's the none data provider!
58
+ pQuery.parameters.result.executed = true;
59
+ fCallback();
60
+ };
61
+
55
62
  var Count = function(pQuery, fCallback)
56
63
  {
57
64
  // This does nothing because it's the none data provider!
@@ -67,6 +74,7 @@ var MeadowProvider = function()
67
74
  Read: Read,
68
75
  Update: Update,
69
76
  Delete: Delete,
77
+ Undelete: Undelete,
70
78
  Count: Count,
71
79
 
72
80
  new: createNew
@@ -18,14 +18,14 @@ var libALASQL = require('alasql');
18
18
  var libFable = require('fable').new({
19
19
  LogStreams:
20
20
  [
21
- {
22
- level: 'fatal',
23
- streamtype:'process.stdout',
24
- },
25
- {
26
- level: 'trace',
27
- path: __dirname+'/../tests.log'
28
- }
21
+ {
22
+ level: 'fatal',
23
+ streamtype:'process.stdout',
24
+ },
25
+ {
26
+ level: 'trace',
27
+ path: __dirname+'/../tests.log'
28
+ }
29
29
  ]
30
30
  });
31
31
 
@@ -291,6 +291,30 @@ suite
291
291
  }
292
292
  );
293
293
  test
294
+ (
295
+ 'Undelete a record in the database',
296
+ function(fDone)
297
+ {
298
+ var testMeadow = newMeadow();
299
+
300
+ testMeadow.fable.settings.QueryThresholdWarnTime = 1;
301
+ var tmpQuery = testMeadow.query.addFilter('IDAnimal',3);
302
+
303
+ testMeadow.doUndelete(tmpQuery,
304
+ function(pError, pQuery, pRecord)
305
+ {
306
+ // TODO: Research why this is working but not returning the row count
307
+ Expect(pRecord)
308
+ .to.equal(0);
309
+
310
+ testMeadow.fable.settings.QueryThresholdWarnTime = 1000;
311
+
312
+ fDone();
313
+ }
314
+ )
315
+ }
316
+ );
317
+ test
294
318
  (
295
319
  'Count all records from the database',
296
320
  function(fDone)
@@ -29,14 +29,14 @@ var tmpFableSettings = (
29
29
  },
30
30
  LogStreams:
31
31
  [
32
- {
33
- level: 'fatal',
34
- streamtype:'process.stdout',
35
- },
36
- {
37
- level: 'trace',
38
- path: __dirname+'/../tests.log'
39
- }
32
+ {
33
+ level: 'fatal',
34
+ streamtype:'process.stdout',
35
+ },
36
+ {
37
+ level: 'trace',
38
+ path: __dirname+'/../tests.log'
39
+ }
40
40
  ]
41
41
  });
42
42
 
@@ -379,6 +379,35 @@ suite
379
379
  }
380
380
  );
381
381
  test
382
+ (
383
+ 'Undelete a record in the database',
384
+ function(fDone)
385
+ {
386
+ var testMeadow = newMeadow();
387
+
388
+ testMeadow.fable.settings.QueryThresholdWarnTime = 1;
389
+ var tmpDeleteQuery = testMeadow.query.addFilter('IDAnimal',5);
390
+
391
+ // Make sure the record is deleted!
392
+ testMeadow.doDelete(tmpDeleteQuery,
393
+ function(pDeleteError, pDeleteQuery, pDeleteRecord)
394
+ {
395
+ var tmpQuery = testMeadow.query.addFilter('IDAnimal',5);
396
+ testMeadow.doUndelete(tmpQuery,
397
+ function(pError, pQuery, pRecord)
398
+ {
399
+ // It returns the number of rows deleted
400
+ Expect(pRecord)
401
+ .to.equal(1);
402
+
403
+ testMeadow.fable.settings.QueryThresholdWarnTime = 1000;
404
+
405
+ fDone();
406
+ });
407
+ });
408
+ }
409
+ );
410
+ test
382
411
  (
383
412
  'Count all records from the database',
384
413
  function(fDone)
@@ -186,6 +186,21 @@ suite
186
186
  }
187
187
  );
188
188
  test
189
+ (
190
+ 'Undelete a record in the database',
191
+ function(fDone)
192
+ {
193
+ var testMeadow = newMeadow();
194
+ testMeadow.doUndelete(testMeadow.query,
195
+ function(pError, pQuery, pRecord)
196
+ {
197
+ Expect(pQuery.parameters.result.executed).to.equal(true);
198
+ fDone();
199
+ }
200
+ )
201
+ }
202
+ );
203
+ test
189
204
  (
190
205
  'Count all records from the database',
191
206
  function(fDone)