From 2f43e0380b5d1b8db6f8a99cb55e7a2d5dd92876 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 12 Jun 2015 15:27:51 -0700 Subject: [PATCH 1/6] add create identities on flatten users --- flattenUser.js | 68 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/flattenUser.js b/flattenUser.js index f919d6b471..3163349cf2 100644 --- a/flattenUser.js +++ b/flattenUser.js @@ -1,12 +1,21 @@ /* eslint-disable no-process-exit */ require('dotenv').load(); -var assign = require('lodash/object/assign'), - Rx = require('rx'), +var Rx = require('rx'), + uuid = require('node-uuid'), + assign = require('lodash/object/assign'), mongodb = require('mongodb'), secrets = require('../config/secrets'); var MongoClient = mongodb.MongoClient; +var providers = [ + 'facebook', + 'twitter', + 'google', + 'github', + 'linkedin' +]; + function createConnection(URI) { return Rx.Observable.create(function(observer) { MongoClient.connect(URI, function(err, database) { @@ -48,6 +57,7 @@ function insertMany(db, collection, users, options) { if (err) { return observer.onError(err); } + observer.onNext(); observer.onCompleted(); }); }); @@ -56,7 +66,8 @@ function insertMany(db, collection, users, options) { var count = 0; // will supply our db object var dbObservable = createConnection(secrets.db).shareReplay(); -dbObservable + +var users = dbObservable .flatMap(function(db) { // returns user document, n users per loop where n is the batchsize. return createQuery(db, 'users', {}); @@ -66,7 +77,17 @@ dbObservable assign(user, user.portfolio, user.profile); return user; }) - // batch them into arrays of twenty documents + .map(function(user) { + if (user.username) { + return user; + } + user.username = 'fcc' + uuid.v4().slice(0, 8); + return user; + }) + .shareReplay(); + +// batch them into arrays of twenty documents +var userSavesCount = users .bufferWithCount(20) // get bd object ready for insert .withLatestFrom(dbObservable, function(users, db) { @@ -80,10 +101,45 @@ dbObservable return insertMany(dats.db, 'user', dats.users, { w: 1 }); }) // count how many times insert completes - .count() + .count(); + +// create User Identities +var userIdentityCount = users + .flatMap(function(user) { + var ids = providers + .map(function(provider) { + return { + provider: provider, + externalId: user[provider] + }; + }) + .filter(function(ident) { + return !!ident.externalId; + }); + + return Rx.Observable.from(ids); + }) + .bufferWithCount(20) + .withLatestFrom(dbObservable, function(identities, db) { + return { + identities: identities, + db: db + }; + }) + .flatMap(function(dats) { + // bulk insert into new collection for loopback + return insertMany(dats.db, 'userIdentity', dats.identities, { w: 1 }); + }) + // count how many times insert completes + .count(); + +Rx.Observable.merge( + userIdentityCount, + userSavesCount +) .subscribe( function(_count) { - count = _count * 20; + count += _count * 20; }, function(err) { console.log('an error occured', err); From 6670ac1db3446b68f00c4ac8d0a977e20caf937b Mon Sep 17 00:00:00 2001 From: terakilobyte Date: Fri, 12 Jun 2015 18:55:47 -0400 Subject: [PATCH 2/6] Comment out blacklist --- flattenUser.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/flattenUser.js b/flattenUser.js index 3163349cf2..64525b143d 100644 --- a/flattenUser.js +++ b/flattenUser.js @@ -36,11 +36,14 @@ function createQuery(db, collection, options, batchSize) { // or schedule getting next batch on nextTick cursor.each(function (err, doc) { if (err) { + console.log(err); return observer.onError(err); } if (!doc) { + console.log('hit complete'); return observer.onCompleted(); } + console.log('calling onnext'); observer.onNext(doc); }); @@ -98,6 +101,7 @@ var userSavesCount = users }) .flatMap(function(dats) { // bulk insert into new collection for loopback + console.log(dats); return insertMany(dats.db, 'user', dats.users, { w: 1 }); }) // count how many times insert completes @@ -142,7 +146,7 @@ Rx.Observable.merge( count += _count * 20; }, function(err) { - console.log('an error occured', err); + console.log('an error occured', err, err.stack); }, function() { console.log('finished with %s documents processed', count); From 3969dd2c6bc5dfe436395f05b8fb0b75451cce2e Mon Sep 17 00:00:00 2001 From: terakilobyte Date: Fri, 12 Jun 2015 19:16:10 -0400 Subject: [PATCH 3/6] Take id property of username, remove wasteful save on profile lookup. --- flattenUser.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flattenUser.js b/flattenUser.js index 64525b143d..fad529cea3 100644 --- a/flattenUser.js +++ b/flattenUser.js @@ -114,7 +114,8 @@ var userIdentityCount = users .map(function(provider) { return { provider: provider, - externalId: user[provider] + externalId: user[provider], + userId: user.id }; }) .filter(function(ident) { From ef99b919517450fe375895d28e328cb9352757bf Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Sat, 13 Jun 2015 23:50:36 -0700 Subject: [PATCH 4/6] first challenge json file updated with dashedname --- challenges/advanced-bonfires.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/challenges/advanced-bonfires.json b/challenges/advanced-bonfires.json index d31921c7d8..e14504dba4 100644 --- a/challenges/advanced-bonfires.json +++ b/challenges/advanced-bonfires.json @@ -5,6 +5,7 @@ { "id": "aff0395860f5d3034dc0bfc9", "name": "Bonfire: Validate US Telephone Numbers", + "dashedName": "bonfire-validate-us-telephone-numbers", "difficulty": "4.01", "description": [ "Return true if the passed string is a valid US phone number", @@ -65,6 +66,7 @@ { "id": "a3f503de51cf954ede28891d", "name": "Bonfire: Symmetric Difference", + "dashedName": "bonfire-symmetric-difference", "difficulty": "4.02", "description": [ "Create a function that takes two or more arrays and returns an array of the symmetric difference of the provided arrays.", @@ -102,6 +104,7 @@ { "id": "aa2e6f85cab2ab736c9a9b24", "name": "Bonfire: Exact Change", + "dashedName": "bonfire-exact-change", "difficulty": "4.03", "description": [ "Design a cash register drawer function that accepts purchase price as the first argument, payment as the second argument, and cash-in-drawer (cid) as the third argument.", @@ -157,6 +160,7 @@ { "id": "a56138aff60341a09ed6c480", "name": "Bonfire: Inventory Update", + "dashedName": "bonfire-inventory-update", "difficulty": "4.04", "description": [ "Compare and update inventory stored in a 2d array against a second 2d array of a fresh delivery. Update current inventory item quantity, and if an item cannot be found, add the new item and quantity into the inventory array in alphabetical order.", @@ -211,6 +215,7 @@ { "id": "a7bf700cd123b9a54eef01d5", "name": "Bonfire: No repeats please", + "dashedName": "bonfire-no-repeats-please", "difficulty": "4.05", "description": [ "Return the number of total permutations of the provided string that don't have repeated consecutive letters.", @@ -252,6 +257,7 @@ { "id": "a19f0fbe1872186acd434d5a", "name": "Bonfire: Friendly Date Ranges", + "dashedName": "bonfire-friendly-date-ranges", "difficulty": "4.06", "description": [ "Implement a way of converting two dates into a more friendly date range that could be presented to a user.", From 9589b6abebb08afdc5d8d042684913b86abad1d5 Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Sun, 14 Jun 2015 00:55:27 -0700 Subject: [PATCH 5/6] add dashedName attributes to JSON --- challenges/basejumps.json | 6 +++ challenges/basic-bonfires.json | 40 +++++++++++++++++- challenges/basic-html5-and-css.json | 49 +++++++++++++++++++++- challenges/basic-javascript.json | 10 +++++ challenges/bootstrap.json | 18 +++++++- challenges/computer-science.json | 6 +++ challenges/full-stack-javascript.json | 11 +++++ challenges/functional-programming.json | 1 + challenges/get-set-for-free-code-camp.json | 8 ++++ challenges/intermediate-bonfires.json | 3 ++ challenges/jquery-ajax-and-json.json | 5 +++ challenges/object-oriented-javascript.json | 9 ++++ challenges/ziplines.json | 11 ++++- 13 files changed, 173 insertions(+), 4 deletions(-) diff --git a/challenges/basejumps.json b/challenges/basejumps.json index 2b07de0333..71f3f3dcf8 100644 --- a/challenges/basejumps.json +++ b/challenges/basejumps.json @@ -5,6 +5,7 @@ { "id": "bd7158d8c443eddfaeb5bcef", "name": "Waypoint: Get Set for Basejumps", + "dashedName": "waypoint-get-set-for-basejumps", "difficulty": 2.00, "challengeSeed": ["128451852"], "description": [ @@ -66,6 +67,7 @@ { "id": "bd7158d8c443eddfaeb5bdef", "name": "Basejump: Build a Voting App", + "dashedName": "basejump-build-a-voting-app", "difficulty": 2.01, "challengeSeed": ["128451852"], "description": [ @@ -101,6 +103,7 @@ { "id": "bd7158d8c443eddfaeb5bdff", "name": "Basejump: Build a Nightlife Coordination App", + "dashedName": "basejump-build-a-nightlife-coordination-app", "difficulty": 2.02, "challengeSeed": ["128451852"], "description": [ @@ -132,6 +135,7 @@ { "id": "bd7158d8c443eddfaeb5bd0e", "name": "Basejump: Chart the Stock Market", + "dashedName": "basejump-chart-the-stock-market", "difficulty": 2.03, "challengeSeed": ["128451852"], "description": [ @@ -163,6 +167,7 @@ { "id": "bd7158d8c443eddfaeb5bd0f", "name": "Basejump: Manage a Book Trading Club", + "dashedName": "basejump-manage-a-book-trading-club", "difficulty": 2.04, "challengeSeed": ["128451852"], "description": [ @@ -194,6 +199,7 @@ { "id": "bd7158d8c443eddfaeb5bdee", "name": "Basejump: Build a Pinterest Clone", + "dashedName": "basejump-build-a-pinterest-clone", "difficulty": 2.05, "challengeSeed": ["128451852"], "description": [ diff --git a/challenges/basic-bonfires.json b/challenges/basic-bonfires.json index 998d46df23..a6cf5aebf4 100644 --- a/challenges/basic-bonfires.json +++ b/challenges/basic-bonfires.json @@ -5,6 +5,7 @@ { "id": "bd7139d8c441eddfaeb5bdef", "name": "Waypoint: Pair Program on Bonfires", + "dashedName": "waypoint-pair-program-on-bonfires", "difficulty": 0.44, "challengeSeed": ["119657641"], "description": [ @@ -42,6 +43,7 @@ { "id": "ad7123c8c441eddfaeb5bdef", "name": "Bonfire: Meet Bonfire", + "dashedName": "bonfire-meet-bonfire", "difficulty": "0", "description": [ "Click the button below for further instructions.", @@ -81,6 +83,7 @@ { "id": "a202eed8fc186c8434cb6d61", "name": "Bonfire: Reverse a String", + "dashedName": "bonfire-reverse-a-string", "difficulty": "1.01", "tests": [ "expect(reverseString('hello')).to.be.a('String');", @@ -122,6 +125,7 @@ { "id": "a302f7aae1aa3152a5b413bc", "name": "Bonfire: Factorialize a Number", + "dashedName": "bonfire-factorialize-a-number", "tests": [ "expect(factorialize(5)).to.be.a(\"Number\");", "expect(factorialize(5)).to.equal(120);", @@ -161,6 +165,7 @@ { "id": "aaa48de84e1ecc7c742e1124", "name": "Bonfire: Check for Palindromes", + "dashedName": "bonfire-check-for-palindromes", "difficulty": "1.03", "description": [ "Return true if the given string is a palindrome. Otherwise, return false.", @@ -207,6 +212,7 @@ { "id": "a26cbbe9ad8655a977e1ceb5", "name": "Bonfire: Find the Longest Word in a String", + "dashedName": "bonfire-find-the-longest-word-in-a-string", "difficulty": "1.04", "description": [ "Return the length of the longest word in the provided sentence.", @@ -246,6 +252,7 @@ { "id": "ab6137d4e35944e21037b769", "name": "Bonfire: Title Case a Sentence", + "dashedName": "bonfire-title-case-a-sentence", "difficulty": "1.05", "description": [ "Return the provided string with the first letter of each word capitalized.", @@ -283,6 +290,7 @@ { "id": "a789b3483989747d63b0e427", "name": "Bonfire: Return Largest Numbers in Arrays", + "dashedName": "bonfire-return-largest-numbers-in-arrays", "difficulty": "1.06", "description": [ "Return an array consisting of the largest number from each provided sub-array. For simplicity, the provided array will contain exactly 4 sub-arrays.", @@ -321,6 +329,7 @@ { "id": "acda2fb1324d9b0fa741e6b5", "name": "Bonfire: Confirm the Ending", + "dashedName": "bonfire-confirm-the-ending", "difficulty": "1.07", "description": [ "Check if a string (first argument) ends with the given target string (second argument).", @@ -360,6 +369,7 @@ { "id": "afcc8d540bea9ea2669306b6", "name": "Bonfire: Repeat a string repeat a string", + "dashedName": "bonfire-repeat-a-string-repeat-a-string", "difficulty": "1.08", "description": [ "Repeat a given string (first argument) n times (second argument). Return an empty string if n is a negative number.", @@ -396,6 +406,7 @@ { "id": "ac6993d51946422351508a41", "name": "Bonfire: Truncate a string", + "dashedName": "bonfire-truncate-a-string", "difficulty": "1.09", "description": [ "Truncate a string (first argument) if it is longer than the given maximum string length (second argument). Return the truncated string with a '...' ending.", @@ -433,6 +444,7 @@ { "id": "a9bd25c716030ec90084d8a1", "name": "Bonfire: Chunky Monkey", + "dashedName": "bonfire-chunky-monkey", "difficulty": "1.10", "description": [ "Write a function that splits an array (first argument) into groups the length of size (second argument) and returns them as a multidimensional array.", @@ -470,6 +482,7 @@ { "id": "ab31c21b530c0dafa9e241ee", "name": "Bonfire: Slasher Flick", + "dashedName": "bonfire-slasher-flick", "difficulty": "1.11", "description": [ "Return the remaining elements of an array after chopping off n elements from the head.", @@ -507,6 +520,7 @@ { "id": "af2170cad53daa0770fabdea", "name": "Bonfire: Mutations", + "dashedName": "bonfire-mutations", "difficulty": "1.12", "description": [ "Return true if the string in the first element of the array contains all of the letters of the string in the second element of the array.", @@ -549,6 +563,7 @@ { "id": "adf08ec01beb4f99fc7a68f2", "name": "Bonfire: Falsey Bouncer", + "dashedName": "bonfire-falsey-bouncer", "difficulty": "1.50", "description": [ "Remove all falsey values from an array.", @@ -587,6 +602,7 @@ { "id": "a8e512fbe388ac2f9198f0fa", "name": "Bonfire: Where art thou", + "dashedName": "bonfire-where-art-thou", "difficulty": "1.55", "description": [ "Make a function that looks through a list (first argument) and returns an array of all objects that have equivalent property values (second argument).", @@ -625,6 +641,7 @@ { "id": "a39963a4c10bc8b4d4f06d7e", "name": "Bonfire: Seek and Destroy", + "dashedName": "bonfire-seek-and-destroy", "difficulty": "1.60", "description": [ "You will be provided with an initial array (the first argument in the destroyer function), followed by one or more arguments. Remove all elements from the initial array that are of the same value as these arguments.", @@ -661,6 +678,7 @@ { "id": "a24c1a4622e3c05097f71d67", "name": "Bonfire: Where do I belong", + "dashedName": "bonfire-where-do-i-belong", "difficulty": "1.61", "description": [ "Return the lowest index at which a value (second argument) should be inserted into a sorted array (first argument).", @@ -697,6 +715,7 @@ { "id": "a3566b1109230028080c9345", "name": "Bonfire: Sum All Numbers in a Range", + "dashedName": "bonfire-sum-all-numbers-in-a-range", "difficulty": "2.00", "description": [ "We'll pass you an array of two numbers. Return the sum of those two numbers and all numbers between them.", @@ -736,7 +755,8 @@ }, { "id": "a5de63ebea8dbee56860f4f2", - "name": "Bonfire: Diff Two Arrays", + "name": "bonfire-diff-two-arrays", + "dashedName": "Bonfire: Diff Two Arrays", "difficulty": "2.01", "description": [ "Compare two arrays and return a new array with any items not found in both of the original arrays.", @@ -782,6 +802,7 @@ { "id": "a7f4d8f2483413a6ce226cac", "name": "Bonfire: Roman Numeral Converter", + "dashedName": "bonfire-roman-numeral-converter", "tests": [ "expect(convert(12)).to.equal(\"XII\");", "expect(convert(5)).to.equal(\"V\");", @@ -822,6 +843,7 @@ { "id": "a0b5010f579e69b815e7c5d6", "name": "Bonfire: Search and Replace", + "dashedName": "bonfire-search-and-replace", "tests": [ "expect(replace(\"Let us go to the store\", \"store\", \"mall\")).to.equal(\"Let us go to the mall\");", "expect(replace(\"He is Sleeping on the couch\", \"Sleeping\", \"sitting\")).to.equal(\"He is Sitting on the couch\");", @@ -865,6 +887,7 @@ { "id": "aa7697ea2477d1316795783b", "name": "Bonfire: Pig Latin", + "dashedName": "bonfire-pig-latin", "tests": [ "expect(translate(\"california\")).to.equal(\"aliforniacay\");", "expect(translate(\"paragraphs\")).to.equal(\"aragraphspay\");", @@ -908,6 +931,7 @@ { "id": "afd15382cdfb22c9efe8b7de", "name": "Bonfire: DNA Pairing", + "dashedName": "bonfire-dna-pairing", "tests": [ "assert.deepEqual(pair(\"ATCGA\"),[['A','T'],['T','A'],['C','G'],['G','C'],['A','T']], 'should return the dna pair');", "assert.deepEqual(pair(\"TTGAG\"),[['T','A'],['T','A'],['G','C'],['A','T'],['G','C']], 'should return the dna pair');", @@ -946,6 +970,7 @@ { "id": "af7588ade1100bde429baf20", "name": "Bonfire: Missing letters", + "dashedName": "bonfire-missing-letters", "difficulty": "2.05", "description": [ "Find the missing letter in the passed letter range and return it.", @@ -983,6 +1008,7 @@ { "id": "a77dbc43c33f39daa4429b4f", "name": "Bonfire: Boo who", + "dashedName": "bonfire-boo-who", "difficulty": "2.06", "description": [ "Check if a value is classified as a boolean primitive. Return true or false.", @@ -1025,6 +1051,7 @@ { "id": "a105e963526e7de52b219be9", "name": "Bonfire: Sorted Union", + "dashedName": "bonfire-sorted-union", "difficulty": "2.07", "description": [ "Write a function that takes two or more arrays and returns a new array of unique values in the order of the original provided arrays.", @@ -1062,6 +1089,7 @@ { "id": "a6b0bb188d873cb2c8729495", "name": "Bonfire: Convert HTML Entities", + "dashedName": "bonfire-convert-html-entities", "difficulty": "2.07", "description": [ "Convert the characters \"&\", \"<\", \">\", '\"', and \"'\", in a string to their corresponding HTML entities.", @@ -1097,6 +1125,7 @@ { "id": "a103376db3ba46b2d50db289", "name": "Bonfire: Spinal Tap Case", + "dashedName": "bonfire-spinal-tap-case", "difficulty": "2.08", "description": [ "Convert a string to spinal case. Spinal case is all-lowercase-words-joined-by-dashes.", @@ -1136,6 +1165,7 @@ { "id": "a5229172f011153519423690", "name": "Bonfire: Sum All Odd Fibonacci Numbers", + "dashedName": "bonfire-sum-all-odd-fibonacci-numbers", "difficulty": "2.09", "description": [ "Return the sum of all odd Fibonacci numbers up to and including the passed number if it is a Fibonacci number.", @@ -1176,6 +1206,7 @@ { "id": "a3bfc1673c0526e06d3ac698", "name": "Bonfire: Sum All Primes", + "dashedName": "bonfire-sum-all-primes", "difficulty": "2.10", "description": [ "Sum all the prime numbers up to and including the provided number.", @@ -1214,6 +1245,7 @@ { "id": "ae9defd7acaf69703ab432ea", "name": "Bonfire: Smallest Common Multiple", + "dashedName": "bonfire-smallest-common-multiple", "difficulty": "2.11", "description": [ "Find the smallest number that is evenly divisible by all numbers in the provided range.", @@ -1252,6 +1284,7 @@ { "id": "a6e40f1041b06c996f7b2406", "name": "Bonfire: Finders Keepers", + "dashedName": "bonfire-finders-keepers", "difficulty": "2.12", "description": [ "Create a function that looks through an array (first argument) and returns the first element in the array that passes a truth test (second argument).", @@ -1287,6 +1320,7 @@ { "id": "a5deed1811a43193f9f1c841", "name": "Bonfire: Drop it", + "dashedName": "bonfire-drop-it", "difficulty": "2.13", "description": [ "Drop the elements of an array (first argument), starting from the front, until the predicate (second argument) returns true.", @@ -1324,6 +1358,7 @@ { "id": "ab306dbdcc907c7ddfc30830", "name": "Bonfire: Steamroller", + "dashedName": "bonfire-steamroller", "difficulty": "2.14", "description": [ "Flatten a nested array. You must account for varying levels of nesting.", @@ -1360,6 +1395,7 @@ { "id": "a8d97bd4c764e91f9d2bda01", "name": "Bonfire: Binary Agents", + "dashedName": "bonfire-binary-agents", "difficulty": "2.15", "description": [ "Return an English translated sentence of the passed binary string.", @@ -1396,6 +1432,7 @@ { "id": "a10d2431ad0c6a099a4b8b52", "name": "Bonfire: Everything Be True", + "dashedName": "bonfire-everything-be-true", "difficulty": "2.21", "description": [ "Check if the predicate (second argument) returns truthy (defined) for all elements of a collection (first argument).", @@ -1434,6 +1471,7 @@ { "id": "a97fd23d9b809dac9921074f", "name": "Bonfire: Arguments Optional", + "dashedName": "bonfire-arguments-optional", "difficulty": "2.22", "description": [ "Create a function that sums two arguments together. If only one argument is provided, return a function that expects one additional argument and will return the sum.", diff --git a/challenges/basic-html5-and-css.json b/challenges/basic-html5-and-css.json index 6b8ef98def..3e0532d81a 100644 --- a/challenges/basic-html5-and-css.json +++ b/challenges/basic-html5-and-css.json @@ -5,6 +5,7 @@ { "id": "bd7123c8c441eddfaeb5bdef", "name": "Waypoint: Say Hello to HTML Elements", + "dashedName": "waypoint-say-hello-to-html-elements", "difficulty": 0.0085, "description": [ "Welcome to Free Code Camp's first coding challenge! Click on the button below for further instructions.", @@ -44,6 +45,7 @@ { "id": "bad87fee1348bd9aedf0887a", "name": "Waypoint: Headline with the h2 Element", + "dashedName": "waypoint-headline-with-the-h2-element", "difficulty": 0.010, "description": [ "Add an h2 tag that says \"CatPhotoApp\" to create a second HTML element below your \"Hello World\" h1 element.", @@ -80,6 +82,7 @@ { "id": "bad87fee1348bd9aedf08801", "name": "Waypoint: Inform with the Paragraph Element", + "dashedName": "waypoint-inform-with-the-paragraph-element", "difficulty": 0.011, "description": [ "Create a p element below your h2 element, and give it the text \"Hello Paragraph\".", @@ -114,6 +117,7 @@ { "id": "bad87fee1348bd9aeaf08801", "name": "Waypoint: Visually Separate Elements with Line Breaks", + "dashedName": "waypoint-visually-separate-elements-with-line-breaks", "difficulty": 0.012, "description": [ "Add a br element to your page, preferably between two of your elements.", @@ -149,6 +153,7 @@ { "id": "bad87fee1348bd9aedf08802", "name": "Waypoint: Uncomment HTML", + "dashedName": "waypoint-uncomment-html", "difficulty": 0.013, "description": [ "Uncomment your h1, h2 and p elements.", @@ -193,6 +198,7 @@ { "id": "bad87fee1348bd9aedf08804", "name": "Waypoint: Comment out HTML", + "dashedName": "waypoint-comment-out-html", "difficulty": 0.014, "description": [ "Comment out your h1 element and your p element, but leave your h2 element uncommented.", @@ -235,6 +241,7 @@ { "id": "bad87fee1348bd9aedf08833", "name": "Waypoint: Fill in the Blank with Placeholder Text", + "dashedName": "waypoint-fill-in-the-blank-with-placeholder-text", "difficulty": 0.015, "description": [ "Replace the text inside your p element with the first few words of the provided \"Kitty Ipsum\" text.", @@ -276,6 +283,7 @@ { "id": "bad87fed1348bd9aedf08833", "name": "Waypoint: Delete HTML Elements", + "dashedName": "waypoint-delete-html-elements", "difficulty": 0.016, "description": [ "Delete your h1 and br elements so we can simplify our view.", @@ -316,6 +324,7 @@ { "id": "bad87fee1348bd9aedf08803", "name": "Waypoint: Change the Color of Text", + "dashedName": "waypoint-change-the-color-of-text", "difficulty": 0.017, "description": [ "Change your h2 element's style so that its text color is red.", @@ -351,6 +360,7 @@ { "id": "bad87fee1348bd9aedf08805", "name": "Waypoint: Use CSS Selectors to Style Elements", + "dashedName": "waypoint-use-css-selectors-to-style-elements", "difficulty": 0.018, "description": [ "Delete your h2 element's style attribute and instead create a CSS style element. Add the necessary CSS to turn all h2 elements blue.", @@ -395,6 +405,7 @@ { "id": "bad87fee1348bd9aecf08806", "name": "Waypoint: Use a CSS Class to Style an Element", + "dashedName": "waypoint-use-a-css-class-to-style-an-element", "difficulty": 0.019, "description": [ "Create a CSS class called \"red-text\" and apply it to your h2 element.", @@ -436,6 +447,7 @@ { "id": "bad87fee1348bd9aefe08806", "name": "Waypoint: Style Multiple Elements with a CSS Class", + "dashedName": "waypoint-style-multiple-elements-with-a-css-class", "difficulty": 0.020, "description": [ "Apply the \"red-text\" class to your h2 and p elements.", @@ -474,6 +486,7 @@ { "id": "bad87fee1348bd9aedf08806", "name": "Waypoint: Change the Font Size of an Element", + "dashedName": "waypoint-change-the-font-size-of-an-element", "difficulty": 0.021, "description": [ "Create a second p element. Then, inside your <style> element, set the \"font-size\" of all p elements to 16 pixels.", @@ -513,6 +526,7 @@ { "id": "bad87fee1348bd9aede08807", "name": "Waypoint: Set the Font Family of an Element", + "dashedName": "waypoint-set-the-font-family-of-an-element", "difficulty": 0.022, "description": [ "Make all of your p elements use the \"Monospace\" font.", @@ -553,6 +567,7 @@ { "id": "bad87fee1348bd9aedf08807", "name": "Waypoint: Import a Google Font", + "dashedName": "waypoint-import-a-google-font", "difficulty": 0.023, "description": [ "Apply the font-family of \"Lobster\" to your h2 element.", @@ -598,6 +613,7 @@ { "id": "bad87fee1348bd9aedf08808", "name": "Waypoint: Specify How Fonts Should Degrade", + "dashedName": "waypoint-specify-how-fonts-should-degrade", "difficulty": 0.024, "description": [ "Make all your h2 elements use \"Lobster\" as their font family, but degrade to the \"Monospace\" font when the \"Lobster\" font isn't available.", @@ -647,6 +663,7 @@ { "id": "bad87fee1348bd9aedf08809", "name": "Waypoint: Override Styles with Important", + "dashedName": "waypoint-override-styles-with-important", "difficulty": 0.025, "description": [ "Create an \"urgently-red\" class that gives an element the font-color of red, but add !important to the class to ensure the element is rendered as being red. Immediately below your \"urgently-red\" class declaration, create a \"blue-text\" class that gives an element the font-color of blue. Apply both classes to your h2 element.", @@ -703,6 +720,7 @@ { "id": "bad87fee1348bd9aedf08812", "name": "Waypoint: Add Images to your Website", + "dashedName": "waypoint-add-images-to-your-website", "difficulty": 0.026, "description": [ "Use an img element to add the image http://bit.ly/fcc-kittens to your website.", @@ -751,6 +769,7 @@ { "id": "bad87fee1348bd9acdf08812", "name": "Waypoint: Size your Images", + "dashedName": "waypoint-size-your-images", "difficulty": 0.027, "description": [ "Create a class called smaller-image and use it to resize the image so that it's only 100 pixels wide.", @@ -800,6 +819,7 @@ { "id": "bad87fee1348bd9bedf08813", "name": "Waypoint: Add Borders Around your Elements", + "dashedName": "waypoint-add-borders-around-your-elements", "difficulty": 0.028, "description": [ "Create a class called \"thick-green-border\" that puts a 10-pixel-wide green border with a style of \"solid\" around an HTML element, and apply that class to your cat photo.", @@ -856,6 +876,7 @@ { "id": "bad87fee1348bd9aedf08814", "name": "Waypoint: Add Rounded Corners with a Border Radius", + "dashedName": "waypoint-add-rounded-corners-with-a-border-radius", "difficulty": 0.029, "description": [ "Give your cat photo a border-radius of 10 pixels.", @@ -915,6 +936,7 @@ { "id": "bad87fee1348bd9aedf08815", "name": "Waypoint: Make Circular Images with a Border Radius", + "dashedName": "waypoint-make-circular-images-with-a-border-radius", "difficulty": 0.030, "description": [ "Give your cat photo a border-radius of 50%.", @@ -973,6 +995,7 @@ { "id": "bad87fee1348bd9aedf08816", "name": "Waypoint: Link to External Pages with Anchor Elements", + "dashedName": "waypoint-link-to-external-pages-with-anchor-elements", "difficulty": 0.031, "description": [ "Create an a element, or \"anchor element\", that links to http://catphotoapp.com and has \"cat photos\" as its link text, or \"anchor text\".", @@ -1035,6 +1058,7 @@ { "id": "bad87fee1348bd9aede08817", "name": "Waypoint: Wrap an Anchor Element within a Paragraph", + "dashedName": "waypoint-wrap-an-anchor-element-within-a-paragraph", "difficulty": 0.032, "description": [ "Now wrap your a element within a new p element so that the surrounding paragraph says \"click here for cat photos\", but where only \"cat photos\" is a link - the rest is plain text.", @@ -1103,6 +1127,7 @@ { "id": "bad87fee1348bd9aedf08817", "name": "Waypoint: Make Dead Links using the Hash Symbol", + "dashedName": "waypoint-make-dead-links-using-the-hash-symbol", "difficulty": 0.033, "description": [ "Use the hash symbol (#) to turn your a element's link into a dead link.", @@ -1165,6 +1190,7 @@ { "id": "bad87fee1348bd9aedf08820", "name": "Waypoint: Turn an Image into a Link", + "dashedName": "waypoint-turn-an-image-into-a-link", "difficulty": 0.034, "description": [ "Wrap your img element inside an a element with a dead link.", @@ -1230,6 +1256,7 @@ { "id": "bad87fee1348bd9aedf08818", "name": "Waypoint: Add Alt Text to an Image for Accessibility", + "dashedName": "waypoint-add-alt-text-to-an-image-for-accessibility", "difficulty": 0.035, "description": [ "Add an alt attribute with the text \"A cute orange cat lying on its back\" to our cat photo.", @@ -1293,6 +1320,7 @@ { "id": "bad87fee1348bd9aedf08827", "name": "Waypoint: Create a Bulleted Unordered List", + "dashedName": "waypoint-create-a-bulleted-unordered-list", "difficulty": 0.036, "description": [ "Replace your p elements with an unordered list of three things that cats love.", @@ -1358,6 +1386,7 @@ { "id": "bad87fee1348bd9aedf08828", "name": "Waypoint: Create an Ordered List", + "dashedName": "waypoint-create-an-ordered-list", "difficulty": 0.037, "description": [ "Create an ordered list of the top 3 things cats hate the most.", @@ -1430,6 +1459,7 @@ { "id": "bad87fee1348bd9aedf08829", "name": "Waypoint: Create a Text Field", + "dashedName": "waypoint-create-a-text-field", "difficulty": 0.038, "description": [ "Now we'll create a web form. Create a text input under your lists.", @@ -1501,6 +1531,7 @@ { "id": "bad87fee1348bd9aedf08830", "name": "Waypoint: Add Placeholder Text to a Text Field", + "dashedName": "waypoint-add-placeholder-text-to-a-text-field", "difficulty": 0.039, "description": [ "Set the placeholder value of your text input to \"cat photo URL\".", @@ -1574,6 +1605,7 @@ { "id": "bad87fee1348bd9aede08830", "name": "Waypoint: Create a Form Element", + "dashedName": "waypoint-create-a-form-element", "difficulty": 0.040, "description": [ "Wrap your text field in a form element. Add the action=\"/submit-cat-photo\" attribute to this form element.", @@ -1649,6 +1681,7 @@ { "id": "bad87fee1348bd9aedd08830", "name": "Waypoint: Add a Submit Button to a Form", + "dashedName": "waypoint-add-a-submit-button-to-a-form", "difficulty": 0.041, "description": [ "Add a submit button to your form element with type \"submit\" and \"Submit\" as its text.", @@ -1725,7 +1758,8 @@ }, { "id": "bad87fee1348bd9aedc08830", - "name": "Waypoint: Use HTML5 to Require a Field", + "name": "waypoint-use-html5-to-require-a-field", + "dashedName": "Waypoint: Use HTML5 to Require a Field", "difficulty": 0.042, "description": [ "Make your text input a \"required\" field, so that your user can't submit the form without completing this field.", @@ -1801,6 +1835,7 @@ { "id": "bad87fee1348bd9aedf08834", "name": "Waypoint: Create a Set of Radio Buttons", + "dashedName": "waypoint-create-a-set-of-radio-buttons", "difficulty": 0.043, "description": [ "Add to your form a pair of radio buttons. Each radio button should be wrapped within its own label element. They should share a common name attribute. One should have the option of \"indoor\" and the other should have the option of \"outdoor\".", @@ -1884,6 +1919,7 @@ { "id": "bad87fee1348bd9aedf08835", "name": "Waypoint: Create a Set of Checkboxes", + "dashedName": "waypoint-create-a-set-of-checkboxes", "difficulty": 0.044, "description": [ "Add to your form a set of three checkbox elements. Each checkbox should be wrapped within its own label element. All three should share the name attribute of \"personality\".", @@ -1964,6 +2000,7 @@ { "id": "bad87fee1348bd9aede18835", "name": "Waypoint: Clean up your form using Linebreaks", + "dashedName": "waypoint-clean-up-your-form-using-linebreaks", "difficulty": 0.045, "description": [ "Clean up your form by adding linebreaks between form elements.", @@ -2043,6 +2080,7 @@ { "id": "bad87fee1348bd9aedd08835", "name": "Waypoint: Check Radio Buttons and Checkboxes by Default", + "dashedName": "waypoint-check-radio-buttons-and-checkboxes-by-default", "difficulty": 0.046, "description": [ "Set the first of your radio buttons and the first of your checkboxes to both be checked by default.", @@ -2126,6 +2164,7 @@ { "id": "bad87fee1348bd9aede08835", "name": "Waypoint: Wrap Many Elements within a Single Div Element", + "dashedName": "waypoint-wrap-many-elements-within-a-single-div-element", "difficulty": 0.047, "description": [ "Wrap your \"Things cats love\" and \"Things cats hate\" lists all within a single div element.", @@ -2214,6 +2253,7 @@ { "id": "bad87fee1348bd9aede07836", "name": "Waypoint: Give a Background Color to a Div Element", + "dashedName": "waypoint-give-a-background-color-to-a-div-element", "difficulty": 0.048, "description": [ "Create a class called \"gray-background\" with the background color of gray. Assign this class to your div element.", @@ -2300,6 +2340,7 @@ { "id": "bad88fee1348bd9aedf08825", "name": "Waypoint: Adjusting the Padding of an Element", + "dashedName": "waypoint-adjusting-the-padding-of-an-element", "difficulty": 0.064, "description": [ "These next few Waypoints will give you a brief tour of three important aspects of the space surrounding HTML elements: padding, margin, and border. Change the padding of your green box to match that of your red box.", @@ -2361,6 +2402,7 @@ { "id": "bad87fee1348bd9aedf08822", "name": "Waypoint: Adjust the Margin of an Element", + "dashedName": "waypoint-adjust-the-margin-of-an-element", "difficulty": 0.065, "description": [ "Change the margin of the green box to match that of the red box.", @@ -2424,6 +2466,7 @@ { "id": "bad87fee1348bd9aedf08823", "name": "Waypoint: Add a Negative Margin to an Element", + "dashedName": "waypoint-add-a-negative-margin-to-an-element", "difficulty": 0.066, "description": [ "Change the margin of the green box to a negative value, so it fills the entire horizontal width of the yellow box around it.", @@ -2486,6 +2529,7 @@ { "id": "bad87fee1348bd9aedf08824", "name": "Waypoint: Add Different Padding to Each Side of an Element", + "dashedName": "waypoint-add-different-padding-to-each-side-of-an-element", "difficulty": 0.067, "description": [ "Give the green box a padding of 40 pixels on its top and left side, but only 20 pixels on its bottom and right side.", @@ -2551,6 +2595,7 @@ { "id": "bad87fee1248bd9aedf08824", "name": "Waypoint: Add Different Margins to Each Side of an Element", + "dashedName": "waypoint-add-different-margins-to-each-side-of-an-element", "difficulty": 0.068, "description": [ "Give the green box a margin of 40 pixels on its top and left side, but only 20 pixels on its bottom and right side.", @@ -2616,6 +2661,7 @@ { "id": "bad87fee1348bd9aedf08826", "name": "Waypoint: Use Clockwise Notation to Specify the Padding of an Element", + "dashedName": "waypoint-use-clockwise-notation-to-specify-the-padding-of-an-element", "difficulty": 0.069, "description": [ "Use Clockwise Notation to give the \".green-box\" class a padding of 40 pixels on its top and left side, but only 20 pixels on its bottom and right side.", @@ -2678,6 +2724,7 @@ { "id": "bad87fee1348bd9aedf08726", "name": "Waypoint: Use Clockwise Notation to Specify the Margin of an Element", + "dashedName": "waypoint-use-clockwise-notation-to-specify-the-margin-of-an-element", "difficulty": 0.070, "description": [ "Let's try this again, but with margin this time. Use Clockwise Notation to give an element a margin of 40 pixels on its top and left side, but only 20 pixels on its bottom and right side.", diff --git a/challenges/basic-javascript.json b/challenges/basic-javascript.json index 2de8349186..e7fe614659 100644 --- a/challenges/basic-javascript.json +++ b/challenges/basic-javascript.json @@ -5,6 +5,7 @@ { "id": "bd7129d8c441eddfaeb5bdef", "name": "Waypoint: Build an Adventure Game", + "dashedName": "waypoint-build-an-adventure-game", "difficulty": 0.24, "challengeSeed": ["114604814"], "description": [ @@ -30,6 +31,7 @@ { "id": "bd7130d8c441eddfaeb5bdef", "name": "Waypoint: Build Rock Paper Scissors", + "dashedName": "waypoint-build-rock-paper-scissors", "difficulty": 0.25, "challengeSeed": ["114604815"], "description": [ @@ -53,6 +55,7 @@ { "id": "bd7131d8c441eddfaeb5bdef", "name": "Waypoint: Learn JavaScript For Loops", + "dashedName": "waypoint-learn-javascript-for-loops", "difficulty": 0.26, "challengeSeed": ["114614220"], "description": [ @@ -76,6 +79,7 @@ { "id": "bd7132d8c441eddfaeb5bdef", "name": "Waypoint: Learn JavaScript While Loops", + "dashedName": "waypoint-learn-javascript-while-loops", "difficulty": 0.27, "challengeSeed": ["114612889"], "description": [ @@ -98,6 +102,7 @@ { "id": "bd7133d8c441eddfaeb5bdef", "name": "Waypoint: Learn Control Flow", + "dashedName": "waypoint-learn-control-flow", "difficulty": 0.28, "challengeSeed": ["114612888"], "description": [ @@ -122,6 +127,7 @@ { "id": "bd7134d8c441eddfaeb5bdef", "name": "Waypoint: Build a Contact List", + "dashedName": "waypoint-build-a-contact-list", "difficulty": 0.29, "challengeSeed": ["114612887"], "description": [ @@ -145,6 +151,7 @@ { "id": "bd7135d8c441eddfaeb5bdef", "name": "Waypoint: Build an Address Book", + "dashedName": "waypoint-build-an-address-book", "difficulty": 0.30, "challengeSeed": ["114612885"], "description": [ @@ -168,6 +175,7 @@ { "id": "bd7136d8c441eddfaeb5bdef", "name": "Waypoint: Build a Cash Register", + "dashedName": "waypoint-build-a-cash-register", "difficulty": 0.31, "challengeSeed": ["114612882"], "description": [ @@ -191,6 +199,7 @@ { "id": "bd7118d8c441eddfaeb5bdef", "name": "Waypoint: Discover Chrome DevTools", + "dashedName": "waypoint-discover-chrome-devTools", "difficulty": 0.32, "challengeSeed": ["110752743"], "description": [ @@ -222,6 +231,7 @@ { "id": "bd7138d8c441eddfaeb5bdef", "name": "Waypoint: Learn Regular Expressions", + "dashedName": "waypoint-learn-regular-expressions", "difficulty": 0.33, "challengeSeed": ["112547802"], "description": [ diff --git a/challenges/bootstrap.json b/challenges/bootstrap.json index 0f6b940b2f..eeac669f73 100644 --- a/challenges/bootstrap.json +++ b/challenges/bootstrap.json @@ -5,6 +5,7 @@ { "id": "bad87fee1348bd9acde08812", "name": "Waypoint: Mobile Responsive Images", + "dashedName": "waypoint-mobile-responsive-images", "difficulty": 0.047, "description": [ "Now let's go back to our Cat Photo App. This time, we'll style it using the popular Twitter Bootstrap responsive CSS framework. First, add a new image with the src attribute of \"http://bit.ly/fcc-kittens2\", and add the \"img-responsive\" Bootstrap class to that image.", @@ -91,6 +92,7 @@ { "id": "bad87fee1348bd8acde08812", "name": "Waypoint: Center Text with Bootstrap", + "dashedName": "waypoint-center-text-with-bootstrap", "difficulty": 0.048, "description": [ "Add Bootstrap's \"text-center\" class to your h2 element.", @@ -174,6 +176,7 @@ { "id": "bad87fee1348cd8acdf08812", "name": "Waypoint: Create a Bootstrap Button", + "dashedName": "waypoint-create-a-bootstrap-button", "difficulty": 0.049, "description": [ "Create a new button element below your large kitten photo. Give it the class \"btn\" and the text of \"like this photo\".", @@ -258,6 +261,7 @@ { "id": "bad87fee1348cd8acef08812", "name": "Waypoint: Create a Block Element Bootstrap Button", + "dashedName": "waypoint-create-a-block-element-bootstrap-button", "difficulty": 0.050, "description": [ "Add Bootstrap's \"btn-block\" class to your Bootstrap button.", @@ -346,6 +350,7 @@ { "id": "bad87fee1348cd8acef08811", "name": "Waypoint: Taste the Bootstrap Button Color Rainbow", + "dashedName": "waypoint-taste-the-bootstrap-button-color-rainbow", "difficulty": 0.051, "description": [ "Add Bootstrap's \"btn-primary\" class to your button.", @@ -432,6 +437,7 @@ { "id": "bad87fee1348cd8acef08813", "name": "Waypoint: Call out Optional Actions with Button Info", + "dashedName": "waypoint-call-out-optional-actions-with-button-info", "difficulty": 0.052, "description": [ "Create a new block-level Bootstrap button below your \"Like\" button with the text \"Info\", and add Bootstrap's \"btn-info\" and \"btn-block\" classes to it.", @@ -519,6 +525,7 @@ { "id": "bad87fee1348ce8acef08814", "name": "Waypoint: Warn your Users of a Dangerous Action", + "dashedName": "waypoint-warn-your-users-of-a-dangerous-action", "difficulty": 0.053, "description": [ "Create a button with the text \"Delete\" and give it the class \"btn-danger\".", @@ -607,6 +614,7 @@ { "id": "bad88fee1348ce8acef08815", "name": "Waypoint: Use the Bootstrap Grid to Put Elements Side By Side", + "dashedName": "waypoint-use-the-bootstrap-grid-to-put-elements-side-by-side", "difficulty": 0.054, "description": [ "Put the \"Like\", \"Info\" and \"Delete\" buttons side-by-side by wrapping all three of them within one <div class=\"row\"> element, then each of them within a <div class=\"col-xs-4\"> element.", @@ -700,6 +708,7 @@ { "id": "bad87fee1348bd9aedf08845", "name": "Waypoint: Ditch Custom CSS for Bootstrap", + "dashedName": "waypoint-ditch-custom-css-for-bootstrap", "difficulty": 0.055, "description": [ "Delete the \".red-text\", \"p\", and \".smaller-image\" CSS declarations from your style element so that the only declarations left in your style element are \"h2\" and \"thick-green-border\". Then Delete the p element that contains a dead link. Then remove the \"red-text\" class from your h2 element and replace it with the \"text-primary\" Bootstrap class. Finally, remove the \"smaller-image\" class from your first img element and replace it with the img-responsive class.", @@ -799,6 +808,7 @@ { "id": "bad87fee1348bd9aede08845", "name": "Waypoint: Create a Custom Heading", + "dashedName": "waypoint-create-a-custom-heading", "difficulty": 0.056, "description": [ "Wrap your first image and your h2 element within a single <div class='row'> element. Wrap your h2 text within a <div class='col-xs-8'> and your image in a <div class='col-xs-4'> so that they are on the same line.", @@ -888,6 +898,7 @@ { "id": "bad87fee1348bd9aedd08845", "name": "Waypoint: Add Font Awesome Icons to our Buttons", + "dashedName": "waypoint-add-font-awesome-icons-to-our-buttons", "difficulty": 0.057, "description": [ "Use Font Awesome to add a \"thumbs-up\" icon to your like button by giving it a i element with the classes \"fa\" and \"fa-thumbs-up\".", @@ -974,7 +985,8 @@ }, { "id": "bad87fee1348bd9aedc08845", - "name": "Waypoint: Add Font Awesome Icons all of our Buttons", + "name": "Waypoint: Add Font Awesome Icons to all of our Buttons", + "dashedName": "waypoint-add-font-awesome-icons-to-all-of-our-Buttons", "difficulty": 0.058, "description": [ "Use Font Awesome to add a \"info-circle\" icon to your info button and a \"trash\" icon to your delete button.", @@ -1062,6 +1074,7 @@ { "id": "bad87fee1348bd9aedb08845", "name": "Waypoint: Responsively Style Radio Buttons", + "dashedName": "waypoint-responsively-style-radio-buttons", "difficulty": 0.059, "description": [ "Wrap all of your radio buttons within a <div class='row'> element. Then wrap each of them within a <div class='col-xs-6'> element.", @@ -1148,6 +1161,7 @@ { "id": "bad87fee1348bd9aeda08845", "name": "Waypoint: Responsively Style Checkboxes", + "dashedName": "waypoint-responsively-style-checkboxes", "difficulty": 0.060, "description": [ "Wrap all your checkboxes in a <div class='row'> element. Then wrap each of them in a <div class='col-xs-4'> element.", @@ -1241,6 +1255,7 @@ { "id": "bad87fee1348bd9aed908845", "name": "Waypoint: Style Text Inputs as Form Controls", + "dashedName": "waypoint-style-text-inputs-as-form-controls", "difficulty": 0.061, "description": [ "Give your form's text input field a class of \"form-control\". Give your form's submit button the classes \"btn btn-primary\". Also give this button the Font Awesome icon of \"fa-paper-plane\".", @@ -1344,6 +1359,7 @@ { "id": "bad87fee1348bd9aec908845", "name": "Waypoint: Line up Form Elements Responsively with Bootstrap", + "dashedName": "waypoint-line-up-form-elements-responsively-with-bootstrap", "difficulty": 0.062, "description": [ "Now let's get your form input and your submission button on the same line. We'll do this the same way we have previously: by using a div element with the class \"row\", and other div elements within it using the \"col-xs-*\" class.", diff --git a/challenges/computer-science.json b/challenges/computer-science.json index 25d4565ebd..7f2a11b91d 100644 --- a/challenges/computer-science.json +++ b/challenges/computer-science.json @@ -5,6 +5,7 @@ { "id": "bd7123d8c441eddfaeb5bdef", "name": "Waypoint: Learn Basic Computer Science", + "dashedName": "waypoint-learn-basic-computer-science", "difficulty": 0.90, "challengeSeed": ["114628241"], "description": [ @@ -34,6 +35,7 @@ { "id": "bd8124d8c441eddfaeb5bdef", "name": "Waypoint: Learn Loops", + "dashedName": "waypoint-learn-loops", "difficulty": 0.19, "challengeSeed": ["114597348"], "description": [ @@ -61,6 +63,7 @@ { "id": "bd8125d8c441eddfaeb5bdef", "name": "Waypoint: Learn Computer Hardware", + "dashedName": "waypoint-learn-computer-hardware", "difficulty": 0.20, "challengeSeed": ["114597347"], "description": [ @@ -88,6 +91,7 @@ { "id": "bd8126d8c441eddfaeb5bdef", "name": "Waypoint: Learn Computer Networking", + "dashedName": "waypoint-learn-computer-networking", "difficulty": 0.21, "challengeSeed": ["114604811"], "description": [ @@ -115,6 +119,7 @@ { "id": "bd8127d8c441eddfaeb5bdef", "name": "Waypoint: Learn Boolean Logic", + "dashedName": "waypoint-learn-boolean-logic", "difficulty": 0.22, "challengeSeed": ["114604812"], "description": [ @@ -142,6 +147,7 @@ { "id": "bd8128d8c441eddfaeb5bdef", "name": "Waypoint: Learn Computer Security", + "dashedName": "waypoint-learn-computer-security", "difficulty": 0.23, "challengeSeed": ["114604813"], "description": [ diff --git a/challenges/full-stack-javascript.json b/challenges/full-stack-javascript.json index 4a91042a8c..cbc08ba740 100644 --- a/challenges/full-stack-javascript.json +++ b/challenges/full-stack-javascript.json @@ -5,6 +5,7 @@ { "id": "bd7154d8c441eddfaeb5bdef", "name": "Waypoint: Get Started with Angular.js", + "dashedName": "waypoint-get-started-with-angularjs", "difficulty": 0.34, "challengeSeed": ["114684726"], "description": [ @@ -28,6 +29,7 @@ { "id": "bd7155d8c441eddfaeb5bdef", "name": "Waypoint: Apply Angular.js Directives", + "dashedName": "waypoint-apply-angularjs-directives", "difficulty": 0.35, "challengeSeed": ["114684727"], "description": [ @@ -51,6 +53,7 @@ { "id": "bd7156d8c441eddfaeb5bdef", "name": "Waypoint: Power Forms with Angular.js", + "dashedName": "waypoint-power-forms-with-angularjs", "difficulty": 0.36, "challengeSeed": ["114684729"], "description": [ @@ -74,6 +77,7 @@ { "id": "bd7157d8c441eddfaeb5bdef", "name": "Waypoint: Customize Angular.js Directives", + "dashedName": "waypoint-customize-angularjs-directives", "difficulty": 0.37, "challengeSeed": ["114685062"], "description": [ @@ -96,6 +100,7 @@ { "id": "bd7158d8c441eddfaeb5bdef", "name": "Waypoint: Create Angular.js Services", + "dashedName": "waypoint-create-angularjs-services", "difficulty": 0.38, "challengeSeed": ["114685060"], "description": [ @@ -119,6 +124,7 @@ { "id": "bd7153d8c441eddfaeb5bd0f", "name": "Waypoint: Manage Packages with NPM", + "dashedName": "waypoint-manage-packages-with-npm", "difficulty": 0.39, "challengeSeed": ["126433450"], "description": [ @@ -172,6 +178,7 @@ { "id": "bd7153d8c441eddfaeb5bdff", "name": "Waypoint: Start a Node.js Server", + "dashedName": "waypoint-start-a-nodejs-server", "difficulty": 0.40, "challengeSeed": ["126411561"], "description": [ @@ -214,6 +221,7 @@ { "id": "bd7153d8c441eddfaeb5bdfe", "name": "Waypoint: Continue working with Node.js Servers", + "dashedName": "waypoint-continue-working-with-nodejs-servers", "difficulty": 0.41, "challengeSeed": ["128836506"], "description": [ @@ -241,6 +249,7 @@ { "id": "bd7153d8c441eddfaeb5bdfd", "name": "Waypoint: Finish working with Node.js Servers", + "dashedName": "waypoint-finish-working-with-nodejs-servers", "difficulty": 0.42, "challengeSeed": ["128836507"], "description": [ @@ -268,6 +277,7 @@ { "id": "bd7153d8c441eddfaeb5bd1f", "name": "Waypoint: Build Web Apps with Express.js", + "dashedName": "waypoint-build-web-apps-with-expressjs", "difficulty": 0.43, "challengeSeed": ["126411559"], "description": [ @@ -309,6 +319,7 @@ { "id": "bd7140d8c441eddfaeb5bdef", "name": "Waypoint: Manage Source Code with Git", + "dashedName": "waypoint-manage-source-code-with-git", "difficulty": 0.44, "challengeSeed": ["114635309"], "description": [ diff --git a/challenges/functional-programming.json b/challenges/functional-programming.json index 868b626372..a7a60efdf9 100644 --- a/challenges/functional-programming.json +++ b/challenges/functional-programming.json @@ -5,6 +5,7 @@ { "id": "bd7129d8c441eddfbeb5bddf", "name": "Waypoint: Practice Functional Programming", + "dashedName": "waypoint-practice-functional-programming", "difficulty": 0.01, "challengeSeed": ["129169463"], "description": [ diff --git a/challenges/get-set-for-free-code-camp.json b/challenges/get-set-for-free-code-camp.json index 68d5c12e71..3a9d366102 100644 --- a/challenges/get-set-for-free-code-camp.json +++ b/challenges/get-set-for-free-code-camp.json @@ -5,6 +5,7 @@ { "id": "bd7124d8c441eddfaeb5bdef", "name": "Waypoint: Learn how Free Code Camp Works", + "dashedName": "waypoint-learn-how-free-code-camp-works", "difficulty": 0.001, "challengeSeed": ["125407438"], "description": [ @@ -42,6 +43,7 @@ { "id": "bd7125d8c441eddfaeb5bd0f", "name": "Waypoint: Join Our Chat Room", + "dashedName": "waypoint-join-our-chat-room", "difficulty": 0.002, "challengeSeed": ["124555254"], "description": [ @@ -83,6 +85,7 @@ { "id": "bd7125d8c441eddfaeb5bdff", "name": "Waypoint: Preview our Challenge Map", + "dashedName": "waypoint-preview-our-challenge-map", "difficulty": 0.003, "challengeSeed": ["125407437"], "description": [ @@ -116,6 +119,7 @@ { "id": "bd7125d8c441eddfaeb5bd1f", "name": "Waypoint: Browse our Field Guide", + "dashedName": "waypoint-browse-our-field-guide", "difficulty": 0.004, "challengeSeed": ["125407435"], "description": [ @@ -147,6 +151,7 @@ { "id": "bd7125d8c441eddfaeb5bd2f", "name": "Waypoint: Customize your Portfolio Page", + "dashedName": "waypoint-customize-your-portfolio-page", "difficulty": 0.005, "challengeSeed": ["125407433"], "description": [ @@ -182,6 +187,7 @@ { "id": "bd7126d8c441eddfaeb5bd3f", "name": "Waypoint: Try Camper News", + "dashedName": "waypoint-try-camper-news", "difficulty": 0.006, "challengeSeed": ["124553410"], "description": [ @@ -221,6 +227,7 @@ { "id": "bd7126d8c441eddfaeb5bd3e", "name": "Waypoint: Meet Other Campers in your City", + "dashedName": "waypoint-meet-other-campers-in-your-city", "difficulty": 0.007, "challengeSeed": ["127358841"], "description": [ @@ -258,6 +265,7 @@ { "id": "bd7137d8c441eddfaeb5bdef", "name": "Waypoint: Get Help the Hacker Way with RSAP", + "dashedName": "waypoint-get-help-the-hacker-way-with-rsap", "difficulty": 0.008, "challengeSeed": ["125407432"], "description": [ diff --git a/challenges/intermediate-bonfires.json b/challenges/intermediate-bonfires.json index 3c5bf35928..f0e25cb698 100644 --- a/challenges/intermediate-bonfires.json +++ b/challenges/intermediate-bonfires.json @@ -5,6 +5,7 @@ { "id": "a2f1d72d9b908d0bd72bb9f6", "name": "Bonfire: Make a Person", + "dashedName": "bonfire-make-a-person", "difficulty": "3.01", "description": [ "Fill in the object constructor with the methods specified in the tests.", @@ -56,6 +57,7 @@ { "id": "af4afb223120f7348cdfc9fd", "name": "Bonfire: Map the Debris", + "dashedName": "bonfire-map-the-debris", "difficulty": "3.02", "description": [ "Return a new array that transforms the element's average altitude into their orbital periods.", @@ -96,6 +98,7 @@ { "id": "a3f503de51cfab748ff001aa", "name": "Bonfire: Pairwise", + "dashedName": "bonfire-pairwise", "difficulty": "3.03", "description": [ "Return the sum of all indices of elements of 'arr' that can be paired with one other element to form a sum that equals the value in the second argument 'arg'. If multiple sums are possible, return the smallest sum. Once an element has been used, it cannot be reused to pair with another.", diff --git a/challenges/jquery-ajax-and-json.json b/challenges/jquery-ajax-and-json.json index a03cb7e7cb..e33edc39b6 100644 --- a/challenges/jquery-ajax-and-json.json +++ b/challenges/jquery-ajax-and-json.json @@ -5,6 +5,7 @@ { "id": "bd7112d8c441eddfaeb5bded", "name": "Waypoint: Get Started with jQuery", + "dashedName": "waypoint-get-started-with-jquery", "difficulty": 0.13, "challengeSeed": ["125671865"], "description": [ @@ -30,6 +31,7 @@ { "id": "bd7113d8c441eddfaeb5bdef", "name": "Waypoint: Write Functions with jQuery", + "dashedName": "waypoint-write-functions-with-jquery", "difficulty": 0.14, "challengeSeed": ["125658029"], "description": [ @@ -54,6 +56,7 @@ { "id": "bd7114d8c441eddfaeb5bdef", "name": "Waypoint: Harness Dynamic HTML", + "dashedName": "waypoint-harness-dynamic-html", "difficulty": 0.15, "challengeSeed": ["125658028"], "description": [ @@ -77,6 +80,7 @@ { "id": "bd7115d8c441eddfaeb5bdef", "name": "Waypoint: Listen for jQuery Events", + "dashedName": "waypoint-listen-for-jquery-events", "difficulty": 0.16, "challengeSeed": ["125658027"], "description": [ @@ -100,6 +104,7 @@ { "id": "bd7116d8c441eddfaeb5bdef", "name": "Waypoint: Trigger jQuery Effects", + "dashedName": "waypoint-trigger-jquery-effects", "difficulty": 0.17, "challengeSeed": ["125658025"], "description": [ diff --git a/challenges/object-oriented-javascript.json b/challenges/object-oriented-javascript.json index 75d0f83836..2817126e2f 100644 --- a/challenges/object-oriented-javascript.json +++ b/challenges/object-oriented-javascript.json @@ -5,6 +5,7 @@ { "id": "bd7129d8c441eddfaeb5bddf", "name": "Waypoint: Scope Your Variables", + "dashedName": "waypoint-scope-your-variables", "difficulty": 0.01, "challengeSeed": ["128836683"], "description": [ @@ -31,6 +32,7 @@ { "id": "bd7131d8c441eddfaeb5bdbf", "name": "Waypoint: Reference your Current Object with This", + "dashedName": "waypoint-reference-your-current-object-with-this", "difficulty": 0.03, "challengeSeed": ["128836508"], "description": [ @@ -57,6 +59,7 @@ { "id": "bd7132d8c441eddfaeb5bdaf", "name": "Waypoint: Traverse the Prototype Chain", + "dashedName": "waypoint-traverse-the-prototype-chain", "difficulty": 0.04, "challengeSeed": ["128836684"], "description": [ @@ -82,6 +85,7 @@ { "id": "bd7133d8c441eddfaeb5bd0f", "name": "Waypoint: Reuse Code with Decorators", + "dashedName": "waypoint-reuse-code-with-decorators", "difficulty": 0.05, "challengeSeed": ["128836681"], "description": [ @@ -108,6 +112,7 @@ { "id": "bd7134d8c441eddfaeb5bd1f", "name": "Waypoint: Build Objects with Functional Classes", + "dashedName": "waypoint-build-objects-with-functional-classes", "difficulty": 0.06, "challengeSeed": ["128836503"], "description": [ @@ -134,6 +139,7 @@ { "id": "bd7135d8c441eddfaeb5bd2f", "name": "Waypoint: Build Objects with Prototypal Classes", + "dashedName": "waypoint-build-objects-with-prototypal-classes", "difficulty": 0.07, "challengeSeed": ["128836505"], "description": [ @@ -160,6 +166,7 @@ { "id": "bd7136d8c441eddfaeb5bd3f", "name": "Waypoint: Understand Pseudoclassical Patterns", + "dashedName": "waypoint-understand-pseudoclassical-patterns", "difficulty": 0.08, "challengeSeed": ["128836689"], "description": [ @@ -186,6 +193,7 @@ { "id": "bd7136d8c441eddfaeb5bd4f", "name": "Waypoint: Subclass one Object to Another", + "dashedName": "waypoint-subclass-one-object-to-another", "difficulty": 0.09, "challengeSeed": ["128836686"], "description": [ @@ -211,6 +219,7 @@ { "id": "bd7136d8c441eddfaeb5bd5f", "name": "Waypoint: Use Pseudoclassical Subclasses", + "dashedName": "waypoint-use-pseudoclassical-subclasses", "difficulty": 0.10, "challengeSeed": ["128836937"], "description": [ diff --git a/challenges/ziplines.json b/challenges/ziplines.json index 4382f84e6c..f61a96280e 100644 --- a/challenges/ziplines.json +++ b/challenges/ziplines.json @@ -5,6 +5,7 @@ { "id": "bd7158d8c442eddfbeb5bd1f", "name": "Waypoint: Get Set for Ziplines", + "dashedName": "waypoint-get-set-for-ziplines", "difficulty": 1.00, "challengeSeed": ["125658022"], "description": [ @@ -39,6 +40,7 @@ { "id": "bd7158d8c442eddfaeb5bd1f", "name": "Zipline: Use the Twitch.tv JSON API", + "dashedName": "zipline-use-the-twitchtv-json-api", "difficulty": 1.01, "challengeSeed": ["126411564"], "description": [ @@ -74,6 +76,7 @@ { "id": "bd7158d8c442eddfaeb5bd13", "name": "Zipline: Build a Random Quote Machine", + "dashedName": "zipline-build-a-random-quote-machine", "difficulty": 1.02, "challengeSeed": ["126415122"], "description": [ @@ -104,6 +107,7 @@ { "id": "bd7158d8c442eddfaeb5bd10", "name": "Zipline: Show the Local Weather", + "dashedName": "zipline-show-the-local-weather", "difficulty": 1.03, "challengeSeed": ["126415127"], "description": [ @@ -136,6 +140,7 @@ { "id": "bd7158d8c442eddfaeb5bd18", "name": "Zipline: Stylize Stories on Camper News", + "dashedName": "zipline-stylize-stories-on-camper-news", "difficulty": 1.04, "challengeSeed": ["126415129"], "description": [ @@ -168,7 +173,8 @@ }, { "id": "bd7158d8c442eddfaeb5bd19", - "name": "Zipline: Wikipedia Viewer", + "name": "zipline-wikipedia-viewer", + "dashedName": "Zipline: Wikipedia Viewer", "difficulty": 1.05, "challengeSeed": ["126415131"], "description": [ @@ -201,6 +207,7 @@ { "id": "bd7158d8c442eddfaeb5bd0f", "name": "Zipline: Build a Pomodoro Clock", + "dashedName": "zipline-build-a-pomodoro-clock", "difficulty": 1.06, "challengeSeed": ["126411567"], "description": [ @@ -232,6 +239,7 @@ { "id": "bd7158d8c442eddfaeb5bd17", "name": "Zipline: Build a JavaScript Calculator", + "dashedName": "zipline-build-a-javascript-calculator", "difficulty": 1.07, "challengeSeed": ["126411565"], "description": [ @@ -263,6 +271,7 @@ { "id": "bd7158d8c442eddfaeb5bd1c", "name": "Zipline: Build a Tic Tac Toe Game", + "dashedName": "zipline-build-a-tic-tac-toe-game", "difficulty": 1.08, "challengeSeed": ["126415123"], "description": [ From d5b5973326c95e81751e95f03049d10bfa54819a Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Sun, 14 Jun 2015 01:02:39 -0700 Subject: [PATCH 6/6] Merge branch 'interview' into staging Conflicts: app.js controllers/challenge.js seed/future-jquery-ajax-json.json --- challenges/basic-bonfires.json | 3 +- future-jquery-ajax-json.json | 374 ++++++++++++++++++++++++++++----- 2 files changed, 320 insertions(+), 57 deletions(-) diff --git a/challenges/basic-bonfires.json b/challenges/basic-bonfires.json index a6cf5aebf4..df4b6bc16c 100644 --- a/challenges/basic-bonfires.json +++ b/challenges/basic-bonfires.json @@ -46,9 +46,8 @@ "dashedName": "bonfire-meet-bonfire", "difficulty": "0", "description": [ - "Click the button below for further instructions.", "Your goal is to fix the failing test.", - "First, run all the tests by clicking \"Run code\" or by pressing Control + Enter", + "First, run all the tests by clicking \"Run code\" or by pressing Control + Enter.", "The failing test is in red. Fix the code so that all tests pass. Then you can move on to the next Bonfire.", "Make this function return true no matter what." ], diff --git a/future-jquery-ajax-json.json b/future-jquery-ajax-json.json index 97d0504f04..2a3a5d9cd7 100644 --- a/future-jquery-ajax-json.json +++ b/future-jquery-ajax-json.json @@ -1,73 +1,231 @@ { "name": "jQuery, Ajax and JSON", - "order" : 0.004, - "challenges": [ - { + "order": 0.004, + "challenges": [{ "id": "bad87fee1348bd9acdd08826", "name": "Waypoint: Learn how Script Tags and Document Ready Work", "difficulty": 0.072, "description": [ - "Test" + "We've simplified our Cat Photo App and removed our style element. Add a script element to your page and create a $(document).ready function within it.", + "Add $(document).ready(function() { to your script element, and then close it on the following line with });." ], "tests": [ - "assert(typeof $('#target').attr('disabled') === 'undefined', 'Change the disabled attribute of the \"target\" button to false');", - "expect($('#target')).to.exist()" + "assert(editor.match(/