Skip to content

Commit aa7812e

Browse files
committed
Merge pull request timoxley#87 from deliciousinsights/l10n-fr
L10n fr
2 parents 6e4ced6 + 6764e14 commit aa7812e

File tree

115 files changed

+1851
-439
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

115 files changed

+1851
-439
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
node_modules
22
.DS_Store
3+
npm-debug.log
4+
TODO.md

exercises/async_loops/exercise.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
"use strict"
2+
3+
var deepEqual = require('deep-eql')
4+
var inspect = require('util').inspect
5+
var loremIpsum = require('lorem-ipsum')
6+
var random = require('../randomizer')
7+
var runner = require('../runner')
8+
9+
// All deepEqual impls (assert, deep-eql…) seem to b0rk when multiple objects
10+
// in an array share the same `id` value (wtf?!), so we make sure they're unique.
11+
var userCount = random.int(10, 20)
12+
var userIds = []
13+
while (userIds.length < userCount) {
14+
var id = random.int(0, 1000)
15+
if (-1 !== userIds.indexOf(id)) continue
16+
userIds.push(id)
17+
}
18+
19+
var users = random.arrayOf(userCount, function() {
20+
return {
21+
id: userIds.shift(),
22+
name: random.words(2, { capitalized: true })
23+
}
24+
})
25+
26+
var fx
27+
28+
module.exports = runner.custom(function(f) {
29+
fx = f
30+
}).wrapUp(function(callback) {
31+
var self = this
32+
var ids = users.map(function(user) {return user.id })
33+
var load = function(id, fn) {
34+
setTimeout(function() {
35+
var match = users.filter(function(user) {return user.id === id})
36+
if (match.length) fn(match[0])
37+
else fn(null)
38+
}, random.int(0, 1000))
39+
}
40+
var done = function(submittedUsers) {
41+
clearTimeout(tooLong)
42+
console.log(submittedUsers)
43+
44+
if (!deepEqual(submittedUsers, users)) {
45+
self.emit('fail', self.__('bad_result', inspect(users), inspect(submittedUsers)))
46+
return callback(null, false)
47+
}
48+
49+
console.log(self.__('all_loaded', submittedUsers.length))
50+
callback(null, true)
51+
}
52+
53+
fx.call(fx, ids, load, done)
54+
var tooLong = setTimeout(function() {
55+
self.emit('fail', self.__('took_too_long'))
56+
callback(null, false)
57+
}, 1000)
58+
}).quiet(users)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
Le code ci-dessous est cassé !
2+
3+
Un développeur Java a ajouté le code atroce ci-dessous à notre projet et ne l’a pas testé !
4+
5+
```js
6+
function loadUsers(userIds, load, done) {
7+
var users = []
8+
for (var i = 0; i < userIds.length; i++) {
9+
users.push(load(userIds[i]))
10+
}
11+
return users
12+
}
13+
14+
module.exports = loadUsers
15+
```
16+
17+
## Défi
18+
19+
Corrigez ce code ! La fonction de rappel `done()` devrait être appelée une fois que tous les utilisateurs ont été chargés. L’ordre des utilisateurs doit correspondre à celui des IDs reçus. Vu que cette fonction est asynchrone, on se fiche de sa valeur de retour.
20+
21+
## Arguments
22+
23+
* `userIds` : un tableau d’IDs numériques d’utilisateurs.
24+
* `load` : une fonction asynchrone de chargement d’un objet utilisateur. Reçoit un ID et une fonction de rappel. Celle-ci sera appelée avec le résultat du chargement pour l’utilisateur avec l’ID indiqué (soit un objet utilisateur, soit `null`).
25+
* `done` : une fonction de rappel finale, qui attend comme argument un tableau des objets utilisateurs chargés.
26+
27+
## Conditions
28+
29+
* N’utilisez pas de boucles `for`/`while` (mais `Array#forEach()` reste autorisé).
30+
* L’ordre des utilisateurs dans le tableau passé à `done()` doit correspondre à celui des IDs dans le tableau `userIds` que vous aurez reçu.
31+
* Les utilisateurs doivent être chargés en parallèle, donc la séquence entière ne devrait pas dépasser une seconde.
32+
* Ne créez aucune fonction superflue
33+
34+
## Conseils
35+
36+
* Vous n’avez pas besoin d’un tri pour maintenir l’ordre du résultat.
37+
* Si vous utilisez `console.log()`, ça va impacter notre vérification. Ne vous en servez que pendant votre phase de mise au point avec `{appname} run`.
38+
39+
## Base de travail
40+
41+
```js
42+
function loadUsers(userIds, load, done) {
43+
var users = []
44+
for (var i = 0; i < userIds.length; i++) {
45+
users.push(load(userIds[i]))
46+
}
47+
return users
48+
}
49+
50+
module.exports = loadUsers
51+
```
File renamed without changes.
File renamed without changes.

problems/basic_call/setup.js renamed to exercises/basic_call/exercise.js

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

3-
var input = require('../../input')
3+
var random = require('../randomizer')
4+
var runner = require('../runner')
45

5-
function randomInt(min, max) {
6-
return Math.floor((Math.random() * (max - min + 1)) + min)
7-
}
6+
var input = random.arrayOfInts(20, 0, 10)
87

9-
module.exports = input(new Array(randomInt(0, 20))
10-
.join(',')
11-
.split(',')
12-
.map(function() {
13-
return randomInt(0, 10)
14-
})).wrap(function(input, mod) {
15-
var numbers = input[0]
8+
var exercise = module.exports = runner.custom(function(fx, numbers) {
169
var valid = 1
1710
var objects = [{quack: true}].concat(numbers.map(function(num) {
1811
switch(num) {
@@ -60,5 +53,5 @@ module.exports = input(new Array(randomInt(0, 20))
6053
}
6154
}))
6255

63-
console.log('Matched %d of %d valid objects from %d total.', mod.apply(mod, objects), valid, objects.length)
64-
})
56+
return exercise.__('matched_objects', fx.apply(null, objects), valid, objects.length)
57+
}).hideInput(input)

exercises/basic_call/problem.fr.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
JavaScript supporte le « duck typing », une méthode dynamique de test des types d’objet. Elle repose sur l’analyse des méthodes et propriétés d’un objet pour déterminer sa sémantique, plutôt que de se fier à un héritage de classe particulière ou à l’implémentation d’une interface abstraite… Le nom de ce concept vient du « test du canard », attribué à James Whitcomb Riley, qu’on peut formuler ainsi :
2+
3+
> « Quand je vois un volatile qui marche comme un canard, nage comme un canard, et cancane comme un canard, alors j’appelle ce volatile un canard. »
4+
5+
En JavaScript, pour écrire des programmes robustes, nous avons parfois besoin de vérifier qu’un objet est conforme au type dont nous avons besoin.
6+
7+
Nous pouvons utiliser `Object#hasOwnProperty()` pour détecter qu’un objet « a » une propriété définie sur lui-même, ce qu’on appelle une *propriété propre* (par opposition à une propriété hérité du prototype) :
8+
9+
```js
10+
var duck = {
11+
quack: function() {
12+
console.log('quack')
13+
}
14+
}
15+
16+
duck.hasOwnProperty('quack') // => true
17+
```
18+
19+
Nous n’avons toutefois pas équipé `duck` d’une méthode `hasOwnProperty()`, alors d’où vient-elle ?
20+
21+
`duck` a été créé avec la syntaxe littérale `{…}`, qui définit un objet, de sorte qu’il hérite automatiquement de `Object.prototype` :
22+
23+
```js
24+
var object = {quack: true}
25+
26+
Object.getPrototypeOf(object) === Object.prototype // => true
27+
object.hasOwnProperty('quack') // => true
28+
```
29+
30+
Mais qu’en serait-il pour un objet qui n’hérite pas de `Object.prototype` ?
31+
32+
```js
33+
// Créons un objet avec un prototype `null`
34+
var object = Object.create(null)
35+
object.quack = function() {
36+
console.log('quack')
37+
}
38+
39+
Object.getPrototypeOf(object) === Object.prototype // => false
40+
Object.getPrototypeOf(object) === null // => true
41+
42+
object.hasOwnProperty('quack')
43+
// => TypeError: Object object has no method 'hasOwnProperty'
44+
```
45+
46+
Nous pouvons toujours appeler la `hasOwnProperty()` de `Object.prototype`, ceci dit, du moment que nous l’appelons avec un `this` qui « ressemble à un objet ». `Function#call` nous permet d’appeler n’importe quelle fonction avec un `this` que nous contrôlons.
47+
48+
```js
49+
// Le premier argument de `call` sera le `this`
50+
// Le reste des arguments est passé à la fonction
51+
52+
Object.prototype.hasOwnProperty.call(object, 'quack') // => true
53+
```
54+
55+
# Défi
56+
57+
Écrivez une fonction `duckCount()` qui inspecte les arguments qu’on lui passe et renvoie le nombre de ceux qui ont une propriété propre `quack` définie. Ignorez les propriétés hérités des prototypes.
58+
59+
Exemple :
60+
61+
```js
62+
var notDuck = Object.create({quack: true})
63+
var duck = {quack: true}
64+
duckCount(duck, notDuck) // 1
65+
```
66+
## Arguments
67+
68+
Vous recevrez un nombre variable d’arguments, d’un appel à l’autre. Chaque argument pourra être d’un type quelconque, avec des propriétés quelconques. Certains arguments auront une propriété `quack`, parfois héritée du prototype. Certains pourrons ne pas être équipés de `hasOwnProperty()`.
69+
70+
## Conditions
71+
72+
* N’utilisez ni boucle (`for`, `while`…) ni `Array.prototype.forEach`
73+
* Ne maintenez pas de variable pour le compteur / l’accumulateur.
74+
* Ne créez aucune fonction superflue
75+
76+
## Conseil
77+
78+
La variable automatique `arguments`, disponible dans toute fonction, est un *objet* qui ressemble à un tableau sans en être vraiment un :
79+
80+
```js
81+
{
82+
0: 'argument0',
83+
1: 'argument1', // etc.
84+
length: 2
85+
}
86+
```
87+
88+
## Ressources
89+
90+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Function/call
91+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/hasOwnProperty
92+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Op%C3%A9rateurs/L_op%C3%A9rateur_in
93+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/slice#Array-like
94+
* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Fonctions/arguments
95+
96+
## Base de travail
97+
98+
```js
99+
function duckCount() {
100+
// VOTRE SOLUTION ICI
101+
}
102+
103+
module.exports = duckCount
104+
```
File renamed without changes.
File renamed without changes.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"use strict"
2+
3+
var random = require('../randomizer')
4+
var runner = require('../runner')
5+
6+
function makeUser() {
7+
return {
8+
id: random.int(0, 1000),
9+
name: random.words(2, { capitalized: true })
10+
}
11+
}
12+
13+
function makeListOfUsers() {
14+
return random.arrayOf(10, 100, makeUser)
15+
}
16+
17+
var good = makeListOfUsers()
18+
var bad = makeListOfUsers()
19+
var lists = random.arrayOf(20, function() {
20+
return random.arrayOf(20, function() {
21+
if (Math.random() < 0.95) {
22+
return good[random.int(0, 10)]
23+
} else {
24+
return bad[random.int(0, 10)]
25+
}
26+
})
27+
})
28+
29+
var exercise = module.exports = runner.custom(function(fx, good, lists) {
30+
var test = fx(good)
31+
32+
var goodLists = 0
33+
34+
lists.forEach(function(list) {
35+
test(list) && ++goodLists
36+
})
37+
38+
return exercise.__('found_good_lists', goodLists)
39+
}).hideInput(good, lists)

0 commit comments

Comments
 (0)