Skip to content
This repository has been archived by the owner on Apr 9, 2023. It is now read-only.

Commit

Permalink
Merge pull request #25 from plone/patternslib-merge
Browse files Browse the repository at this point in the history
Patternslib merge: Removed the Mockup registry in favor of Patternslib's
  • Loading branch information
jcbrand committed Jan 26, 2015
2 parents c51a757 + dcd7218 commit 04b91cb
Show file tree
Hide file tree
Showing 11 changed files with 272 additions and 270 deletions.
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ test-once:
test-dev:
NODE_PATH=$(NODE_PATH) $(GRUNT) test_dev --pattern=$(pattern)

test-serve:
NODE_PATH=$(NODE_PATH) $(GRUNT) test_serve --pattern=$(pattern)

test-ci:
NODE_PATH=$(NODE_PATH) $(GRUNT) test_ci

Expand Down
6 changes: 5 additions & 1 deletion bower.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,14 @@
"lodash": "2.4.1",
"marked": "0.3.2",
"react": "0.10.0",
"requirejs-text": "2.0.12"
"requirejs-text": "2.0.12",
"patternslib": "master"
},
"devDependencies": {
"expect": "0.3.1",
"sinonjs": "1.10.2"
},
"resolutions": {
"jquery": "1.11.1"
}
}
15 changes: 12 additions & 3 deletions js/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,25 @@
'jquery': 'bower_components/jquery/dist/jquery',
'marked': 'bower_components/marked/lib/marked',
'mockup-docs': 'js/docs/app',
'mockup-docs-navigation': 'js/docs/navigation',
'mockup-docs-page': 'js/docs/page',
'mockup-docs-pattern': 'js/docs/pattern',
'mockup-docs-view': 'js/docs/view',
'mockup-docs-navigation': 'js/docs/navigation',
'mockup-parser': 'js/parser',
'mockup-patterns-base': 'js/pattern',
'mockup-registry': 'js/registry',
'react': 'bower_components/react/react',
'sinon': 'bower_components/sinonjs/sinon',
'text': 'bower_components/requirejs-text/text',
'underscore': 'bower_components/lodash/dist/lodash.underscore'
'underscore': 'bower_components/lodash/dist/lodash.underscore',

// Patternslib
"pat-compat": "bower_components/patternslib/src/core/compat",
"pat-jquery-ext": "bower_components/patternslib/src/core/jquery-ext",
"pat-logger": "bower_components/patternslib/src/core/logger",
"pat-parser": "bower_components/patternslib/src/core/parser",
"pat-registry": "bower_components/patternslib/src/core/registry",
"pat-utils": "bower_components/patternslib/src/core/utils",
"logging": "bower_components/logging/src/logging"
},
shim: {
'backbone': {exports: 'window.Backbone', deps: ['underscore', 'jquery']},
Expand Down
2 changes: 1 addition & 1 deletion js/docs/pattern.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ define([
'underscore',
'marked',
'react',
'mockup-registry'
'pat-registry'
], function(_, marked, React, Registry) {
'use strict';

Expand Down
21 changes: 15 additions & 6 deletions js/grunt.js
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@
extend(true, this.gruntConfig, customGruntConfig || {});

/*
* TODO: add description
* Register different test runners
*/
var bundles = [];
for (var name in this.bundles) {
Expand All @@ -271,6 +271,7 @@
grunt.registerTask('test', [ 'jshint', 'karma:test' ]);
grunt.registerTask('test_once', [ 'jshint', 'karma:testOnce' ]);
grunt.registerTask('test_dev', [ 'karma:testDev' ]);
grunt.registerTask('test_serve', [ 'karma:testServe' ]);
grunt.registerTask('test_ci', [ 'jshint', 'karma:testCI'].concat(bundles));

/*
Expand All @@ -281,7 +282,7 @@
karma: {
options: {
basePath: './',
frameworks: [],
frameworks: ['mocha', 'chai'],
files: this.files,
preprocessors: { 'js/**/*.js': 'coverage' },
reporters: ['dots', 'progress', 'coverage', 'spec'],
Expand All @@ -295,6 +296,7 @@
captureTimeout: 60000,
plugins: [
'karma-mocha',
'karma-chai',
'karma-coverage',
'karma-requirejs',
'karma-sauce-launcher',
Expand All @@ -318,8 +320,18 @@
reporters: ['dots', 'progress'],
plugins: [
'karma-mocha',
'karma-chai',
'karma-requirejs',
'karma-chrome-launcher',
'karma-chrome-launcher'
]
},
testServe: {
preprocessors: {},
reporters: ['dots', 'progress'],
plugins: [
'karma-mocha',
'karma-chai',
'karma-requirejs'
]
},
testCI: {
Expand Down Expand Up @@ -376,10 +388,7 @@
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-karma');
grunt.loadNpmTasks('grunt-sed');

}
};

module.exports = MockupGrunt;

})();
42 changes: 42 additions & 0 deletions js/parser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
define([
'jquery'
], function($) {
'use strict';

var parser = {
getOptions: function getOptions($el, patternName, options) {
/* This is the Mockup parser. It parses a DOM element for pattern
* configuration options.
*/
options = options || {};
// get options from parent element first, stop if element tag name is 'body'
if ($el.length !== 0 && !$.nodeName($el[0], 'body')) {
options = getOptions($el.parent(), patternName, options);
}
// collect all options from element
var elOptions = {};
if ($el.length !== 0) {
elOptions = $el.data('pat-' + patternName);
if (elOptions) {
// parse options if string
if (typeof(elOptions) === 'string') {
var tmpOptions = {};
$.each(elOptions.split(';'), function(i, item) {
item = item.split(':');
item.reverse();
var key = item.pop();
key = key.replace(/^\s+|\s+$/g, ''); // trim
item.reverse();
var value = item.join(':');
value = value.replace(/^\s+|\s+$/g, ''); // trim
tmpOptions[key] = value;
});
elOptions = tmpOptions;
}
}
}
return $.extend(true, {}, options, elOptions);
}
};
return parser;
});
85 changes: 66 additions & 19 deletions js/pattern.js
Original file line number Diff line number Diff line change
@@ -1,55 +1,102 @@
/* Base Pattern
*/


define([
'jquery',
'mockup-registry'
], function($, Registry) {
'pat-registry',
'mockup-parser',
"pat-logger"
], function($, Registry, mockupParser, logger) {
'use strict';
var log = logger.getLogger("Mockup Base");

var initMockup = function initMockup($el, options, trigger) {
var name = this.prototype.name;
var log = logger.getLogger("pat." + name);
var pattern = $el.data('pattern-' + name);
if (pattern === undefined && Registry.patterns[name]) {
try {
pattern = new Registry.patterns[name]($el, mockupParser.getOptions($el, name, options));
} catch (e) {
log.error('Failed while initializing "' + name + '" pattern.');
}
$el.data('pattern-' + name, pattern);
}
return pattern;
};

// Base Pattern
var Base = function($el, options) {
this.$el = $el;
this.options = $.extend(true, {}, this.defaults || {}, options || {});
this.init();
this.trigger('init');
this.emit('init');
};

Base.prototype = {
constructor: Base,
on: function(eventName, eventCallback) {
this.$el.on(eventName + '.' + this.name + '.patterns', eventCallback);
},
trigger: function(eventName, args) {
emit: function(eventName, args) {
// args should be a list
if (args === undefined) {
args = [];
}
this.$el.trigger(eventName + '.' + this.name + '.patterns', args);
}
};
Base.extend = function(NewPattern) {
var Base = this, Constructor;

if (NewPattern && NewPattern.hasOwnProperty('constructor')) {
Constructor = NewPattern.constructor;
Base.extend = function(patternProps) {
/* Helper function to correctly set up the prototype chain for new patterns.
*/
var parent = this;
var child;

// Check that the required configuration properties are given.
if (!patternProps) {
throw new Error("Pattern configuration properties required when calling Base.extend");
}

// The constructor function for the new subclass is either defined by you
// (the "constructor" property in your `extend` definition), or defaulted
// by us to simply call the parent's constructor.
if (patternProps.hasOwnProperty('constructor')) {
child = patternProps.constructor;
} else {
Constructor = function() { Base.apply(this, arguments); }; // TODO: arguments from where
child = function() { parent.apply(this, arguments); };
}

var Surrogate = function() { this.constructor = Constructor; };
Surrogate.prototype = Base.prototype;
Constructor.prototype = new Surrogate();
Constructor.extend = Base.extend;
// Allow patterns to be extended indefinitely
child.extend = Base.extend;

$.extend(true, Constructor.prototype, NewPattern);
// Static properties required by the Patternslib registry
child.init = initMockup;
child.jquery_plugin = true;
child.trigger = patternProps.trigger;

Constructor.__super__ = Base.prototype; // TODO: needed?
// Set the prototype chain to inherit from `parent`, without calling
// `parent`'s constructor function.
var Surrogate = function() { this.constructor = child; };
Surrogate.prototype = parent.prototype;
child.prototype = new Surrogate();

Registry.register(Constructor);
// Add pattern's configuration properties (instance properties) to the subclass,
$.extend(true, child.prototype, patternProps);

return Constructor;
};
// Set a convenience property in case the parent's prototype is needed
// later.
child.__super__ = parent.prototype;

// Register the pattern in the Patternslib registry.
if (!patternProps.name) {
log.warn("This mockup pattern without a name attribute will not be registered!");
} else if (!patternProps.trigger) {
log.warn("The mockup pattern '"+patternProps.name+"' does not have a trigger attribute, it will not be registered.");
} else {
Registry.register(child, patternProps.name);
}
return child;
};
return Base;
});
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"homepage": "http://plone.github.io/mockup",
"devDependencies": {
"bower": "~1.3.1",
"chai": "^1.10.0",
"coveralls": "~2.10.0",
"extend": "~1.2.1",
"grunt": "~0.4.4",
Expand All @@ -18,6 +19,7 @@
"grunt-karma": "~0.8.2",
"grunt-sed": "~0.1.1",
"karma": "~0.12.1",
"karma-chai": "^0.1.0",
"karma-chrome-launcher": "~0.1.2",
"karma-coverage": "~0.2.1",
"karma-junit-reporter": "~0.2.1",
Expand Down
33 changes: 33 additions & 0 deletions tests/parser-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// Tests for the Mockup parser
define([
'expect',
'sinon',
'jquery',
'mockup-parser',
], function(expect, sinon, $, parser) {
'use strict';
window.mocha.setup('bdd');
describe('The Mockup parser', function () {
it("can read pattern configuraion options from the DOM", function() {
var $el = $('' +
'<div data-pat-example="{&quot;name1&quot;: &quot;value1&quot;,' +
' &quot;name2&quot;: &quot;value2&quot;}">' +
' <div class="pat-example"' +
' data-pat-example="name2: something;' +
' some-thing-name4: value4;' +
' some-stuff: value5"/>' +
'</div>');

var options = parser.getOptions(
$('.pat-example', $el),
'example',
{ name3: 'value3'}
);
expect(options.name1).to.equal('value1');
expect(options.name2).to.equal('something');
expect(options.name3).to.equal('value3');
expect(options['some-thing-name4']).to.equal('value4');
expect(options['some-stuff']).to.equal('value5');
});
});
});
Loading

0 comments on commit 04b91cb

Please sign in to comment.