Merge branch 'master' into production

This commit is contained in:
Nick Winter 2015-09-09 21:55:04 -07:00
commit 8f22ede9ad
17 changed files with 672 additions and 637 deletions

3
.gitignore vendored
View file

@ -94,4 +94,7 @@ login.coffee
npm-debug.log*
temp/
Dockerfile
### If you add something here, copy it to the end of .npmignore, too. ###

View file

@ -103,6 +103,7 @@ temp/
# local settings
login.coffee
Dockerfile
# debugging
*.heapsnapshot

View file

@ -1,26 +1,35 @@
sudo: false
language: node_js
node_js:
- 0.10
addons:
apt:
sources:
- mongodb-upstart
packages:
- mongodb-org-server
cache:
directories:
- node_modules
- bower_components
before_install:
- "sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10"
- "echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list"
- "sudo apt-get update"
- "sudo apt-get install mongodb-org-server"
- npm install -g npm@latest
before_script:
- "npm install"
- export DISPLAY=:99.0
- export COCO_TRAVIS_TEST=1
- sh -e /etc/init.d/xvfb start
- "./node_modules/.bin/bower install"
- "gem install sass"
- "./node_modules/.bin/brunch b"
- "mkdir mongo"
- "mongod --dbpath=./mongo --fork --logpath ./mongodb.log"
- "node index.js --unittest &"
- "sleep 10" # to give node a chance to start
script:
- "./node_modules/jasmine-node/bin/jasmine-node test/server/ --coffee --captureExceptions"
# - "./node_modules/karma/bin/karma start --browsers Firefox --single-run --reporters progress"
- "./node_modules/karma/bin/karma start --browsers Firefox --single-run --reporters progress"

View file

@ -3,6 +3,7 @@
window.userObject = {_id:'1'}
window.StripeCheckout = {configure: function (){}}
initialize = require('core/initialize');
initialize.init();
console.debug = function() {}; // Karma conf doesn't seem to work? Debug messages are still emitted when they shouldn't be.

View file

@ -410,6 +410,7 @@
feature7: "Private <strong>Clans</strong>"
free: "Free"
month: "month"
must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
subscribe_title: "Subscribe"
unsubscribe: "Unsubscribe"
confirm_unsubscribe: "Confirm Unsubscribe"
@ -613,6 +614,7 @@
free_1: "There are 110+ FREE levels which cover every concept."
free_2: "A monthly subscription provides access to video tutorials and extra practice levels."
teacher_subs_title: "Teachers get free subscriptions!"
teacher_subs_0: "We offer free subscriptions to teachers for evaluation purposes."
teacher_subs_1: "Please fill out our"
teacher_subs_2: "Teacher Survey"
teacher_subs_3: "to set up your subscription."

View file

@ -293,10 +293,10 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
infinite_loop_reset_level: "Resetar nível"
infinite_loop_comment_out: "Comentar Meu Código"
tip_toggle_play: "Alterne entre rodando/pausado com Ctrl+P."
tip_scrub_shortcut: "Ctrl+[ e Ctrl+] rebobina e avança." # {change}
tip_guide_exists: "Clique no guia no topo da página para informações úteis."
tip_scrub_shortcut: "Ctrl+[ e Ctrl+] Rebobinar e Avançar."
tip_guide_exists: "Clique no guia no topo da página para ter informações úteis."
tip_open_source: "CodeCombat é 100% código aberto!"
tip_tell_friends: "Está gostando de CodeCombate? Divulgue para os seus amigos!"
tip_tell_friends: "Está gostando do CodeCombat? Divulgue para os seus amigos!"
tip_beta_launch: "CodeCombat lançou sua versão beta em outubro de 2013."
tip_think_solution: "Pense na solução, não no problema."
tip_theory_practice: "Na teoria, não existe diferença entre teoria e prática. Mas, na prática, há. - Yogi Berra"
@ -304,7 +304,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
tip_debugging_program: "Se depurar é o processo de remover erros, então programar deve ser o processo de adicioná-los. - Edsger W. Dijkstra"
tip_forums: "Vá aos fóruns e diga-nos o que você pensa!"
tip_baby_coders: "No futuro, até bebês serão Arquimagos."
tip_morale_improves: "O carregamento continuará até que a ânimo melhore."
tip_morale_improves: "O carregamento continuará até que a ânimo melhore." # {change}
tip_all_species: "Nós acreditamos em oportunidades iguais para todas as espécies aprenderem a programar."
tip_reticulating: "Reticulando espinhas."
tip_harry: "Você é um Feiticeiro, "
@ -315,32 +315,32 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
tip_no_try: "Faça. Ou não faça. Não existe tentar. - Yoda"
tip_patience: "Paciência você deve ter, jovem Padawan. - Yoda"
tip_documented_bug: "Um bug documentado não é um bug; é uma funcionalidade."
tip_impossible: "Sempre parece impossível, até ser feito. - Nelson Mandela"
tip_impossible: "Tudo parece impossível, até que seja feito. - Nelson Mandela"
tip_talk_is_cheap: "Falar é fácil. Mostre-me o código. - Linus Torvalds"
tip_first_language: "A coisa mais desastrosa que você pode aprender é a sua primeira linguagem de programação. - Alan Kay"
tip_hardware_problem: "P: Quantos programadores são necessários para se trocar uma lâmpada? R: Nenhum, é um problema de hardware."
tip_hofstadters_law: "Lei de Hofstadter: Sempre demora mais do que você espera, mesmo quando você leva em consideração a Lei de Hofstadter."
tip_premature_optimization: "Uma otimização permatura é a raíz de todos os males. - Donald Knuth"
tip_hardware_problem: "P: Quantos programadores são necessários para se trocar uma lâmpada? R: Nenhum! Isso é um problema de hardware."
tip_hofstadters_law: "Lei de Hofstadter: Tudo demora mais do que você espera, mesmo quando você leva em consideração a Lei de Hofstadter."
tip_premature_optimization: "Uma otimização prematura é a raíz de todos os males. - Donald Knuth"
tip_brute_force: "Na dúvida, utilize força bruta. - Ken Thompson"
tip_extrapolation: "Existem dois tipos de pessoa: aqueles que podem extrapolar apartir de dados incompletos..."
tip_superpower: "Programar é a coisa mais próxima de termos super poderes."
tip_extrapolation: "Existem dois tipos de pessoa: Aqueles que podem extrapolar apartir de dados incompletos..."
tip_superpower: "Programar é a coisa mais próxima de ter super poderes."
tip_control_destiny: "No verdadeiro código aberto, você tem o direito de controlar seu próprio destino. - Linus Torvalds"
tip_no_code: "Nenhum código é mais rápido que código nenhum. - Kevlin Henney"
tip_code_never_lies: "Código nunca mente, comentários as vezes. — Ron Jeffries"
tip_reusable_software: "Antes do software ser reutilizável, ele primeiro tem que ser utilizável."
tip_code_never_lies: "O código nunca mente, os comentários as vezes. — Ron Jeffries"
tip_reusable_software: "Antes do software ser reutilizável, ele primeiro precisa ser utilizável."
tip_optimization_operator: "Cada linguagem tem um operador de otimização. Na maioria delas esse operador é //"
tip_lines_of_code: "Medir o progresso de programação em linhas de código é como medir a construção de aeronaves pelo peso. — Bill Gates"
tip_source_code: "Eu gostaria de mudar o Mundo, mas eles não me deram o código fonte."
tip_javascript_java: "Java é para o JavaScript o que um Carro é para um Carpete. - Chris Heilmann"
tip_move_forward: "O que quer que você faça, continue indo em frente. - Martin Luther King Jr."
tip_move_forward: "O que quer que você faça, continue em frente de qualquer jeito. - Martin Luther King Jr."
tip_google: "Tem um problema que você não pode solucionar? Google!"
tip_adding_evil: "Adicionando uma pitada de maldade."
tip_hate_computers: "As pessoas realmente pensam porque odeiam computadores. O que eles realmente odeiam são programadores ruins. - Larry Niven"
tip_hate_computers: "As pessoas realmente pensam que odeiam computadores. O que elas realmente odeiam são programadores ruins. - Larry Niven"
tip_open_source_contribute: "Você pode ajudar CodeCombat a melhorar!"
tip_recurse: "Para iterar é humano, para recursão, é divino. - L. Peter Deutsch"
tip_free_your_mind: "Você tem que deixar isso tudo passar, Neo. O medo, a dúvida e a descrença. Liberte sua mente - Morpheus"
tip_strong_opponents: "Mesmo o mais forte dos adversários tem sua fraqueza. - Itachi Uchiha"
tip_paper_and_pen: "Antes de começar a programar, você sempre pode planejar com papel e caneta."
tip_paper_and_pen: "Antes de começar a programar, você sempre deve planejar com papel e caneta."
game_menu:
inventory_tab: "Inventário"
@ -352,15 +352,15 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
multiplayer_tab: "Multijogador"
auth_tab: "Registrar"
inventory_caption: "Equipar seu herói"
choose_hero_caption: "Escolha seu herói, linguagem"
choose_hero_caption: "Escolha seu herói, e linguagem"
save_load_caption: "... e visualizar o histórico"
options_caption: "Configurar preferências"
guide_caption: "Documentos e dicas"
guide_caption: "Documentos e Dicas"
multiplayer_caption: "Jogue com seus amigos!"
auth_caption: "Salve seu progresso."
leaderboard:
leaderboard: "Líderança"
leaderboard: "Líderança" # {rankings?}
view_other_solutions: "Ver Outras Soluções" # {change}
scores: "Pontuação"
top_players: "Top Jogadores por"
@ -379,10 +379,10 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
required_purchase_title: "Obrigatório"
available_item: "Disponível"
restricted_title: "Restrito"
should_equip: "(dois cliques para equipar)"
equipped: "(equipado)"
locked: "(trancado)"
restricted: "(restrito nesse nível)"
should_equip: "(Dois cliques para equipar)"
equipped: "(Equipado)"
locked: "(Trancado)"
restricted: "(Restrito nesse nível)"
equip: "Equipar"
unequip: "Desequipar"
@ -393,10 +393,10 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
purchasing: "Comprando..."
declined: "Seu cartão foi rejeitado, desculpe."
retrying: "Erro de servidor, tentando novamente."
prompt_title: "Gemas insulficientes"
prompt_body: "Você quer conseguir mais gemas?"
prompt_title: "Gemas insuficientes"
prompt_body: "Você quer adquirir mais gemas?"
prompt_button: "Entrar na loja"
recovered: "Gemas de compras anteriores Recuperadas. Por favor atualize a pagina."
recovered: "Gemas das compras anteriores recuperadas. Por favor atualize a pagina."
price: "x3500 / mês"
subscribe:

View file

@ -406,10 +406,11 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
feature3: "70+ níveis de bónus"
feature4: "<strong>3500 gemas de bónus</strong> por mês!"
feature5: "Tutoriais em vídeo"
feature6: "Apoio por e-mail superior"
feature6: "Apoio por e-mail prioritário"
feature7: "<strong>Clãs</strong> Privados"
free: "Grátis"
month: "mês"
must_be_logged: "Primeiro tens de ter sessão iniciada. Por favor, cria uma conta ou inicia sessão a partir do menu acima."
subscribe_title: "Subscrever"
unsubscribe: "Cancelar Subscrição"
confirm_unsubscribe: "Confirmar Cancelamento da Subscrição"
@ -420,7 +421,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
sorry_to_see_you_go: "Lamentamos ver-te partir! Por favor, diz-nos o que podíamos ter feito melhor."
unsubscribe_feedback_placeholder: "Oh, o que fomos fazer?"
parent_button: "Pergunta ao teu educador"
parent_email_description: "Vamos mandar-lhe um e-mail para que ele possa comprar-te uma subscrição do CodeCombat."
parent_email_description: "Vamos enviar-lhe um e-mail para que possa comprar-te uma subscrição do CodeCombat."
parent_email_input_invalid: "Endereço de e-mail inválido."
parent_email_input_label: "Endereço de e-mail do educador"
parent_email_input_placeholder: "Introduz o e-mail do educador"
@ -429,12 +430,12 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
parent_email_title: "Qual é o e-mail do teu educador?"
parents: "Para Educadores"
parents_title: "Caro Educador: O seu educando está a aprender a programar. Vai ajudá-lo a continuar?"
parents_blurb1: "O seu educando já jogou __nLevels__ níveis e aprendeu as bases da programação. Ajude a desenvolver o interesse dele, comprando-lhe uma subscrição para que possa continuar a jogar."
parents_blurb1: "O seu educando já jogou __nLevels__ níveis e aprendeu as bases da programação. Ajude a desenvolver o interesse dele, comprando-lhe uma subscrição para que ele possa continuar a jogar."
parents_blurb1a: "A programação de computadores é uma habilidade fundamental que o seu educando vai usar incontestavelmente quando for adulto. Em 2020, habilidades de programação básicas serão requisitadas por 77% dos empregos e, atualmente, há uma grande procura por engenheiros informáticos no mundo. Sabia que os cursos universitários ligados às Ciências da Computação são os mais bem pagos?"
parents_blurb2: "Por $9.99 USD/mês, o seu educando recebe novos desafios todas as semanas e suporte pessoal, via e-mail, de programadores profissionais."
parents_blurb3: "Sem Risco: 100% de garantia de devolução do dinheiro, com anulação fácil de 1 clique."
payment_methods: "Formas de Pagamento"
payment_methods_title: "Formas de Pagamento Aceites"
payment_methods: "Métodos de Pagamento"
payment_methods_title: "Métodos de Pagamento Aceites"
payment_methods_blurb1: "Atualmente aceitamos cartões de crédito e Alipay."
payment_methods_blurb2: "Se precisares de uma outra forma de pagamento, por favor contacta"
sale_already_subscribed: "Já estás subscrito!"
@ -475,7 +476,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
group_discounts_20: "20% de desconto"
group_discounts_12th: "12ª+ subscrições"
group_discounts_40: "40% de desconto"
subscribing: "A subscrever..."
subscribing: "A Subscrever..."
recipient_emails_placeholder: "Introduz endereços de e-mail para subscrever, um por linha."
subscribe_users: "Subscrever Utilizadores"
users_subscribed: "Utilizadores subscritos:"
@ -519,13 +520,15 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
health_3: "apresentado."
speed_1: "Move a"
speed_2: "metros por segundo."
available_for_purchase: "Disponível para Aquirir" # Shows up when you have unlocked, but not purchased, a hero in the hero store
available_for_purchase: "Disponível para Aquisição" # Shows up when you have unlocked, but not purchased, a hero in the hero store
level_to_unlock: "Nível para desbloquear:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
restricted_to_certain_heroes: "Apenas certos heróis podem jogar este nível."
skill_docs:
writable: "escrevível" # Hover over "attack" in Your Skills while playing a level to see most of this
writable: "editável" # Hover over "attack" in Your Skills while playing a level to see most of this
read_only: "apenas leitura"
action: "Ação-"
spell: "Feitiço-"
action_name: "nome"
action_cooldown: "Demora"
action_specific_cooldown: "Tempo de Recarga"

View file

@ -1,4 +1,8 @@
#subscription-view
.logged-out-blurb
font-size: 18px
.start-subscription-button, .end-subscription-button
margin-bottom: 20px
float: left

View file

@ -12,6 +12,9 @@
.input-heard-about
width: 100%
.logged-out-blurb
font-size: 18px
.thanks-submit
display: none

View file

@ -11,7 +11,7 @@ block content
li.active(data-i18n="account.subscription")
if me.get('anonymous')
p(data-i18n="account_settings.not_logged_in")
p.logged-out-blurb(data-i18n="subscribe.must_be_logged")
else
//- Personal Subscriptions

View file

@ -5,7 +5,7 @@ block content
h2(data-i18n="teachers_survey.title")
if me.isAnonymous()
p(data-i18n="teachers_survey.must_be_logged")
p.logged-out-blurb(data-i18n="teachers_survey.must_be_logged")
else if fetchingData
h4(data-i18n="teachers_survey.retrieving")
else if existingRequests.length > 0

View file

@ -18,6 +18,7 @@ block content
p(data-i18n="teachers.free_2")
h3.teachers-title(data-i18n="teachers.teacher_subs_title")
p(data-i18n="teachers.teacher_subs_0")
p
span.spr(data-i18n="teachers.teacher_subs_1")
a(href='/teachers/freetrial', data-i18n="teachers.teacher_subs_2")

View file

@ -92,7 +92,7 @@
"karma": "~0.12",
"karma-chrome-launcher": "~0.1.2",
"karma-coffee-preprocessor": "~0.1.2",
"karma-coverage": "~0.1.4",
"karma-coverage": "~0.5.1",
"karma-firefox-launcher": "~0.1.3",
"karma-html2js-preprocessor": "~0.1.0",
"karma-jasmine": "~0.2.0",

View file

@ -66,7 +66,7 @@ getRandomSessions = (user, callback) ->
# Sampling by level: we pick a level, then find a human and ogre session for that level, one at random, one biased towards recent submissions.
#ladderLevelIDs = ['greed', 'criss-cross', 'brawlwood', 'dungeon-arena', 'gold-rush', 'sky-span'] # Let's not give any extra simulations to old ladders.
ladderLevelIDs = ['dueling-grounds', 'cavern-survival', 'multiplayer-treasure-grove', 'harrowland', 'zero-sum', 'ace-of-coders']
ladderLevelIDs = ['dueling-grounds', 'cavern-survival', 'multiplayer-treasure-grove', 'harrowland', 'zero-sum', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders']
sampleByLevel = (callback) ->
levelID = _.sample ladderLevelIDs
favorRecentHumans = Math.random() < 0.5 # We pick one session favoring recent submissions, then find another one uniformly to play against
@ -76,6 +76,7 @@ findRandomSession = (queryParams, callback) ->
# In MongoDB 3.2, we will be able to easily get a random document with aggregate $sample: https://jira.mongodb.org/browse/SERVER-533
queryParams.submitted = true
favorRecent = queryParams.favorRecent
favorRecent = false # temp, for Ace of Coders tournament
delete queryParams.favorRecent
if favorRecent
return findRecentRandomSession queryParams, callback

4
singlecore.coffee Normal file
View file

@ -0,0 +1,4 @@
require('coffee-script')
require('coffee-script/register')
server = require('./server')
server.startServer()

View file

@ -94,6 +94,7 @@ describe 'LevelLoader', ->
describe 'loadDependenciesForSession', ->
it 'loads hero and item thang types from heroConfig in the given session', ->
levelLoader = new LevelLoader({supermodel:new SuperModel(), sessionID: 'id', levelID: 'id'})
levelLoader.sessionDependenciesRegistered = {}
session = new LevelSession(sessionWithAnyaWithGloves)
levelLoader.loadDependenciesForSession(session)
requests = jasmine.Ajax.requests.all()
@ -103,6 +104,7 @@ describe 'LevelLoader', ->
it 'loads components for the hero in the heroConfig in the given session', ->
levelLoader = new LevelLoader({supermodel:new SuperModel(), sessionID: 'id', levelID: 'id'})
levelLoader.sessionDependenciesRegistered = {}
session = new LevelSession(sessionWithAnyaWithGloves)
levelLoader.loadDependenciesForSession(session)
responses = {

File diff suppressed because it is too large Load diff