Skip to content

Commit f603ea6

Browse files
Merge pull request #590 from pattern-lab/bugfix/586-incremental-viewall
Bugfix/586 incremental viewall
2 parents 7b556f0 + 11c047e commit f603ea6

File tree

4 files changed

+87
-34
lines changed

4 files changed

+87
-34
lines changed

core/lib/changes_hunter.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,23 @@ ChangesHunter.prototype = {
2727
let renderedTemplatePath =
2828
patternlab.config.paths.public.patterns + pattern.getPatternLink(patternlab, 'rendered');
2929

30+
//write the compiled template to the public patterns directory
31+
let markupOnlyPath =
32+
patternlab.config.paths.public.patterns + pattern.getPatternLink(patternlab, 'markupOnly');
33+
3034
if (!pattern.compileState) {
3135
pattern.compileState = CompileState.NEEDS_REBUILD;
3236
}
3337

3438
try {
35-
// Prevent error message if file does not exist
36-
fs.accessSync(renderedTemplatePath, fs.F_OK);
39+
40+
// renderedTemplatePath required to display a single element
41+
// Markup only is required for "View All" pages. It will get loaded later on.
42+
// If any of these is missing, mark pattern for recompile
43+
[renderedTemplatePath, markupOnlyPath].forEach(renderedFile =>
44+
// Prevent error message if file does not exist
45+
fs.accessSync(renderedFile, fs.F_OK)
46+
);
3747
let outputLastModified = fs.statSync(renderedTemplatePath).mtime.getTime();
3848

3949
if (pattern.lastModified && outputLastModified > pattern.lastModified) {
@@ -76,6 +86,13 @@ ChangesHunter.prototype = {
7686
// Ignore, not a regular file
7787
}
7888
}
89+
},
90+
91+
needsRebuild: function(lastModified, p) {
92+
if (p.compileState !== CompileState.CLEAN || ! p.lastModified) {
93+
return true;
94+
}
95+
return p.lastModified >= lastModified;
7996
}
8097
};
8198

core/lib/pattern_assembler.js

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use strict";
22

33
var path = require('path'),
4+
_ = require('lodash'),
45
fs = require('fs-extra'),
56
Pattern = require('./object_factory').Pattern,
67
CompileState = require('./object_factory').CompileState,
@@ -406,13 +407,40 @@ var pattern_assembler = function () {
406407
decomposePattern(currentPattern, patternlab);
407408
}
408409

409-
function findModifiedPatterns(lastModified, patternlab) {
410-
return patternlab.patterns.filter(p => {
411-
if (p.compileState !== CompileState.CLEAN || ! p.lastModified) {
412-
return true;
410+
411+
/**
412+
* Finds patterns that were modified and need to be rebuilt. For clean patterns load the already
413+
* rendered markup.
414+
*
415+
* @param lastModified
416+
* @param patternlab
417+
*/
418+
function markModifiedPatterns(lastModified, patternlab) {
419+
/**
420+
* If the given array exists, apply a function to each of its elements
421+
* @param {Array} array
422+
* @param {Function} func
423+
*/
424+
const forEachExisting = (array, func) => {
425+
if (array) {
426+
array.forEach(func);
413427
}
414-
return p.lastModified >= lastModified;
428+
};
429+
const modifiedOrNot = _.groupBy(
430+
patternlab.patterns,
431+
p => changes_hunter.needsRebuild(lastModified, p) ? 'modified' : 'notModified');
432+
433+
// For all unmodified patterns load their rendered template output
434+
forEachExisting(modifiedOrNot.notModified, cleanPattern => {
435+
const xp = path.join(patternlab.config.paths.public.patterns, cleanPattern.getPatternLink(patternlab, 'markupOnly'));
436+
437+
// Pattern with non-existing markupOnly files were already marked for rebuild and thus are not "CLEAN"
438+
cleanPattern.patternPartialCode = fs.readFileSync(xp, 'utf8');
415439
});
440+
441+
// For all patterns that were modified, schedule them for rebuild
442+
forEachExisting(modifiedOrNot.modified, p => p.compileState = CompileState.NEEDS_REBUILD);
443+
return modifiedOrNot;
416444
}
417445

418446
function expandPartials(foundPatternPartials, list_item_hunter, patternlab, currentPattern) {
@@ -528,8 +556,8 @@ var pattern_assembler = function () {
528556
}
529557

530558
return {
531-
find_modified_patterns: function (lastModified, patternlab) {
532-
return findModifiedPatterns(lastModified, patternlab);
559+
mark_modified_patterns: function (lastModified, patternlab) {
560+
return markModifiedPatterns(lastModified, patternlab);
533561
},
534562
find_pattern_partials: function (pattern) {
535563
return pattern.findPartials();

core/lib/patternlab.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -564,12 +564,7 @@ var patternlab_engine = function (config) {
564564

565565
// TODO Find created or deleted files
566566
let now = new Date().getTime();
567-
let modified = pattern_assembler.find_modified_patterns(now, patternlab);
568-
569-
// First mark all modified files
570-
for (let p of modified) {
571-
p.compileState = CompileState.NEEDS_REBUILD;
572-
}
567+
pattern_assembler.mark_modified_patterns(now, patternlab);
573568
patternsToBuild = patternlab.graph.compileOrder();
574569
} else {
575570
// build all patterns, mark all to be rebuilt

test/pattern_assembler_tests.js

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ function emptyPatternLab() {
1414
}
1515
}
1616

17+
const patterns_dir = './test/files/_patterns';
18+
const public_dir = './test/public';
19+
1720
tap.test('process_pattern_recursive recursively includes partials', function(test) {
1821

1922
//tests inclusion of partial that will be discovered by diveSync later in iteration than parent
@@ -23,8 +26,6 @@ tap.test('process_pattern_recursive recursively includes partials', function(tes
2326
var pa = require('../core/lib/pattern_assembler');
2427
var plMain = require('../core/lib/patternlab');
2528
var pattern_assembler = new pa();
26-
var patterns_dir = './test/files/_patterns';
27-
var public_dir = './test/public';
2829
var patternlab = emptyPatternLab();
2930
patternlab.config = fs.readJSONSync('./patternlab-config.json');
3031
patternlab.config.paths.source.patterns = patterns_dir;
@@ -662,14 +663,24 @@ tap.test('addPattern - adds pattern template to patternlab partial object if ext
662663
test.end();
663664
});
664665

665-
tap.test('findModifiedPatterns - finds patterns modified since a given date', function(test){
666+
tap.test('markModifiedPatterns - finds patterns modified since a given date', function(test){
667+
const fs = require('fs-extra');
668+
// test/myModule.test.js
669+
var rewire = require("rewire");
670+
671+
var pattern_assembler_mock = rewire("../core/lib/pattern_assembler");
672+
var fsMock = {
673+
readFileSync: function (path, encoding, cb) {
674+
return "";
675+
}
676+
};
677+
pattern_assembler_mock.__set__("fs", fsMock);
666678
//arrange
667-
var pattern_assembler = new pa();
679+
var pattern_assembler = new pattern_assembler_mock();
668680
var patternlab = emptyPatternLab();
669-
patternlab.partials = {};
670-
patternlab.data = {link: {}};
671-
patternlab.config = { debug: false };
672-
patternlab.config.outputFileSuffixes = {rendered : ''};
681+
patternlab.config = fs.readJSONSync('./patternlab-config.json');
682+
patternlab.config.paths.public.patterns = public_dir + "/patterns";
683+
patternlab.config.outputFileSuffixes = {rendered: '', markupOnly: '.markup-only'};
673684

674685
var pattern = new Pattern('00-test/01-bar.mustache');
675686
pattern.extendedTemplate = undefined;
@@ -681,17 +692,19 @@ tap.test('findModifiedPatterns - finds patterns modified since a given date', fu
681692
patternlab.patterns = [pattern];
682693

683694
var lastCompilationRun = new Date("2016-01-01").getTime();
684-
var p = pattern_assembler.find_modified_patterns(lastCompilationRun, patternlab);
695+
var modifiedOrNot = pattern_assembler.mark_modified_patterns(lastCompilationRun, patternlab);
685696

686-
test.same(p.length, 1, "The pattern was modified after the last compilation");
697+
test.same(modifiedOrNot.modified.length, 1, "The pattern was modified after the last compilation");
687698

699+
// Reset the compile state as it was previously set by pattern_assembler.mark_modified_patterns
700+
pattern.compileState = CompileState.CLEAN;
688701
lastCompilationRun = new Date("2016-12-31").getTime();
689-
p = pattern_assembler.find_modified_patterns(lastCompilationRun, patternlab);
690-
test.same(p.length, 0, "Pattern was already compiled and hasn't been modified since last compile");
702+
modifiedOrNot = pattern_assembler.mark_modified_patterns(lastCompilationRun, patternlab);
703+
test.same(modifiedOrNot.notModified.length, 1, "Pattern was already compiled and hasn't been modified since last compile");
691704
test.end();
692-
})
705+
});
693706

694-
tap.test('findModifiedPatterns - finds patterns when modification date is missing', function(test){
707+
tap.test('markModifiedPatterns - finds patterns when modification date is missing', function(test){
695708
//arrange
696709
var pattern_assembler = new pa();
697710
var patternlab = emptyPatternLab();
@@ -706,13 +719,13 @@ tap.test('findModifiedPatterns - finds patterns when modification date is missin
706719
pattern.lastModified = undefined;
707720
patternlab.patterns = [pattern];
708721

709-
let p = pattern_assembler.find_modified_patterns(1000, patternlab);
710-
test.same(p.length, 1);
722+
let p = pattern_assembler.mark_modified_patterns(1000, patternlab);
723+
test.same(p.modified.length, 1);
711724
test.end();
712725
});
713726

714727
// This is the case when we want to force recompilation
715-
tap.test('findModifiedPatterns - finds patterns via compile state', function(test){
728+
tap.test('markModifiedPatterns - finds patterns via compile state', function(test){
716729
//arrange
717730
var pattern_assembler = new pa();
718731
var patternlab = emptyPatternLab();
@@ -728,8 +741,8 @@ tap.test('findModifiedPatterns - finds patterns via compile state', function(tes
728741
pattern.compileState = CompileState.NEEDS_REBUILD;
729742
patternlab.patterns = [pattern];
730743

731-
let p = pattern_assembler.find_modified_patterns(1000, patternlab);
732-
test.same(p.length, 1);
744+
let p = pattern_assembler.mark_modified_patterns(1000, patternlab);
745+
test.same(p.modified.length, 1);
733746
test.end();
734747
});
735748

0 commit comments

Comments
 (0)