diff --git a/.bowerrc b/.bowerrc
new file mode 100644
index 0000000000000000000000000000000000000000..69fad358018d530235f8e43c483d3ce960616a32
--- /dev/null
+++ b/.bowerrc
@@ -0,0 +1,3 @@
+{
+ "directory": "bower_components"
+}
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..c2cdfb8ada2cf8c11eb951291e5a03b6fbbe3b52
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,21 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# editorconfig.org
+
+root = true
+
+
+[*]
+
+# Change these settings to your own preference
+indent_style = space
+indent_size = 2
+
+# We recommend you to keep these unchanged
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..2125666142eb661091cc5f32af2ed2f3fc65571d
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..dc5576cce3b868a1614247ac508b4d8e0342c689
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+/node_modules
+/dist
+/.tmp
+/.sass-cache
+/bower_components
diff --git a/.jscsrc b/.jscsrc
new file mode 100644
index 0000000000000000000000000000000000000000..f8bf9ba270343a217a3246b255b090eb84402f17
--- /dev/null
+++ b/.jscsrc
@@ -0,0 +1,6 @@
+{
+ "requireCamelCaseOrUpperCaseIdentifiers": true,
+ "requireCapitalizedConstructors": true,
+ "requireParenthesesAroundIIFE": true,
+ "validateQuoteMarks": "'"
+}
diff --git a/.jshintrc b/.jshintrc
new file mode 100644
index 0000000000000000000000000000000000000000..4572e5d384a33e366ce8132be01b7c7c0261dc41
--- /dev/null
+++ b/.jshintrc
@@ -0,0 +1,16 @@
+{
+ "bitwise": true,
+ "browser": true,
+ "curly": true,
+ "eqeqeq": true,
+ "esnext": true,
+ "latedef": true,
+ "noarg": true,
+ "node": true,
+ "strict": true,
+ "undef": true,
+ "unused": true,
+ "globals": {
+ "angular": false
+ }
+}
diff --git a/.yo-rc.json b/.yo-rc.json
new file mode 100644
index 0000000000000000000000000000000000000000..6589676f260a21dac4c0c48f504b53745131bea7
--- /dev/null
+++ b/.yo-rc.json
@@ -0,0 +1,11 @@
+{
+ "generator-karma": {
+ "base-path": "../",
+ "frameworks": "jasmine",
+ "browsers": "PhantomJS",
+ "app-files": "app/scripts/**/*.js",
+ "files-comments": "bower:js,endbower",
+ "bower-components-path": "bower_components",
+ "test-files": "test/mock/**/*.js,test/spec/**/*.js"
+ }
+}
\ No newline at end of file
diff --git a/Gruntfile.js b/Gruntfile.js
new file mode 100644
index 0000000000000000000000000000000000000000..d97c760bfc8e72af53ed504c07dc4331ad1bee62
--- /dev/null
+++ b/Gruntfile.js
@@ -0,0 +1,516 @@
+// Generated on 2016-10-13 using generator-angular 0.15.1
+'use strict';
+
+// # Globbing
+// for performance reasons we're only matching one level down:
+// 'test/spec/{,*/}*.js'
+// use this if you want to recursively match all subfolders:
+// 'test/spec/**/*.js'
+
+module.exports = function (grunt) {
+
+ // Time how long tasks take. Can help when optimizing build times
+ require('time-grunt')(grunt);
+
+ // Automatically load required Grunt tasks
+ require('jit-grunt')(grunt, {
+ useminPrepare: 'grunt-usemin',
+ ngtemplates: 'grunt-angular-templates',
+ cdnify: 'grunt-google-cdn'
+ });
+
+ // Configurable paths for the application
+ var appConfig = {
+ app: require('./bower.json').appPath || 'app',
+ dist: 'dist'
+ };
+
+ // Define the configuration for all the tasks
+ grunt.initConfig({
+
+ // Project settings
+ yeoman: appConfig,
+
+ // Watches files for changes and runs tasks based on the changed files
+ watch: {
+ bower: {
+ files: ['bower.json'],
+ tasks: ['wiredep']
+ },
+ js: {
+ files: ['<%= yeoman.app %>/scripts/{,*/}*.js'],
+ tasks: ['newer:jshint:all', 'newer:jscs:all'],
+ options: {
+ livereload: '<%= connect.options.livereload %>'
+ }
+ },
+ jsTest: {
+ files: ['test/spec/{,*/}*.js'],
+ tasks: ['newer:jshint:test', 'newer:jscs:test', 'karma']
+ },
+ compass: {
+ files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
+ tasks: ['compass:server', 'postcss:server']
+ },
+ gruntfile: {
+ files: ['Gruntfile.js']
+ },
+ livereload: {
+ options: {
+ livereload: '<%= connect.options.livereload %>'
+ },
+ files: [
+ '<%= yeoman.app %>/{,*/}*.html',
+ '.tmp/styles/{,*/}*.css',
+ '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
+ ]
+ }
+ },
+
+ // The actual grunt server settings
+ connect: {
+ options: {
+ port: 9000,
+ // Change this to '0.0.0.0' to access the server from outside.
+ hostname: 'localhost',
+ livereload: 35729
+ },
+ livereload: {
+ options: {
+ open: true,
+ middleware: function (connect) {
+ return [
+ connect.static('.tmp'),
+ connect().use(
+ '/bower_components',
+ connect.static('./bower_components')
+ ),
+ connect().use(
+ '/app/styles',
+ connect.static('./app/styles')
+ ),
+ connect.static(appConfig.app)
+ ];
+ }
+ }
+ },
+ test: {
+ options: {
+ port: 9001,
+ middleware: function (connect) {
+ return [
+ connect.static('.tmp'),
+ connect.static('test'),
+ connect().use(
+ '/bower_components',
+ connect.static('./bower_components')
+ ),
+ connect.static(appConfig.app)
+ ];
+ }
+ }
+ },
+ dist: {
+ options: {
+ open: true,
+ base: '<%= yeoman.dist %>'
+ }
+ }
+ },
+
+ // Make sure there are no obvious mistakes
+ jshint: {
+ options: {
+ jshintrc: '.jshintrc',
+ reporter: require('jshint-stylish')
+ },
+ all: {
+ src: [
+ 'Gruntfile.js',
+ '<%= yeoman.app %>/scripts/{,*/}*.js'
+ ]
+ },
+ test: {
+ options: {
+ jshintrc: 'test/.jshintrc'
+ },
+ src: ['test/spec/{,*/}*.js']
+ }
+ },
+
+ // Make sure code styles are up to par
+ jscs: {
+ options: {
+ config: '.jscsrc',
+ verbose: true
+ },
+ all: {
+ src: [
+ 'Gruntfile.js',
+ '<%= yeoman.app %>/scripts/{,*/}*.js'
+ ]
+ },
+ test: {
+ src: ['test/spec/{,*/}*.js']
+ }
+ },
+
+ // Empties folders to start fresh
+ clean: {
+ dist: {
+ files: [{
+ dot: true,
+ src: [
+ '.tmp',
+ '<%= yeoman.dist %>/{,*/}*',
+ '!<%= yeoman.dist %>/.git{,*/}*'
+ ]
+ }]
+ },
+ server: '.tmp'
+ },
+
+ // Add vendor prefixed styles
+ postcss: {
+ options: {
+ processors: [
+ require('autoprefixer-core')({browsers: ['last 1 version']})
+ ]
+ },
+ server: {
+ options: {
+ map: true
+ },
+ files: [{
+ expand: true,
+ cwd: '.tmp/styles/',
+ src: '{,*/}*.css',
+ dest: '.tmp/styles/'
+ }]
+ },
+ dist: {
+ files: [{
+ expand: true,
+ cwd: '.tmp/styles/',
+ src: '{,*/}*.css',
+ dest: '.tmp/styles/'
+ }]
+ }
+ },
+
+ // Automatically inject Bower components into the app
+ wiredep: {
+ app: {
+ src: ['<%= yeoman.app %>/index.html'],
+ ignorePath: /\.\.\//
+ },
+ test: {
+ devDependencies: true,
+ src: '<%= karma.unit.configFile %>',
+ ignorePath: /\.\.\//,
+ fileTypes:{
+ js: {
+ block: /(([\s\t]*)\/{2}\s*?bower:\s*?(\S*))(\n|\r|.)*?(\/{2}\s*endbower)/gi,
+ detect: {
+ js: /'(.*\.js)'/gi
+ },
+ replace: {
+ js: '\'{{filePath}}\','
+ }
+ }
+ }
+ },
+ sass: {
+ src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
+ ignorePath: /(\.\.\/){1,2}bower_components\//
+ }
+ },
+
+ // Compiles Sass to CSS and generates necessary files if requested
+ compass: {
+ options: {
+ sassDir: '<%= yeoman.app %>/styles',
+ cssDir: '.tmp/styles',
+ generatedImagesDir: '.tmp/images/generated',
+ imagesDir: '<%= yeoman.app %>/images',
+ javascriptsDir: '<%= yeoman.app %>/scripts',
+ fontsDir: '<%= yeoman.app %>/styles/fonts',
+ importPath: './bower_components',
+ httpImagesPath: '/images',
+ httpGeneratedImagesPath: '/images/generated',
+ httpFontsPath: '/styles/fonts',
+ relativeAssets: false,
+ assetCacheBuster: false,
+ raw: 'Sass::Script::Number.precision = 10\n'
+ },
+ dist: {
+ options: {
+ generatedImagesDir: '<%= yeoman.dist %>/images/generated'
+ }
+ },
+ server: {
+ options: {
+ sourcemap: true
+ }
+ }
+ },
+
+ // Renames files for browser caching purposes
+ filerev: {
+ dist: {
+ src: [
+ '<%= yeoman.dist %>/scripts/{,*/}*.js',
+ '<%= yeoman.dist %>/styles/{,*/}*.css',
+ '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
+ '<%= yeoman.dist %>/styles/fonts/*'
+ ]
+ }
+ },
+
+ // Reads HTML for usemin blocks to enable smart builds that automatically
+ // concat, minify and revision files. Creates configurations in memory so
+ // additional tasks can operate on them
+ useminPrepare: {
+ html: '<%= yeoman.app %>/index.html',
+ options: {
+ dest: '<%= yeoman.dist %>',
+ flow: {
+ html: {
+ steps: {
+ js: ['concat', 'uglifyjs'],
+ css: ['cssmin']
+ },
+ post: {}
+ }
+ }
+ }
+ },
+
+ // Performs rewrites based on filerev and the useminPrepare configuration
+ usemin: {
+ html: ['<%= yeoman.dist %>/{,*/}*.html'],
+ css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
+ js: ['<%= yeoman.dist %>/scripts/{,*/}*.js'],
+ options: {
+ assetsDirs: [
+ '<%= yeoman.dist %>',
+ '<%= yeoman.dist %>/images',
+ '<%= yeoman.dist %>/styles'
+ ],
+ patterns: {
+ js: [[/(images\/[^''""]*\.(png|jpg|jpeg|gif|webp|svg))/g, 'Replacing references to images']]
+ }
+ }
+ },
+
+ // The following *-min tasks will produce minified files in the dist folder
+ // By default, your `index.html`'s will take care of
+ // minification. These next options are pre-configured if you do not wish
+ // to use the Usemin blocks.
+ // cssmin: {
+ // dist: {
+ // files: {
+ // '<%= yeoman.dist %>/styles/main.css': [
+ // '.tmp/styles/{,*/}*.css'
+ // ]
+ // }
+ // }
+ // },
+ // uglify: {
+ // dist: {
+ // files: {
+ // '<%= yeoman.dist %>/scripts/scripts.js': [
+ // '<%= yeoman.dist %>/scripts/scripts.js'
+ // ]
+ // }
+ // }
+ // },
+ // concat: {
+ // dist: {}
+ // },
+
+ imagemin: {
+ dist: {
+ files: [{
+ expand: true,
+ cwd: '<%= yeoman.app %>/images',
+ src: '{,*/}*.{png,jpg,jpeg,gif}',
+ dest: '<%= yeoman.dist %>/images'
+ }]
+ }
+ },
+
+ svgmin: {
+ dist: {
+ files: [{
+ expand: true,
+ cwd: '<%= yeoman.app %>/images',
+ src: '{,*/}*.svg',
+ dest: '<%= yeoman.dist %>/images'
+ }]
+ }
+ },
+
+ htmlmin: {
+ dist: {
+ options: {
+ collapseWhitespace: true,
+ conservativeCollapse: true,
+ collapseBooleanAttributes: true,
+ removeCommentsFromCDATA: true
+ },
+ files: [{
+ expand: true,
+ cwd: '<%= yeoman.dist %>',
+ src: ['*.html'],
+ dest: '<%= yeoman.dist %>'
+ }]
+ }
+ },
+
+ ngtemplates: {
+ dist: {
+ options: {
+ module: 'codeApp',
+ htmlmin: '<%= htmlmin.dist.options %>',
+ usemin: 'scripts/scripts.js'
+ },
+ cwd: '<%= yeoman.app %>',
+ src: 'views/{,*/}*.html',
+ dest: '.tmp/templateCache.js'
+ }
+ },
+
+ // ng-annotate tries to make the code safe for minification automatically
+ // by using the Angular long form for dependency injection.
+ ngAnnotate: {
+ dist: {
+ files: [{
+ expand: true,
+ cwd: '.tmp/concat/scripts',
+ src: '*.js',
+ dest: '.tmp/concat/scripts'
+ }]
+ }
+ },
+
+ // Replace Google CDN references
+ cdnify: {
+ dist: {
+ html: ['<%= yeoman.dist %>/*.html']
+ }
+ },
+
+ // Copies remaining files to places other tasks can use
+ copy: {
+ dist: {
+ files: [{
+ expand: true,
+ dot: true,
+ cwd: '<%= yeoman.app %>',
+ dest: '<%= yeoman.dist %>',
+ src: [
+ '*.{ico,png,txt}',
+ '*.html',
+ 'images/{,*/}*.{webp}',
+ 'styles/fonts/{,*/}*.*'
+ ]
+ }, {
+ expand: true,
+ cwd: '.tmp/images',
+ dest: '<%= yeoman.dist %>/images',
+ src: ['generated/*']
+ }, {
+ expand: true,
+ cwd: '.',
+ src: 'bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*',
+ dest: '<%= yeoman.dist %>'
+ }]
+ },
+ styles: {
+ expand: true,
+ cwd: '<%= yeoman.app %>/styles',
+ dest: '.tmp/styles/',
+ src: '{,*/}*.css'
+ }
+ },
+
+ // Run some tasks in parallel to speed up the build process
+ concurrent: {
+ server: [
+ 'compass:server'
+ ],
+ test: [
+ 'compass'
+ ],
+ dist: [
+ 'compass:dist',
+ 'imagemin',
+ 'svgmin'
+ ]
+ },
+
+ // Test settings
+ karma: {
+ unit: {
+ configFile: 'test/karma.conf.js',
+ singleRun: true
+ }
+ }
+ });
+
+
+ grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
+ if (target === 'dist') {
+ return grunt.task.run(['build', 'connect:dist:keepalive']);
+ }
+
+ grunt.task.run([
+ 'clean:server',
+ 'wiredep',
+ 'concurrent:server',
+ 'postcss:server',
+ 'connect:livereload',
+ 'watch'
+ ]);
+ });
+
+ grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) {
+ grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
+ grunt.task.run(['serve:' + target]);
+ });
+
+ grunt.registerTask('test', [
+ 'clean:server',
+ 'wiredep',
+ 'concurrent:test',
+ 'postcss',
+ 'connect:test',
+ 'karma'
+ ]);
+
+ grunt.registerTask('build', [
+ 'clean:dist',
+ 'wiredep',
+ 'useminPrepare',
+ 'concurrent:dist',
+ 'postcss',
+ 'ngtemplates',
+ 'concat',
+ 'ngAnnotate',
+ 'copy:dist',
+ 'cdnify',
+ 'cssmin',
+ 'uglify',
+ 'filerev',
+ 'usemin',
+ 'htmlmin'
+ ]);
+
+ grunt.registerTask('default', [
+ 'newer:jshint',
+ 'newer:jscs',
+ 'test',
+ 'build'
+ ]);
+};
diff --git a/app/404.html b/app/404.html
new file mode 100644
index 0000000000000000000000000000000000000000..899828a3c27aee4d57c463792ee2d13bd7caf974
--- /dev/null
+++ b/app/404.html
@@ -0,0 +1,152 @@
+
+
+
+
+ Page Not Found :(
+
+
+
+
+
Not found :(
+
Sorry, but the page you were trying to view does not exist.
+
It looks like this was the result of either:
+
+ - a mistyped address
+ - an out-of-date link
+
+
+
+
+
+
diff --git a/app/favicon.ico b/app/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..6527905307f19ba00762f9241f7eb535fa84a2f9
Binary files /dev/null and b/app/favicon.ico differ
diff --git a/app/images/yeoman.png b/app/images/yeoman.png
new file mode 100644
index 0000000000000000000000000000000000000000..92497addf96c5c009ac24007f55eb989f3bf74c6
Binary files /dev/null and b/app/images/yeoman.png differ
diff --git a/app/index.html b/app/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..805d05f2d10f0cb0c9762224624991bae59250c6
--- /dev/null
+++ b/app/index.html
@@ -0,0 +1,32 @@
+
+
+
+
+ Movie Search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/robots.txt b/app/robots.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4d521f952625bfae6d3e769c30e45275d351df11
--- /dev/null
+++ b/app/robots.txt
@@ -0,0 +1,4 @@
+# robotstxt.org
+
+User-agent: *
+Disallow:
diff --git a/app/scripts/app.js b/app/scripts/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..9e8422dc20d1da7f5409c7d5a281758d9daba7a8
--- /dev/null
+++ b/app/scripts/app.js
@@ -0,0 +1,22 @@
+'use strict';
+
+angular.module('movieSearch', [
+ 'ngCookies',
+ 'ngResource',
+ 'ngRoute',
+ ])
+
+ .config(function ($routeProvider) {
+ $routeProvider
+ .when('/', {
+ templateUrl: 'views/all.html',
+ controller: 'searchCtrl'
+ })
+ .when('/detail/:idMovie', {
+ templateUrl: 'views/detail.html',
+ controller: 'detailCtrl'
+ })
+ .otherwise({
+ redirectTo: '/'
+ });
+ });
diff --git a/app/scripts/controllers.js b/app/scripts/controllers.js
new file mode 100644
index 0000000000000000000000000000000000000000..66aba5a15ebb96e06fd248965eece8afe676701d
--- /dev/null
+++ b/app/scripts/controllers.js
@@ -0,0 +1,24 @@
+angular.module('movieSearch')
+
+.controller('searchCtrl', function searchCtrl($scope, searchFactory) {
+ $scope.items = searchFactory.allMoviesResource.get(successFn, errorFn);
+
+ function successFn() {
+ $scope.items = $scope.items["Search"]
+ console.log($scope.items)
+ }
+ function errorFn() {
+ console.error("Erreur dans la lecture de l'API")
+ }
+})
+
+.controller('detailCtrl', function searchCtrl($scope, $routeParams, searchFactory) {
+ $scope.movie = searchFactory.detailMovieResource.get({idMovie: $routeParams.idMovie});
+
+ function successFn() {
+ console.log($scope.movie)
+ }
+ function errorFn() {
+ console.error("Erreur dans la lecture de l'API")
+ }
+});
diff --git a/app/scripts/filter.js b/app/scripts/filter.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e3a62a91d06b7cba1b69dbb741c5ae867153d90
--- /dev/null
+++ b/app/scripts/filter.js
@@ -0,0 +1,26 @@
+angular.module('movieSearch')
+
+.filter('searchFor', function(){
+ return function(arr, searchString){
+
+ if(!searchString){
+ return arr;
+ }
+
+ var result = [];
+ console.log(searchString)
+ searchString = searchString.toLowerCase();
+
+ // Using the forEach helper method to loop through the array
+ angular.forEach(arr, function(item){
+
+ if(item.Title.toLowerCase().indexOf(searchString) !== -1){
+ result.push(item);
+ }
+
+ });
+
+ return result;
+ };
+
+});
diff --git a/app/scripts/services.js b/app/scripts/services.js
new file mode 100644
index 0000000000000000000000000000000000000000..47f56a5cbd0b33633424e5f3589b9bb406a2419f
--- /dev/null
+++ b/app/scripts/services.js
@@ -0,0 +1,13 @@
+angular.module('movieSearch')
+
+.factory('searchFactory', function($resource) {
+
+ var allMoviesResource = $resource('http://www.omdbapi.com/?s=la&y=&plot=short&r=json&page=1');
+ var detailMovieResource = $resource('http://www.omdbapi.com/?i=:idMovie&plot=short&r=json',
+ {idMovie:'@idMovie'}
+ );
+ return {
+ allMoviesResource: allMoviesResource,
+ detailMovieResource: detailMovieResource
+ };
+});
diff --git a/app/styles/main.css b/app/styles/main.css
new file mode 100644
index 0000000000000000000000000000000000000000..0f0655668459b8aad530c2852190e8772f14856d
--- /dev/null
+++ b/app/styles/main.css
@@ -0,0 +1,89 @@
+*{
+ margin:0;
+ padding:0;
+}
+
+body{
+ font:15px/1.3 'Open Sans', sans-serif;
+ color: #5e5b64;
+ text-align:center;
+}
+
+a, a:visited {
+ outline:none;
+ color:#389dc1;
+}
+
+a:hover{
+ text-decoration:none;
+}
+
+section, footer, header, aside, nav{
+ display: block;
+}
+
+/*-------------------------
+ The search input
+--------------------------*/
+
+.bar{
+ background-color:#5c9bb7;
+
+ background-image:-webkit-linear-gradient(top, #5c9bb7, #5392ad);
+ background-image:-moz-linear-gradient(top, #5c9bb7, #5392ad);
+ background-image:linear-gradient(top, #5c9bb7, #5392ad);
+
+ box-shadow: 0 1px 1px #ccc;
+ border-radius: 2px;
+ width: 400px;
+ padding: 14px;
+ margin: 45px auto 20px;
+ position:relative;
+}
+
+.bar input{
+ background:#fff no-repeat 13px 13px;
+ background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkU5NEY0RTlFMTA4NzExRTM5RTEzQkFBQzMyRjkyQzVBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkU5NEY0RTlGMTA4NzExRTM5RTEzQkFBQzMyRjkyQzVBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RTk0RjRFOUMxMDg3MTFFMzlFMTNCQUFDMzJGOTJDNUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RTk0RjRFOUQxMDg3MTFFMzlFMTNCQUFDMzJGOTJDNUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4DjA/RAAABK0lEQVR42pTSQUdEURjG8dOY0TqmPkGmRcqYD9CmzZAWJRHVRIa0iFYtM6uofYaiEW2SRJtEi9YxIklp07ZkWswu0v/wnByve7vm5ee8M+85zz1jbt9Os+WiGkYdYxjCOx5wgFeXUHmtBSzpcCGa+5BJTCjEP+0nKWAT8xqe4ArPGEEVC1hHEbs2oBwdXkM7mj/JLZrad437sCGHOfUtcziutuYu2v8XUFF/4f6vMK/YgAH1HxkBYV60AR31gxkBYd6xAeF3VzMCwvzOBpypX8V4yuFRzX2d2gD/l5yjH4fYQEnzkj4fae5rJulF2sMXVrAsaTWttRFu4Osb+1jEDT71/ZveyhouTch2fINQL9hKefKjuYFfuznXWzXMTabyrvfyIV3M4vhXgAEAUMs7K0J9UJAAAAAASUVORK5CYII=);
+
+ border: none;
+ width: 100%;
+ line-height: 19px;
+ padding: 11px 0;
+
+ border-radius: 2px;
+ box-shadow: 0 2px 8px #c4c4c4 inset;
+ text-align: left;
+ font-size: 14px;
+ font-family: inherit;
+ color: #738289;
+ font-weight: bold;
+ outline: none;
+ text-indent: 40px;
+}
+
+ul{
+ list-style: none;
+ width: 428px;
+ margin: 0 auto;
+ text-align: left;
+}
+
+ul li{
+ border-bottom: 1px solid #ddd;
+ padding: 10px;
+ overflow: hidden;
+}
+
+ul li img{
+ width:60px;
+ height:60px;
+ float:left;
+ border:none;
+}
+
+ul li p{
+ margin-left: 75px;
+ font-weight: bold;
+ padding-top: 12px;
+ color:#6e7a7f;
+}
diff --git a/app/views/all.html b/app/views/all.html
new file mode 100644
index 0000000000000000000000000000000000000000..19aa3e431f01f2215c32d7e8a482258455eec604
--- /dev/null
+++ b/app/views/all.html
@@ -0,0 +1,9 @@
+
+
+
+
+ -
+
+ {{i.Title}}
+
+
diff --git a/app/views/detail.html b/app/views/detail.html
new file mode 100644
index 0000000000000000000000000000000000000000..624925921f72339878d8ba0c1666cae40f74e965
--- /dev/null
+++ b/app/views/detail.html
@@ -0,0 +1,7 @@
+
+ -
+
+ {{movie.Title}}
+ {{movie.Year}}
+
+
diff --git a/bower.json b/bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..f25631f48c8c9d78e4f0f4ce4f0d54c2f25117d3
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,28 @@
+{
+ "name": "code",
+ "version": "0.0.0",
+ "dependencies": {
+ "angular": "^1.4.0",
+ "bootstrap-sass-official": "^3.2.0",
+ "angular-animate": "^1.4.0",
+ "angular-cookies": "^1.4.0",
+ "angular-resource": "^1.4.0",
+ "angular-route": "^1.4.0",
+ "angular-sanitize": "^1.4.0",
+ "angular-touch": "^1.4.0"
+ },
+ "devDependencies": {
+ "angular-mocks": "^1.4.0"
+ },
+ "appPath": "app",
+ "moduleName": "codeApp",
+ "overrides": {
+ "bootstrap": {
+ "main": [
+ "less/bootstrap.less",
+ "dist/css/bootstrap.css",
+ "dist/js/bootstrap.js"
+ ]
+ }
+ }
+}
diff --git a/npm-debug.log b/npm-debug.log
new file mode 100644
index 0000000000000000000000000000000000000000..1cc8a8ea35f86a65cfddc8559f201f0d62479332
--- /dev/null
+++ b/npm-debug.log
@@ -0,0 +1,99 @@
+0 info it worked if it ends with ok
+1 verbose cli [ '/usr/bin/node',
+1 verbose cli '/usr/local/bin/npm',
+1 verbose cli 'install',
+1 verbose cli 'fsevents',
+1 verbose cli '--save-devs' ]
+2 info using npm@3.10.5
+3 info using node@v5.2.0
+4 silly loadCurrentTree Starting
+5 silly install loadCurrentTree
+6 silly install readLocalPackageData
+7 silly fetchPackageMetaData fsevents
+8 silly fetchNamedPackageData fsevents
+9 silly mapToRegistry name fsevents
+10 silly mapToRegistry using default registry
+11 silly mapToRegistry registry https://registry.npmjs.org/
+12 silly mapToRegistry data Result {
+12 silly mapToRegistry raw: 'fsevents',
+12 silly mapToRegistry scope: null,
+12 silly mapToRegistry escapedName: 'fsevents',
+12 silly mapToRegistry name: 'fsevents',
+12 silly mapToRegistry rawSpec: '',
+12 silly mapToRegistry spec: 'latest',
+12 silly mapToRegistry type: 'tag' }
+13 silly mapToRegistry uri https://registry.npmjs.org/fsevents
+14 verbose request uri https://registry.npmjs.org/fsevents
+15 verbose request no auth needed
+16 info attempt registry request try #1 at 16:44:08
+17 verbose request id e089d9cde2968d17
+18 verbose etag "J1WMJADQEUBTKGSOYI5A2X04"
+19 http request GET https://registry.npmjs.org/fsevents
+20 http 304 https://registry.npmjs.org/fsevents
+21 verbose headers { date: 'Thu, 13 Oct 2016 14:44:08 GMT',
+21 verbose headers via: '1.1 varnish',
+21 verbose headers 'cache-control': 'max-age=300',
+21 verbose headers etag: '"J1WMJADQEUBTKGSOYI5A2X04"',
+21 verbose headers age: '174',
+21 verbose headers connection: 'keep-alive',
+21 verbose headers 'x-served-by': 'cache-cdg8733-CDG',
+21 verbose headers 'x-cache': 'HIT',
+21 verbose headers 'x-cache-hits': '8',
+21 verbose headers 'x-timer': 'S1476369848.391218,VS0,VE0',
+21 verbose headers vary: 'Accept-Encoding' }
+22 silly get cb [ 304,
+22 silly get { date: 'Thu, 13 Oct 2016 14:44:08 GMT',
+22 silly get via: '1.1 varnish',
+22 silly get 'cache-control': 'max-age=300',
+22 silly get etag: '"J1WMJADQEUBTKGSOYI5A2X04"',
+22 silly get age: '174',
+22 silly get connection: 'keep-alive',
+22 silly get 'x-served-by': 'cache-cdg8733-CDG',
+22 silly get 'x-cache': 'HIT',
+22 silly get 'x-cache-hits': '8',
+22 silly get 'x-timer': 'S1476369848.391218,VS0,VE0',
+22 silly get vary: 'Accept-Encoding' } ]
+23 verbose etag https://registry.npmjs.org/fsevents from cache
+24 verbose get saving fsevents to /home/artix41/.npm/registry.npmjs.org/fsevents/.cache.json
+25 verbose correctMkdir /home/artix41/.npm correctMkdir not in flight; initializing
+26 silly install normalizeTree
+27 silly loadCurrentTree Finishing
+28 silly loadIdealTree Starting
+29 silly install loadIdealTree
+30 silly cloneCurrentTree Starting
+31 silly install cloneCurrentTreeToIdealTree
+32 silly cloneCurrentTree Finishing
+33 silly loadShrinkwrap Starting
+34 silly install loadShrinkwrap
+35 silly loadShrinkwrap Finishing
+36 silly loadAllDepsIntoIdealTree Starting
+37 silly install loadAllDepsIntoIdealTree
+38 silly rollbackFailedOptional Starting
+39 silly rollbackFailedOptional Finishing
+40 silly runTopLevelLifecycles Starting
+41 silly runTopLevelLifecycles Finishing
+42 silly install printInstalled
+43 verbose stack Error: Unsupported platform for fsevents@1.0.14: wanted {"name":"fsevents","version":"1.0.14","description":"Native Access to Mac OS-X FSEvents","main":"fsevents.js","dependencies":{"nan":"^2.3.0","node-pre-gyp":"^0.6.29"},"os":["darwin"],"engines":{"node":">=0.8.0"},"scripts":{"install":"node-pre-gyp install --fallback-to-build","prepublish":"if [ $(npm -v | head -c 1) -lt 3 ]; then exit 1; fi && npm dedupe","test":"tap ./test"},"binary":{"module_name":"fse","module_path":"./lib/binding/{configuration}/{node_abi}-{platform}-{arch}/","remote_path":"./v{version}/","package_name":"{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz","host":"https://fsevents-binaries.s3-us-west-2.amazonaws.com"},"repository":{"type":"git","url":"git+https://github.com/strongloop/fsevents.git"},"keywords":["fsevents","mac"],"author":{"name":"Philipp Dunkel","email":"pip@pipobscure.com"},"license":"MIT","bugs":{"url":"https://github.com/strongloop/fsevents/issues"},"homepage":"https://github.com/strongloop/fsevents","devDependencies":{"tap":"~0.4.8"},"gitHead":"fe059ea77fae15ed289271eecc881a2b7fb54edd","bundleDependencies":["node-pre-gyp"],"_id":"fsevents@1.0.14","_shasum":"558e8cc38643d8ef40fe45158486d0d25758eee4","_from":"fsevents","_npmVersion":"3.6.0","_nodeVersion":"5.6.0","_npmUser":{"name":"es128","email":"elan.shanker+npm@gmail.com"},"dist":{"shasum":"558e8cc38643d8ef40fe45158486d0d25758eee4","tarball":"https://registry.npmjs.org/fsevents/-/fsevents-1.0.14.tgz"},"maintainers":[{"name":"bajtos","email":"miro.bajtos@gmail.com"},{"name":"bnoordhuis","email":"info@bnoordhuis.nl"},{"name":"es128","email":"elan.shanker+npm@gmail.com"},{"name":"pipobscure","email":"pip@pipobscure.com"},{"name":"strongloop","email":"callback@strongloop.com"}],"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/fsevents-1.0.14.tgz_1468846610948_0.4684492303058505"},"directories":{},"_resolved":"https://registry.npmjs.org/fsevents/-/fsevents-1.0.14.tgz","_requested":{"raw":"fsevents","scope":null,"escapedName":"fsevents","name":"fsevents","rawSpec":"","spec":"latest","type":"tag"},"_spec":"fsevents","_where":"/home/artix41/ENSTA/DaTA/Formations/AngularJS/Code","_args":[[{"raw":"fsevents","scope":null,"escapedName":"fsevents","name":"fsevents","rawSpec":"","spec":"latest","type":"tag"},"/home/artix41/ENSTA/DaTA/Formations/AngularJS/Code"]],"readme":"ERROR: No README data found!"} (current: {"os":"linux","cpu":"x64"})
+43 verbose stack at checkPlatform (/usr/local/lib/node_modules/npm/node_modules/npm-install-checks/index.js:45:14)
+43 verbose stack at thenWarnEngineIssues (/usr/local/lib/node_modules/npm/lib/install/validate-args.js:41:5)
+43 verbose stack at /usr/local/lib/node_modules/npm/node_modules/iferr/index.js:13:50
+43 verbose stack at checkEngine (/usr/local/lib/node_modules/npm/node_modules/npm-install-checks/index.js:24:10)
+43 verbose stack at module.exports.isInstallable (/usr/local/lib/node_modules/npm/lib/install/validate-args.js:38:3)
+43 verbose stack at Array. (/usr/local/lib/node_modules/npm/node_modules/slide/lib/bind-actor.js:15:8)
+43 verbose stack at LOOP (/usr/local/lib/node_modules/npm/node_modules/slide/lib/chain.js:15:14)
+43 verbose stack at /usr/local/lib/node_modules/npm/node_modules/slide/lib/chain.js:18:7
+43 verbose stack at checkSelf (/usr/local/lib/node_modules/npm/lib/install/validate-args.js:46:72)
+43 verbose stack at Array. (/usr/local/lib/node_modules/npm/node_modules/slide/lib/bind-actor.js:15:8)
+44 verbose pkgid fsevents@1.0.14
+45 verbose cwd /home/artix41/ENSTA/DaTA/Formations/AngularJS/Code
+46 error Linux 3.16.0-67-generic
+47 error argv "/usr/bin/node" "/usr/local/bin/npm" "install" "fsevents" "--save-devs"
+48 error node v5.2.0
+49 error npm v3.10.5
+50 error code EBADPLATFORM
+51 error notsup Not compatible with your operating system or architecture: fsevents@1.0.14
+52 error notsup Valid OS: darwin
+52 error notsup Valid Arch: any
+52 error notsup Actual OS: linux
+52 error notsup Actual Arch: x64
+53 verbose exit [ 1, true ]
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..128132478ffc2900abb2b753f50ac9264b3ade28
--- /dev/null
+++ b/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "code",
+ "private": true,
+ "devDependencies": {
+ "autoprefixer-core": "^5.2.1",
+ "grunt": "^0.4.5",
+ "grunt-angular-templates": "^0.5.7",
+ "grunt-concurrent": "^1.0.0",
+ "grunt-contrib-clean": "^0.6.0",
+ "grunt-contrib-compass": "^1.1.1",
+ "grunt-contrib-concat": "^0.5.0",
+ "grunt-contrib-connect": "^0.9.0",
+ "grunt-contrib-copy": "^0.7.0",
+ "grunt-contrib-cssmin": "^0.12.0",
+ "grunt-contrib-htmlmin": "^0.4.0",
+ "grunt-contrib-imagemin": "^1.0.0",
+ "grunt-contrib-jshint": "^0.11.0",
+ "grunt-contrib-uglify": "^0.7.0",
+ "grunt-contrib-watch": "^0.6.1",
+ "grunt-filerev": "^2.1.2",
+ "grunt-google-cdn": "^0.4.3",
+ "grunt-jscs": "^1.8.0",
+ "grunt-newer": "^1.1.0",
+ "grunt-ng-annotate": "^0.9.2",
+ "grunt-postcss": "^0.5.5",
+ "grunt-svgmin": "^2.0.0",
+ "grunt-usemin": "^3.0.0",
+ "grunt-wiredep": "^2.0.0",
+ "jit-grunt": "^0.9.1",
+ "jshint-stylish": "^1.0.0",
+ "time-grunt": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "karma start test/karma.conf.js"
+ }
+}
diff --git a/test/.jshintrc b/test/.jshintrc
new file mode 100644
index 0000000000000000000000000000000000000000..b2ce4eff44a0af0767198b91be08a67fe21b0b09
--- /dev/null
+++ b/test/.jshintrc
@@ -0,0 +1,18 @@
+{
+ "bitwise": true,
+ "browser": true,
+ "curly": true,
+ "eqeqeq": true,
+ "esnext": true,
+ "jasmine": true,
+ "latedef": true,
+ "noarg": true,
+ "node": true,
+ "strict": true,
+ "undef": true,
+ "unused": true,
+ "globals": {
+ "angular": false,
+ "inject": false
+ }
+}
diff --git a/test/karma.conf.js b/test/karma.conf.js
new file mode 100644
index 0000000000000000000000000000000000000000..f25494739b0f7b95b5cfb6128b2d08587c718a50
--- /dev/null
+++ b/test/karma.conf.js
@@ -0,0 +1,81 @@
+// Karma configuration
+// Generated on 2016-10-13
+
+module.exports = function(config) {
+ 'use strict';
+
+ config.set({
+ // enable / disable watching file and executing tests whenever any file changes
+ autoWatch: true,
+
+ // base path, that will be used to resolve files and exclude
+ basePath: '../',
+
+ // testing framework to use (jasmine/mocha/qunit/...)
+ // as well as any additional frameworks (requirejs/chai/sinon/...)
+ frameworks: [
+ 'jasmine'
+ ],
+
+ // list of files / patterns to load in the browser
+ files: [
+ // bower:js
+ 'bower_components/jquery/dist/jquery.js',
+ 'bower_components/angular/angular.js',
+ 'bower_components/bootstrap-sass-official/assets/javascripts/bootstrap.js',
+ 'bower_components/angular-animate/angular-animate.js',
+ 'bower_components/angular-cookies/angular-cookies.js',
+ 'bower_components/angular-resource/angular-resource.js',
+ 'bower_components/angular-route/angular-route.js',
+ 'bower_components/angular-sanitize/angular-sanitize.js',
+ 'bower_components/angular-touch/angular-touch.js',
+ 'bower_components/angular-mocks/angular-mocks.js',
+ // endbower
+ 'app/scripts/**/*.js',
+ 'test/mock/**/*.js',
+ 'test/spec/**/*.js'
+ ],
+
+ // list of files / patterns to exclude
+ exclude: [
+ ],
+
+ // web server port
+ port: 8080,
+
+ // Start these browsers, currently available:
+ // - Chrome
+ // - ChromeCanary
+ // - Firefox
+ // - Opera
+ // - Safari (only Mac)
+ // - PhantomJS
+ // - IE (only Windows)
+ browsers: [
+ 'PhantomJS'
+ ],
+
+ // Which plugins to enable
+ plugins: [
+ 'karma-phantomjs-launcher',
+ 'karma-jasmine'
+ ],
+
+ // Continuous Integration mode
+ // if true, it capture browsers, run tests and exit
+ singleRun: false,
+
+ colors: true,
+
+ // level of logging
+ // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
+ logLevel: config.LOG_INFO,
+
+ // Uncomment the following lines if you are using grunt's server to run the tests
+ // proxies: {
+ // '/': 'http://localhost:9000/'
+ // },
+ // URL root prevent conflicts with the site root
+ // urlRoot: '_karma_'
+ });
+};
diff --git a/test/spec/controllers/about.js b/test/spec/controllers/about.js
new file mode 100644
index 0000000000000000000000000000000000000000..6a176ebe7e899fae305dbc1654b662eaf0068135
--- /dev/null
+++ b/test/spec/controllers/about.js
@@ -0,0 +1,23 @@
+'use strict';
+
+describe('Controller: AboutCtrl', function () {
+
+ // load the controller's module
+ beforeEach(module('codeApp'));
+
+ var AboutCtrl,
+ scope;
+
+ // Initialize the controller and a mock scope
+ beforeEach(inject(function ($controller, $rootScope) {
+ scope = $rootScope.$new();
+ AboutCtrl = $controller('AboutCtrl', {
+ $scope: scope
+ // place here mocked dependencies
+ });
+ }));
+
+ it('should attach a list of awesomeThings to the scope', function () {
+ expect(AboutCtrl.awesomeThings.length).toBe(3);
+ });
+});
diff --git a/test/spec/controllers/main.js b/test/spec/controllers/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..1f3cbf47c17067bad15c7eb56d82575c284455ae
--- /dev/null
+++ b/test/spec/controllers/main.js
@@ -0,0 +1,23 @@
+'use strict';
+
+describe('Controller: MainCtrl', function () {
+
+ // load the controller's module
+ beforeEach(module('codeApp'));
+
+ var MainCtrl,
+ scope;
+
+ // Initialize the controller and a mock scope
+ beforeEach(inject(function ($controller, $rootScope) {
+ scope = $rootScope.$new();
+ MainCtrl = $controller('MainCtrl', {
+ $scope: scope
+ // place here mocked dependencies
+ });
+ }));
+
+ it('should attach a list of awesomeThings to the scope', function () {
+ expect(MainCtrl.awesomeThings.length).toBe(3);
+ });
+});