{"id":1045,"date":"2010-12-01T14:28:35","date_gmt":"2010-12-01T16:28:35","guid":{"rendered":"http:\/\/blog.cancaonova.com\/desenvolvimentoti\/?p=1045"},"modified":"2010-12-01T14:32:06","modified_gmt":"2010-12-01T16:32:06","slug":"coding-dojo-17-dictionary-replacer","status":"publish","type":"post","link":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/coding-dojo-17-dictionary-replacer\/","title":{"rendered":"Coding Dojo #17 Dictionary Replacer"},"content":{"rendered":"<p>Bem amigos do Coding Dojo, hoje o encontro foi especialmente legal!! Primeiro porque voltamos a programar em Ruby (que foi a linguagem escolhida pela equipe para o prot\u00f3tipo do novo Portal), e depois porque tivemos nosso primeiro contato com as pr\u00e1ticas de <a href=\"http:\/\/pt.wikipedia.org\/wiki\/Behavior_Driven_Development\" target=\"_blank\">BDD<\/a> (Behavior Driven Development), usando <a href=\"http:\/\/cukes.info\/\" target=\"_blank\">Cucumber <\/a>e <a href=\"http:\/\/rspec.info\/\" target=\"_blank\">RSpec<\/a>.<\/p>\n<p>No in\u00edcio foi meio estranho por n\u00e3o estarmos acostumados ainda a essa cultura de testes, mas depois fomos pegando o jeitinho.<\/p>\n<p>O desafio foi interessante tamb\u00e9m pelo fato de n\u00e3o precisarmos nos prender tanto na resolu\u00e7\u00e3o do problema em si, fazendo assim com que n\u00f3s focassemos mais nos testes.<\/p>\n<p>E para fechar com chave de ouro, o lanche na restrospectiva foi &#8220;mara&#8221;: com bolacha calipso e trakinas, e claro o \u00f3timo caf\u00e9zinho do <a href=\"http:\/\/twitter.com\/marcomoura\" target=\"_blank\">@marcomoura<\/a>! ;D<\/p>\n<p>Origem do kata: <a href=\"http:\/\/codingdojo.org\/cgi-bin\/wiki.pl?KataDictionaryReplacer\" target=\"_blank\">http:\/\/codingdojo.org\/cgi-bin\/wiki.pl?KataDictionaryReplacer<\/a><\/p>\n<p>C\u00f3digo Fonte: <a href=\"https:\/\/gist.github.com\/723424\" target=\"_blank\">https:\/\/gist.github.com\/723424<\/a><\/p>\n<p>dicionario.feature<\/p>\n<pre># language: pt\r\n# features\/dicionario.feature\r\n\r\n# @author Marco Moura\r\n# @author Luciana Mendes\r\n# @author Rafael Salomao\r\n# @author Patricia Carvalho\r\n\r\n# @author Carlos Eduardo \r\n\r\nFuncionalidade: Dicionary Replace\r\nKata para substituir string em um texto\r\n\r\nCen\u00e1rio: Entrada vazia\r\nDado que entrei \"\"\r\nE entrei um dicionario \"\"\r\nEnt\u00e3o o software me retorna \"\"\r\n\r\nCen\u00e1rio: Texto 2 temporary\r\nDado que entrei \"$temp$\"\r\nE entrei um dicionario [\"temp\", \"temporary\"]\r\nEnt\u00e3o o software me retorna \"temporary\"\r\n\r\nCen\u00e1rio: Com um parametro apenas diferente de temporario\r\nDado que entrei \"$temp$\"\r\nE entrei um dicionario [\"temp\",\"hello world\"]\r\nEnt\u00e3o o software me retorna \"hello world\"\r\n\r\nCen\u00e1rio: Texto 3.John Doe\r\nDado que entrei \"$temp$ here comes the name $name$\"\r\nE entrei dois dicionario [[\"temp\",\"temporary\"],[\"name\",\"John Doe\"]]\r\nEnt\u00e3o o software me retorna \"temporary here comes the name John Doe\"<\/pre>\n<p>dicionario.rb<\/p>\n<pre># lib\/dicionario.rb\r\n\r\n# @author Marco Moura\r\n# @author Luciana Mendes\r\n# @author Rafael Salomao\r\n# @author Patricia Carvalho\r\n\r\n# @author Carlos Eduardo \r\n\r\nclass Dicionario\r\n@text\r\ndef set_text(t)\r\n@text = t\r\nend\r\n\r\n@dict\r\ndef set_dict(dict)\r\n@dict = dict\r\nend\r\n\r\ndef replace()\r\n\r\nif @dict == [\"\"]\r\n\"\"\r\nelse\r\n@text.sub(\/\\$temp\\$\/, @dict.first['temp'])\r\nend\r\n\r\nend\r\nend<\/pre>\n<p>dicionario_steps.rb<\/p>\n<pre># encoding: utf-8\r\n# features\/steps_definitions\/dicionario_steps.rb\r\n\r\n# @author Marco Moura\r\n# @author Luciana Mendes\r\n# @author Rafael Salomao\r\n# @author Patricia Carvalho\r\n\r\n# @author Carlos Eduardo \r\n\r\nBefore do\r\n  @dic = Dicionario.new\r\nend\r\n\r\nDado \/^que entrei \"([^\"]*)\"$\/ do |text|\r\n  @dic.set_text(text)\r\nend\r\n\r\nDado \/^entrei um dicionario \\[\"([^\"]*)\", \"([^\"]*)\"\\]$\/ do |text, dict|\r\n  @dic.set_dict([text,dict])\r\nend\r\n\r\nDado \/^entrei um dicionario \"([^\"]*)\"$\/ do |dict|\r\n  @dic.set_dict(dict)\r\nend\r\n\r\nDado \/^entrei dois dicionario \\[\\[\"([^\"]*)\",\"([^\"]*)\"\\],\\[\"([^\"]*)\",\"([^\"]*)\"\\]\\]$\/ do |arg1, arg2, arg3, arg4|\r\n  temp = [arg1 = arg2, arg3 = arg4]\r\n  @dic.set_dict(temp)\r\nend\r\n\r\nEnt\u00e3o \/^o software me retorna \"([^\"]*)\"$\/ do |new_text|\r\n  replace = @dic.replace()\r\n  replace.should == new_text\r\nend<\/pre>\n<p>env.rb<\/p>\n<pre># encoding: utf-8\r\n# features\/support\/env.rb\r\n\r\nbegin require 'rspec\/expectations'; rescue LoadError; require 'spec\/expectations'; end\r\nrequire 'cucumber\/formatter\/unicode'\r\n$:.unshift(File.dirname(__FILE__) + '\/..\/..\/lib')\r\nrequire 'dicionario'<\/pre>\n<p><strong>Retrospectiva<\/strong><\/p>\n<p>O que foi bom e devemos repetir nos pr\u00f3ximos<\/p>\n<p>* lanche e caf\u00e9<br \/>\n* conhecer algo novo (cucumber, BDD)<br \/>\n* realmente iniciamos o desenvolvimento pelo teste<br \/>\n* o desafio foi bom<br \/>\n* os curadores<br \/>\n* o output do cucumber \u00e9 legal<br \/>\n* ter refer\u00eancia na m\u00e1quina foi legal<br \/>\n* n\u00e3o acessar a internet<br \/>\n* usar o terminal =D<br \/>\n* mudar de editor<br \/>\n* foi divertido<br \/>\n* a busca pela solu\u00e7\u00e3o do desafio foi legal<br \/>\n* foi bem babysteps<\/p>\n<p>Nos pr\u00f3ximos poderia ser melhor<\/p>\n<p>* melhor conhecimento de Ruby<br \/>\n* melhor conhecimento de Cucumber<br \/>\n* melhor conhecimento de RSpec (steps)<br \/>\n* travar menos no inicio do desenvolvimento<br \/>\n* melhorar a din\u00e2mica da dupla (ping pong)<br \/>\n* Refatorar antes de implementar uma coisa nova<\/p>\n<p><strong>Fotos do encontro<\/strong><\/p>\n<p><a href=\"http:\/\/blog.cancaonova.com\/desenvolvimentoti\/files\/2010\/12\/img_2137.jpg\">\n\t\t<style type=\"text\/css\">\n\t\t\t#gallery-1 {\n\t\t\t\tmargin: auto;\n\t\t\t}\n\t\t\t#gallery-1 .gallery-item {\n\t\t\t\tfloat: left;\n\t\t\t\tmargin-top: 10px;\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: 33%;\n\t\t\t}\n\t\t\t#gallery-1 img {\n\t\t\t\tborder: 2px solid #cfcfcf;\n\t\t\t}\n\t\t\t#gallery-1 .gallery-caption {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t\t\/* see gallery_shortcode() in wp-includes\/media.php *\/\n\t\t<\/style>\n\t\t<div id='gallery-1' class='gallery galleryid-1045 gallery-columns-3 gallery-size-thumbnail'><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/blog.cancaonova.com\/desenvolvimentoti\/coding-dojo-17-dictionary-replacer\/img_2136\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/files\/\/var\/www\/blog.cancaonova.com\/wp-content\/blogs.dir\/3309\/files\/\/2010\/12\/img_2136-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/dt><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/blog.cancaonova.com\/desenvolvimentoti\/coding-dojo-17-dictionary-replacer\/img_2137\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/files\/\/var\/www\/blog.cancaonova.com\/wp-content\/blogs.dir\/3309\/files\/\/2010\/12\/img_2137-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/dt><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/blog.cancaonova.com\/desenvolvimentoti\/coding-dojo-17-dictionary-replacer\/img_2138\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/files\/\/var\/www\/blog.cancaonova.com\/wp-content\/blogs.dir\/3309\/files\/\/2010\/12\/img_2138-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/dt><\/dl><br style=\"clear: both\" \/><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/blog.cancaonova.com\/desenvolvimentoti\/coding-dojo-17-dictionary-replacer\/img_2140\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/files\/\/var\/www\/blog.cancaonova.com\/wp-content\/blogs.dir\/3309\/files\/\/2010\/12\/img_2140-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/dt><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/blog.cancaonova.com\/desenvolvimentoti\/coding-dojo-17-dictionary-replacer\/img_2143\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/files\/\/var\/www\/blog.cancaonova.com\/wp-content\/blogs.dir\/3309\/files\/\/2010\/12\/img_2143-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/dt><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/blog.cancaonova.com\/desenvolvimentoti\/coding-dojo-17-dictionary-replacer\/img_2144\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/files\/\/var\/www\/blog.cancaonova.com\/wp-content\/blogs.dir\/3309\/files\/\/2010\/12\/img_2144-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/dt><\/dl><br style=\"clear: both\" \/><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/blog.cancaonova.com\/desenvolvimentoti\/coding-dojo-17-dictionary-replacer\/img_2145\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/files\/\/var\/www\/blog.cancaonova.com\/wp-content\/blogs.dir\/3309\/files\/\/2010\/12\/img_2145-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/dt><\/dl>\n\t\t\t<br style='clear: both' \/>\n\t\t<\/div>\n<br \/>\n<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bem amigos do Coding Dojo, hoje o encontro foi especialmente legal!! Primeiro porque voltamos a programar em Ruby (que foi a linguagem escolhida pela equipe para o prot\u00f3tipo do novo Portal), e depois porque tivemos nosso primeiro contato com as&#8230;<\/p>\n","protected":false},"author":4439,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[36433,36209,36434,34863,33255,30094],"tags":[103622,103619,103623,103616],"_links":{"self":[{"href":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/wp-json\/wp\/v2\/posts\/1045"}],"collection":[{"href":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/wp-json\/wp\/v2\/users\/4439"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/wp-json\/wp\/v2\/comments?post=1045"}],"version-history":[{"count":20,"href":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/wp-json\/wp\/v2\/posts\/1045\/revisions"}],"predecessor-version":[{"id":1073,"href":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/wp-json\/wp\/v2\/posts\/1045\/revisions\/1073"}],"wp:attachment":[{"href":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/wp-json\/wp\/v2\/media?parent=1045"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/wp-json\/wp\/v2\/categories?post=1045"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.cancaonova.com\/desenvolvimentoti\/wp-json\/wp\/v2\/tags?post=1045"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}