~vauxoo/openerp-tools/runbot_vauxoo_stable_fix_css_dev_jorge

« back to all changes in this revision

Viewing changes to openerp-runbot/js/bower_components/bootstrap/Gruntfile.js

  • Committer: Jorge Angel Naranjo Rogel
  • Date: 2014-08-29 01:01:23 UTC
  • Revision ID: jorge_nr@vauxoo.com-20140829010123-t2f9gk9mxda7ddwv
[IMP][runbot_vauxoo_stable] Changed link to css

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*!
 
2
 * Bootstrap's Gruntfile
 
3
 * http://getbootstrap.com
 
4
 * Copyright 2013-2014 Twitter, Inc.
 
5
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
6
 */
 
7
 
 
8
module.exports = function (grunt) {
 
9
  'use strict';
 
10
 
 
11
  // Force use of Unix newlines
 
12
  grunt.util.linefeed = '\n';
 
13
 
 
14
  RegExp.quote = function (string) {
 
15
    return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&');
 
16
  };
 
17
 
 
18
  var fs = require('fs');
 
19
  var path = require('path');
 
20
  var generateGlyphiconsData = require('./docs/grunt/bs-glyphicons-data-generator.js');
 
21
  var BsLessdocParser = require('./docs/grunt/bs-lessdoc-parser.js');
 
22
  var generateRawFilesJs = require('./docs/grunt/bs-raw-files-generator.js');
 
23
  var updateShrinkwrap = require('./test-infra/shrinkwrap.js');
 
24
 
 
25
  // Project configuration.
 
26
  grunt.initConfig({
 
27
 
 
28
    // Metadata.
 
29
    pkg: grunt.file.readJSON('package.json'),
 
30
    banner: '/*!\n' +
 
31
            ' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' +
 
32
            ' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
 
33
            ' * Licensed under <%= _.pluck(pkg.licenses, "type") %> (<%= _.pluck(pkg.licenses, "url") %>)\n' +
 
34
            ' */\n',
 
35
    jqueryCheck: 'if (typeof jQuery === \'undefined\') { throw new Error(\'Bootstrap requires jQuery\') }\n\n',
 
36
 
 
37
    // Task configuration.
 
38
    clean: {
 
39
      dist: 'dist'
 
40
    },
 
41
 
 
42
    jshint: {
 
43
      options: {
 
44
        jshintrc: 'js/.jshintrc'
 
45
      },
 
46
      grunt: {
 
47
        src: ['Gruntfile.js', 'docs/grunt/*.js', 'test-infra/shrinkwrap.js']
 
48
      },
 
49
      src: {
 
50
        src: 'js/*.js'
 
51
      },
 
52
      test: {
 
53
        src: 'js/tests/unit/*.js'
 
54
      },
 
55
      assets: {
 
56
        src: ['docs/assets/js/application.js', 'docs/assets/js/customizer.js']
 
57
      }
 
58
    },
 
59
 
 
60
    jscs: {
 
61
      options: {
 
62
        config: 'js/.jscs.json',
 
63
      },
 
64
      grunt: {
 
65
        src: ['Gruntfile.js', 'docs/grunt/*.js', 'test-infra/shrinkwrap.js']
 
66
      },
 
67
      src: {
 
68
        src: 'js/*.js'
 
69
      },
 
70
      test: {
 
71
        src: 'js/tests/unit/*.js'
 
72
      },
 
73
      assets: {
 
74
        src: ['docs/assets/js/application.js', 'docs/assets/js/customizer.js']
 
75
      }
 
76
    },
 
77
 
 
78
    csslint: {
 
79
      options: {
 
80
        csslintrc: 'less/.csslintrc'
 
81
      },
 
82
      src: [
 
83
        'dist/css/bootstrap.css',
 
84
        'dist/css/bootstrap-theme.css',
 
85
        'docs/assets/css/docs.css'
 
86
      ]
 
87
    },
 
88
 
 
89
    concat: {
 
90
      options: {
 
91
        banner: '<%= banner %>\n<%= jqueryCheck %>',
 
92
        stripBanners: false
 
93
      },
 
94
      bootstrap: {
 
95
        src: [
 
96
          'js/transition.js',
 
97
          'js/alert.js',
 
98
          'js/button.js',
 
99
          'js/carousel.js',
 
100
          'js/collapse.js',
 
101
          'js/dropdown.js',
 
102
          'js/modal.js',
 
103
          'js/tooltip.js',
 
104
          'js/popover.js',
 
105
          'js/scrollspy.js',
 
106
          'js/tab.js',
 
107
          'js/affix.js'
 
108
        ],
 
109
        dest: 'dist/js/<%= pkg.name %>.js'
 
110
      }
 
111
    },
 
112
 
 
113
    uglify: {
 
114
      bootstrap: {
 
115
        options: {
 
116
          banner: '<%= banner %>',
 
117
          report: 'min'
 
118
        },
 
119
        src: '<%= concat.bootstrap.dest %>',
 
120
        dest: 'dist/js/<%= pkg.name %>.min.js'
 
121
      },
 
122
      customize: {
 
123
        options: {
 
124
          preserveComments: 'some',
 
125
          report: 'min'
 
126
        },
 
127
        src: [
 
128
          'docs/assets/js/vendor/less.min.js',
 
129
          'docs/assets/js/vendor/jszip.js',
 
130
          'docs/assets/js/vendor/uglify.min.js',
 
131
          'docs/assets/js/vendor/blob.js',
 
132
          'docs/assets/js/vendor/filesaver.js',
 
133
          'docs/assets/js/raw-files.min.js',
 
134
          'docs/assets/js/customizer.js'
 
135
        ],
 
136
        dest: 'docs/assets/js/customize.min.js'
 
137
      },
 
138
      docsJs: {
 
139
        options: {
 
140
          preserveComments: 'some',
 
141
          report: 'min'
 
142
        },
 
143
        src: [
 
144
          'docs/assets/js/vendor/holder.js',
 
145
          'docs/assets/js/application.js'
 
146
        ],
 
147
        dest: 'docs/assets/js/docs.min.js'
 
148
      }
 
149
    },
 
150
 
 
151
    less: {
 
152
      compileCore: {
 
153
        options: {
 
154
          strictMath: true,
 
155
          sourceMap: true,
 
156
          outputSourceFiles: true,
 
157
          sourceMapURL: '<%= pkg.name %>.css.map',
 
158
          sourceMapFilename: 'dist/css/<%= pkg.name %>.css.map'
 
159
        },
 
160
        files: {
 
161
          'dist/css/<%= pkg.name %>.css': 'less/bootstrap.less'
 
162
        }
 
163
      },
 
164
      compileTheme: {
 
165
        options: {
 
166
          strictMath: true,
 
167
          sourceMap: true,
 
168
          outputSourceFiles: true,
 
169
          sourceMapURL: '<%= pkg.name %>-theme.css.map',
 
170
          sourceMapFilename: 'dist/css/<%= pkg.name %>-theme.css.map'
 
171
        },
 
172
        files: {
 
173
          'dist/css/<%= pkg.name %>-theme.css': 'less/theme.less'
 
174
        }
 
175
      },
 
176
      minify: {
 
177
        options: {
 
178
          cleancss: true,
 
179
          report: 'min'
 
180
        },
 
181
        files: {
 
182
          'dist/css/<%= pkg.name %>.min.css': 'dist/css/<%= pkg.name %>.css',
 
183
          'dist/css/<%= pkg.name %>-theme.min.css': 'dist/css/<%= pkg.name %>-theme.css'
 
184
        }
 
185
      }
 
186
    },
 
187
 
 
188
    cssmin: {
 
189
      compress: {
 
190
        options: {
 
191
          keepSpecialComments: '*',
 
192
          noAdvanced: true, // turn advanced optimizations off until the issue is fixed in clean-css
 
193
          report: 'min',
 
194
          selectorsMergeMode: 'ie8'
 
195
        },
 
196
        src: [
 
197
          'docs/assets/css/docs.css',
 
198
          'docs/assets/css/pygments-manni.css'
 
199
        ],
 
200
        dest: 'docs/assets/css/docs.min.css'
 
201
      }
 
202
    },
 
203
 
 
204
    usebanner: {
 
205
      dist: {
 
206
        options: {
 
207
          position: 'top',
 
208
          banner: '<%= banner %>'
 
209
        },
 
210
        files: {
 
211
          src: [
 
212
            'dist/css/<%= pkg.name %>.css',
 
213
            'dist/css/<%= pkg.name %>.min.css',
 
214
            'dist/css/<%= pkg.name %>-theme.css',
 
215
            'dist/css/<%= pkg.name %>-theme.min.css'
 
216
          ]
 
217
        }
 
218
      }
 
219
    },
 
220
 
 
221
    csscomb: {
 
222
      sort: {
 
223
        options: {
 
224
          config: 'less/.csscomb.json'
 
225
        },
 
226
        files: {
 
227
          'dist/css/<%= pkg.name %>.css': 'dist/css/<%= pkg.name %>.css',
 
228
          'dist/css/<%= pkg.name %>-theme.css': 'dist/css/<%= pkg.name %>-theme.css'
 
229
        }
 
230
      }
 
231
    },
 
232
 
 
233
    copy: {
 
234
      fonts: {
 
235
        expand: true,
 
236
        src: 'fonts/*',
 
237
        dest: 'dist/'
 
238
      },
 
239
      docs: {
 
240
        expand: true,
 
241
        cwd: './dist',
 
242
        src: [
 
243
          '{css,js}/*.min.*',
 
244
          'css/*.map',
 
245
          'fonts/*'
 
246
        ],
 
247
        dest: 'docs/dist'
 
248
      }
 
249
    },
 
250
 
 
251
    qunit: {
 
252
      options: {
 
253
        inject: 'js/tests/unit/phantom.js'
 
254
      },
 
255
      files: 'js/tests/*.html'
 
256
    },
 
257
 
 
258
    connect: {
 
259
      server: {
 
260
        options: {
 
261
          port: 3000,
 
262
          base: '.'
 
263
        }
 
264
      }
 
265
    },
 
266
 
 
267
    jekyll: {
 
268
      docs: {}
 
269
    },
 
270
 
 
271
    jade: {
 
272
      compile: {
 
273
        options: {
 
274
          pretty: true,
 
275
          data: function () {
 
276
            var filePath = path.join(__dirname, 'less/variables.less');
 
277
            var fileContent = fs.readFileSync(filePath, {encoding: 'utf8'});
 
278
            var parser = new BsLessdocParser(fileContent);
 
279
            return {sections: parser.parseFile()};
 
280
          }
 
281
        },
 
282
        files: {
 
283
          'docs/_includes/customizer-variables.html': 'docs/customizer-variables.jade',
 
284
          'docs/_includes/nav-customize.html': 'docs/customizer-nav.jade'
 
285
        }
 
286
      }
 
287
    },
 
288
 
 
289
    validation: {
 
290
      options: {
 
291
        charset: 'utf-8',
 
292
        doctype: 'HTML5',
 
293
        failHard: true,
 
294
        reset: true,
 
295
        relaxerror: [
 
296
          'Bad value X-UA-Compatible for attribute http-equiv on element meta.',
 
297
          'Element img is missing required attribute src.'
 
298
        ]
 
299
      },
 
300
      files: {
 
301
        src: '_gh_pages/**/*.html'
 
302
      }
 
303
    },
 
304
 
 
305
    watch: {
 
306
      src: {
 
307
        files: '<%= jshint.src.src %>',
 
308
        tasks: ['jshint:src', 'qunit']
 
309
      },
 
310
      test: {
 
311
        files: '<%= jshint.test.src %>',
 
312
        tasks: ['jshint:test', 'qunit']
 
313
      },
 
314
      less: {
 
315
        files: 'less/*.less',
 
316
        tasks: 'less'
 
317
      }
 
318
    },
 
319
 
 
320
    sed: {
 
321
      versionNumber: {
 
322
        pattern: (function () {
 
323
          var old = grunt.option('oldver');
 
324
          return old ? RegExp.quote(old) : old;
 
325
        })(),
 
326
        replacement: grunt.option('newver'),
 
327
        recursive: true
 
328
      }
 
329
    },
 
330
 
 
331
    'saucelabs-qunit': {
 
332
      all: {
 
333
        options: {
 
334
          build: process.env.TRAVIS_JOB_ID,
 
335
          concurrency: 10,
 
336
          urls: ['http://127.0.0.1:3000/js/tests/index.html'],
 
337
          browsers: grunt.file.readYAML('test-infra/sauce_browsers.yml')
 
338
        }
 
339
      }
 
340
    },
 
341
 
 
342
    exec: {
 
343
      npmUpdate: {
 
344
        command: 'npm update'
 
345
      },
 
346
      npmShrinkWrap: {
 
347
        command: 'npm shrinkwrap --dev'
 
348
      }
 
349
    }
 
350
  });
 
351
 
 
352
 
 
353
  // These plugins provide necessary tasks.
 
354
  require('load-grunt-tasks')(grunt, {scope: 'devDependencies'});
 
355
  grunt.loadNpmTasks('browserstack-runner');
 
356
 
 
357
  // Docs HTML validation task
 
358
  grunt.registerTask('validate-html', ['jekyll', 'validation']);
 
359
 
 
360
  // Test task.
 
361
  var testSubtasks = [];
 
362
  // Skip core tests if running a different subset of the test suite
 
363
  if (!process.env.TWBS_TEST || process.env.TWBS_TEST === 'core') {
 
364
    testSubtasks = testSubtasks.concat(['dist-css', 'csslint', 'jshint', 'jscs', 'qunit', 'build-customizer-html']);
 
365
  }
 
366
  // Skip HTML validation if running a different subset of the test suite
 
367
  if (!process.env.TWBS_TEST || process.env.TWBS_TEST === 'validate-html') {
 
368
    testSubtasks.push('validate-html');
 
369
  }
 
370
  // Only run Sauce Labs tests if there's a Sauce access key
 
371
  if (typeof process.env.SAUCE_ACCESS_KEY !== 'undefined' &&
 
372
      // Skip Sauce if running a different subset of the test suite
 
373
      (!process.env.TWBS_TEST || process.env.TWBS_TEST === 'sauce-js-unit')) {
 
374
    testSubtasks.push('connect');
 
375
    testSubtasks.push('saucelabs-qunit');
 
376
  }
 
377
  // Only run BrowserStack tests if there's a BrowserStack access key
 
378
  if (typeof process.env.BROWSERSTACK_KEY !== 'undefined' &&
 
379
      // Skip BrowserStack if running a different subset of the test suite
 
380
      (!process.env.TWBS_TEST || process.env.TWBS_TEST === 'browserstack-js-unit')) {
 
381
    testSubtasks.push('browserstack_runner');
 
382
  }
 
383
  grunt.registerTask('test', testSubtasks);
 
384
 
 
385
  // JS distribution task.
 
386
  grunt.registerTask('dist-js', ['concat', 'uglify']);
 
387
 
 
388
  // CSS distribution task.
 
389
  grunt.registerTask('dist-css', ['less', 'cssmin', 'csscomb', 'usebanner']);
 
390
 
 
391
  // Docs distribution task.
 
392
  grunt.registerTask('dist-docs', 'copy:docs');
 
393
 
 
394
  // Full distribution task.
 
395
  grunt.registerTask('dist', ['clean', 'dist-css', 'copy:fonts', 'dist-docs', 'dist-js']);
 
396
 
 
397
  // Default task.
 
398
  grunt.registerTask('default', ['test', 'dist', 'build-glyphicons-data', 'build-customizer', 'update-shrinkwrap']);
 
399
 
 
400
  // Version numbering task.
 
401
  // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z
 
402
  // This can be overzealous, so its changes should always be manually reviewed!
 
403
  grunt.registerTask('change-version-number', 'sed');
 
404
 
 
405
  grunt.registerTask('build-glyphicons-data', generateGlyphiconsData);
 
406
 
 
407
  // task for building customizer
 
408
  grunt.registerTask('build-customizer', ['build-customizer-html', 'build-raw-files']);
 
409
  grunt.registerTask('build-customizer-html', 'jade');
 
410
  grunt.registerTask('build-raw-files', 'Add scripts/less files to customizer.', function () {
 
411
    var banner = grunt.template.process('<%= banner %>');
 
412
    generateRawFilesJs(banner);
 
413
  });
 
414
 
 
415
  // Task for updating the npm packages used by the Travis build.
 
416
  grunt.registerTask('update-shrinkwrap', ['exec:npmUpdate', 'exec:npmShrinkWrap', '_update-shrinkwrap']);
 
417
  grunt.registerTask('_update-shrinkwrap', function () { updateShrinkwrap.call(this, grunt); });
 
418
};