/
atom.xml
510 lines (274 loc) · 87.1 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[Categoria: Open Source | Nome do Jogo]]></title>
<link href="http://nomedojogo.com/categories/open-source/atom.xml" rel="self"/>
<link href="http://nomedojogo.com/"/>
<updated>2012-04-19T02:33:19-03:00</updated>
<id>http://nomedojogo.com/</id>
<author>
<name><![CDATA[Carlos Brando]]></name>
</author>
<generator uri="http://octopress.org/">Octopress</generator>
<entry>
<title type="html"><![CDATA[Instalando a linguagem Go no Mac]]></title>
<link href="http://nomedojogo.com/2009/11/13/instalando-a-linguagem-go-no-mac/"/>
<updated>2009-11-13T00:00:00-02:00</updated>
<id>http://nomedojogo.com/2009/11/13/instalando-a-linguagem-go-no-mac</id>
<content type="html"><![CDATA[<p><img src="http://old.nomedojogo.com/wp-content/uploads/2009/11/logo-153x55.png" alt="logo-153x55" title="logo-153x55" class="alignright size-full wp-image-2880" />O Google acabou de anunciar o lançamento de uma nova linguagem de programação chamada <a href="http://golang.org/">Go</a>. A linguagem foi desenvolvida por um time formado por cinco engenheiros do Google, incluindo <a href="http://pt.wikipedia.org/wiki/Ken_Thompson">Ken Thompson</a> e <a href="http://pt.wikipedia.org/wiki/Rob_Pike">Rob Pike</a>, que são famosos por terem trabalhado no UNIX.</p>
<p>De acordo com o Google, além de oferecer suporte integrado a processos concorrentes, Go tem a pretensão de combinar a velocidade de desenvolvimento de uma linguagem dinâmica com a performance de uma linguagem compilada.</p>
<p>Eu ainda não testei a linguagem o suficiente para poder expressar qualquer opinião. De qualquer forma, a melhor coisa a fazer é testar por si próprio e tirar suas próprias conclusões. Abaixo você vai encontrar um breve tutorial com os passos que percorri para instalar tudo o que é necessário para começar a brincadeira no meu Mac Os. Espero que ele seja útil para você também.</p>
<h2>Instalando o Mercurial</h2>
<p><a href="http://mercurial.selenic.com/">Mercurial</a> é uma ferramenta de controle de versão distribuído, assim como o nosso querido <strong>Git</strong>. É necessário instalá-lo para poder baixar o código fonte do Go.</p>
<p>Eu utilizei o instalador disponível para Mac na página de <a href="http://mercurial.selenic.com/downloads/">downloads</a> no próprio site da ferramenta.</p>
<p>Após a instalação, você pode verificar se tudo deu certo digitando o comando abaixo no terminal:</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ hg version</span></span></pre>
<p>No meu caso, uma mensagem de erro foi disparada e a solução foi configurar algumas variáveis de ambiente. Se isto também acontecer com você, abra o arquivo <code>˜/.profile</code> e acrescente as seguintes linhas no final:</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text"># Mercurial
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8</span></span></pre>
<h2>Configurando o ambiente para a instalação do Go</h2>
<p>Aproveite que você já está com o arquivo <code>.profile</code> aberto e também acrescente as seguintes linhas no fim do arquivo. Estas linhas servem para configurar o seu ambiente para a instalação do Go.</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text"># Go
export GOROOT=$HOME/Sources/go
export GOOS=darwin
export GOARCH=amd64
export GOBIN=$HOME/Development/Go/Binaries
export PATH=$GOBIN:$PATH</span></span></pre>
<p><code>$GOROOT</code> deve conter o diretório onde o código fonte da linguagem será baixado.</p>
<p>As variáveis <code>$GOOS</code> e <code>$GOARCH</code> servem para configurar o seu ambiente. As combinações validas são: linux/amd64, linux/arm, linux/386, darwin/amd64, darwin/386 e nacl/386. O código acima está preparado para a instalação no Mac OS 10.6.</p>
<p>E por último, a variável <code>$GOBIN</code> deve conter o diretório onde você deseja que os binários do Go sejam instalados. Se você optar por instalar os binários no diretório <code>/usr/local/bin</code>, aconselho ler esta <a href="http://groups.google.com/group/golang-nuts/browse_thread/thread/6db568d839310301/84f272f19da67545?lnk=raot">discussão</a>. Esta variável é opcional e o valor padrão para ela é o diretório <code>$HOME/bin</code>.</p>
<p>Para garantir que tudo está funcionando execute:</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ env | grep '^GO'</span></span></pre>
<p>O resultado deve ser uma lista semelhante a esta:</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">GOBIN=/Users/carlosbrando/Development/Go/Binaries
GOARCH=amd64
GOROOT=/Users/carlosbrando/Projects/go
GOOS=darwin</span></span></pre>
<h2>Instalando</h2>
<p>Após instalar o Mercurial, utilize o comando abaixo para recuperar o código fonte do projeto:</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ hg clone -r release <span class="markup markup_underline markup_underline_link markup_underline_link_text">https://go.googlecode.com/hg/</span> $GOROOT</span></span></pre>
<p>Antes de continuar, certifique-se de criar o diretório que você configurou para receber os binários e execute os comandos abaixo:</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ cd $GOROOT/src
$ ./all.bash</span></span></pre>
<h2>Criando o primeiro programa</h2>
<p>Se tudo correu bem, você já tem o seu ambiente pronto para começar a programar em Go. E nada melhor do que um "Hello, world" para começar. Crie um arquivo com o nome helloworld.go e adicione o seguinte código nele:</p>
<p>``` go</p>
<pre><code>package main
import fmt "fmt"
func main() {
fmt.Printf("Hello, world\n");
}
</code></pre>
<p>```</p>
<p>Primeiro compile o arquivo com o comando:</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ 6g helloworld.go</span></span></pre>
<p>Para "linkar" o arquivo utilize:</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ 6l helloworld.6</span></span></pre>
<p>E para executar:</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">$ ./6.out
Hello, world</span></span></pre>
<p>Agora é só continuar no <a href="http://golang.org/doc/go_tutorial.html">tutorial</a> criado pelo próprio time de desenvolvimento. E não deixe de compartilhar suas experiências com a linguagem deixando um comentário.</p>
<p><a rel="bookmark" href="http://nomedojogo.com/2009/11/13/instalando-a-linguagem-go-no-mac/"></a></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Remarkable 3.0 is out and it's... well... remarkable!]]></title>
<link href="http://nomedojogo.com/2009/04/14/remarkable-30-is-out-and-its-well-remarkable/"/>
<updated>2009-04-14T00:00:00-03:00</updated>
<id>http://nomedojogo.com/2009/04/14/remarkable-30-is-out-and-its-well-remarkable</id>
<content type="html"><![CDATA[<p>Wow, a major release? Yes, a major release and we have plenty reasons for that. Since me and <a id="f0t3" title="José Valim" href="http://josevalim.blogspot.com/">José Valim</a> were working on it for a couple months, we have quite a list :). So follow up:</p>
<h2>1. Remarkable Core</h2>
<p><a id="oue7" title="Remarkable" href="http://github.com/carlosbrando/remarkable">Remarkable</a> is now a framework for <a id="l2-8" title="rspec" href="http://rspec.info/">rspec</a> matchers. Since Rails matchers are not simple, as Remarkable grew, we saw our matchers full of logic to show messages (description and failure messages) and that some methods could be automatically generated, reducing repetitive work.</p>
<p>Compare the allow_mass_assignment_of matcher in <a id="y8_3" title="Remarkable 2.x" href="http://github.com/carlosbrando/remarkable/blob/a296cae395ae87a8b7ae1f83605a31a4eb3988bf/lib/remarkable/active_record/macros/validations/allow_mass_assignment_of_matcher.rb">Remarkable 2.x</a> and in <a id="dtj7" title="Remarkable 3.0" href="http://github.com/carlosbrando/remarkable/blob/136267fbd66be4892db6f3b561cab650f3f7b935/remarkable_activerecord/lib/remarkable_activerecord/matchers/allow_mass_assignment_of_matcher.rb">Remarkable 3.0</a>. Which one do you prefer? :)</p>
<p>So we built a DSL and called it Remarkable, which with Remarkable ActiveRecord and Remarkable Rails, provides you nice matchers/macros to speed up your tests. To install them, just do:</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">sudo gem install remarkable_rails</span></span></pre>
<p>You can also install just <strong>remarkable</strong> or just <strong>remarkable_activerecord</strong>. But remarkable_rails brings you the whole packet.</p>
<h2>2. I18n</h2>
<p>On Rails Summit Latin America, <a id="x6yr" title="Obie Fernandez" href="http://blog.obiefernandez.com/">Obie Fernandez</a> talked about the Hash Rocket way and one of the items were that they actually print out the specs and give it to the client. Both me and José <a id="v:p1" title="works" href="http://surgeworks.com/">work with</a> <a id="reai" title="Rails projects" href="http://www.plataformatec.com.br/">Rails projects</a> and we couldn't deliver the same to technical clients, because the output was in english. Well, we scratched our own itch!</p>
<p>This is how an English output would be like:</p>
<div style="margin-left: 40px;"><span style="font-family: Courier New;">Example disabled: require age to be set</span><br style="font-family: Courier New;" /><br style="font-family: Courier New;" /><span style="font-family: Courier New;">User</span><br style="font-family: Courier New;" /><span style="font-family: Courier New;">- should require name and email to be set</span><br style="font-family: Courier New;" /><span style="font-family: Courier New;">- should ensure length of name is within 3..40 characters</span><br style="font-family: Courier New;" /><span style="font-family: Courier New;">- should require unique values for email</span><br style="font-family: Courier New;" /><span style="font-family: Courier New;">- should ensure numericality of age allowing only integer values and allowing blank values </span></div>
<p>In Remarkable, we can have the same results in Portuguese:</p>
<div style="margin-left: 40px; font-family: Courier New;">Exemplo desativado: exigir presença de idade
Usuário
- deve exigir presença de nome e email
- deve garantir tamanho de nome seja entre 3..40 caracteres
- deve garantir valores únicos para email
- deve aceitar apenas números em idade permitindo somente valores inteiros e permitindo valores nulos</div>
<p>As you have noticed everything gets translated including the class and attributes names. This happens by setting up <a id="bvhg" title="Remarkable" href="http://github.com/carlosbrando/remarkable">Remarkable</a> and Rails yml files.</p>
<h2>3. Macros</h2>
<p>In Remarkable earlier versions, we coded the matcher (validate_presence_of) but most of the time we had to do some tweaks in other to a matcher becomes a macro (should_validate_presence_of). In <a id="fc01" title="Remarkable 3.0" href="http://github.com/carlosbrando/remarkable">Remarkable 3.0</a> it happens transparently.</p>
<p>In other words, if you are using <a id="ju-8" title="Remarkable 3.0" href="http://github.com/carlosbrando/remarkable">Remarkable 3.0</a> to build your matchers you have cleaner matchers, I18n support and transparent macros creation.</p>
<h2>4. Pending and disabled macros</h2>
<p>In Remarkable 2.2, we added the ability to mark macros as disabled:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rspec">xshould_validate_uniqueness_of <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>name</span></span></pre>
<p>And it would print on your specs output:</p>
<div style="margin-left: 40px;"><span style="font-family: Courier New;">Example disabled: require unique values for name</span></div>
<p>As some people pointed out, Remarkable was still lacking support for pending macros. Pending examples in Rspec would be:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rspec"><span class="meta meta_rspec meta_rspec_example"><span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_example">it</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>should have one manager<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span></span>
pending<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>create managers resource<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="meta meta_rspec meta_rspec_example"><span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_example">it</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>should validate associated manager<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span></span>
pending<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>create managers resource<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>And now in Remarkable, you have the pending group:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rspec">pending <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>create managers resource<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> <span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby">do
</span> should_have_one <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>manager</span>
should_validate_associated <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>manager</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>In both cases a message "PENDING: create managers resources" is appended to matcher description.</p>
<h2>5. More options to matchers</h2>
<p>In Remarkable 2.2, we started to <a id="edml" title="support ALL Active Record validations with ALL options" href="../2009/02/10/remarkable-now-supports-all-activerecord-validations/">support ALL Active Record validations with ALL options</a>. And now we extended support for association matchers!</p>
<p>From only :dependent and :through as supported options, now it accepts:</p>
<div style="margin-left: 40px;">:through, :class_name, :foreign_key, :dependent, :join_table, :uniq, :readonly, :validate, :autosave, :counter_cache, :polymorphic</div>
<p>Besides matchers became much smarter. Whenever :join_table or :through is given as option, it also checks if the given table exists. Whenever :foreign_key or :counter_cache is given, it also checks if the given column exists.</p>
<h2><span style="font-family: Verdana;">6. Controllers matchers extended</span></h2>
<p>To provide I18n, we ported redirect_to and render_template matchers from rspec-rails. We also added some extra options to respond_with and render template, so you can now do:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rspec">render_template <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>edit<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>layout</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>users<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>
respond_with <span class="constant constant_numeric constant_numeric_ruby">422</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>content_type</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="support support_class support_class_ruby">Mime</span><span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby">::</span><span class="variable variable_other variable_other_constant variable_other_constant_ruby">XML</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>body</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_regexp string_regexp_classic string_regexp_classic_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby">/</span>Unprocessable Entitity<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby">/</span></span></span></pre>
<p>And the route matcher is willing to make your life twice easier. Since it tests params recognitation and routes generation at once, you can cut your routing_specs at least in a half! So the following lines:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rspec">route_for<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>controller</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>companies<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>action</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>show<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>id</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>should <span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_ruby">==</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>/companies/1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
params_from<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>get</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>/companies/1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>should <span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_ruby">==</span> <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">{</span><span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"> </span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>controller</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>companies<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>action</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>show<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>id</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">}</span></span></pre>
<p>Will become:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rspec">route<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>get</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>/companies/1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>controller</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>companies<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>action</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>show<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span>
<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>id</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
</span></pre>
<h2>7. Macro stubs</h2>
<p>There is a presentation from <a id="zdqa" title="José Valim" href="http://josevalim.blogspot.com/2009/04/my-presentation-about-remarkable-30-at.html">José Valim</a> that explains this feature with more details, but it basically makes your controllers specs from this:</p>
<br style="font-family: Courier New;" />
<pre class="textmate-source"><span class="source source_ruby source_ruby_rspec"><span class="meta meta_rspec meta_rspec_behaviour"><span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_behaviour">describe</span> <span class="variable variable_other variable_other_constant variable_other_constant_ruby">TasksController</span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span></span>
<span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">mock_task</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby">stubs<span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">{}</span></span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
<span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>task</span> <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_augmented keyword_operator_assignment_augmented_ruby">||=</span> mock_model<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="variable variable_other variable_other_constant variable_other_constant_ruby">Task</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> stubs<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="meta meta_rspec meta_rspec_behaviour"> <span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_behaviour">describe</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>responding to #POST create<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span></span>
<span class="meta meta_rspec meta_rspec_example"> <span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_example">it</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>exposes a newly created task as @task<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span></span>
<span class="support support_class support_class_ruby">Task</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>should_receive<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>new</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>with<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">{</span><span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>these<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>params<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">}</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>
and_return<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>mock_task<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>save</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="constant constant_language constant_language_ruby">true</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">))</span>
post <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>create</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>task</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">{</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>these</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>params<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">}</span>
assigns<span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby">[</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>task</span><span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby">]</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>should equal<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>mock_task<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="meta meta_rspec meta_rspec_example"> <span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_example">it</span> <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>redirects to the created task<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span></span>
<span class="support support_class support_class_ruby">Task</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>stub!<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>new</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>and_return<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>mock_task<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>save</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="constant constant_language constant_language_ruby">true</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">))</span>
post <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>create</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>task</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">{}</span>
response<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>should redirect_to<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>task_url<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>mock_task<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">))</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>Become this:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rspec"><span class="meta meta_rspec meta_rspec_behaviour"><span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_behaviour">describe</span> <span class="variable variable_other variable_other_constant variable_other_constant_ruby">TasksController</span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span></span>
mock_models <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>task</span>
<span class="meta meta_rspec meta_rspec_behaviour"> <span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_behaviour">describe</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>post</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>create</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>task</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">{</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>these</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>params<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span><span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">}</span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span></span>
expects <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>new</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>on</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="variable variable_other variable_other_constant variable_other_constant_ruby">Task</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>with</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">{</span><span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"> </span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>these</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>params<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span> <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">}</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>returns</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> mock_task
expects <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>save</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>on</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> mock_task<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>returns</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> <span class="constant constant_language constant_language_ruby">true</span>
should_assign_to <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>task</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>with</span> <span class="punctuation punctuation_separator punctuation_separator_key-value">=></span> mock_task
should_redirect_to <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">{</span><span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"> </span>task_url<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>mock_task<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span> <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">}</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>It aims to improve readability and be more DRY, since you declare your expectations/stubs just once. You can see the whole controller specs in rspec and remarkable way compared <a id="ojk7" title="here" href="http://gist.github.com/gists/94700">here</a>.</p>
<p>It works by eval'ing the expectation/stubs chain and performing the action before each macro is executed. On should_assign_to it evals using expectations (:should_receive), on should_redirect_to it uses stubs (:stub!).</p>
<p>We also want to thank <a id="o-q3" title="David Chelimsky" href="http://blog.davidchelimsky.net/">David Chelimsky</a> that gave the nice hint to allow <strong>:post => :create</strong> inside the <strong>describe</strong> method and suggested to use <a id="oi7p" title="mocha" href="http://mocha.rubyforge.org/">mocha</a> syntax. :)</p>
<h2>8. Documentation, documentation and documentation</h2>
<p>Yes, three times, because each project is very well documented. Browse them:</p>
<p>Remarkable:
<a href="http://remarkable.rubyforge.org/core/">http://remarkable.rubyforge.org/core/</a></p>
<p>Remarkable ActiveRecord:
<a href="http://remarkable.rubyforge.org/activerecord/">http://remarkable.rubyforge.org/activerecord/</a>
<a href="http://remarkable.rubyforge.org/activerecord/classes/Remarkable/ActiveRecord/Matchers.html">http://remarkable.rubyforge.org/activerecord/classes/Remarkable/ActiveRecord/Matchers.html</a> (just matchers)</p>
<p>Remarkable Rails:
<a href="http://remarkable.rubyforge.org/rails/">http://remarkable.rubyforge.org/rails/</a>
<a href="http://remarkable.rubyforge.org/rails/classes/Remarkable/ActionController/Matchers.html">http://remarkable.rubyforge.org/rails/classes/Remarkable/ActionController/Matchers.html</a> (just matchers)</p>
<h2>9. Volunteers?</h2>
<p>Last but definitely not least: we need you!</p>
<p style="text-align: center;"><img class="aligncenter" src="http://travelpod.files.wordpress.com/2009/02/446px-uncle_sam_pointing_finger.jpg" alt="http://travelpod.files.wordpress.com/2009/02/446px-uncle_sam_pointing_finger.jpg" width="198" height="267" /></p>
<p>We created a solid basis for matchers/macros creation. And we want to take it further by hosting even more matchers. So anyone who wants to work on Remarkable Datamapper, Remarkable Sequel, Remarkable Sinatra, please step in! We are waiting for you. :)</p>
<p>And all the others can equally help us by <a id="p4fn" title="joining the group" href="http://groups.google.com/group/remarkable-core">joining the group</a> and posting bugs, matchers, enhancements in <a id="f4k0" title="bug tracking system" href="http://carlosbrando.lighthouseapp.com/projects/19775-remarkable/">bug tracking system</a>.</p>
<p><a rel="bookmark" href="http://nomedojogo.com/2009/04/14/remarkable-30-is-out-and-its-well-remarkable/"></a></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Remarkable 2.3 is out!]]></title>
<link href="http://nomedojogo.com/2009/03/18/remarkable-23-is-out/"/>
<updated>2009-03-18T00:00:00-03:00</updated>
<id>http://nomedojogo.com/2009/03/18/remarkable-23-is-out</id>
<content type="html"><![CDATA[<p><a id="yjic" title="Remarkable" href="http://github.com/carlosbrando/remarkable/tree">Remarkable</a> 2.2.x series was made of frequent releases with deprecation warnings to consolidate the API. Until we get into 2.3, we improved <a id="hbpx" title="support for ActiveRecord validations" href="../2009/02/10/remarkable-now-supports-all-activerecord-validations/">support for ActiveRecord validations</a>, <a id="u.td" title="fixed some bugs" href="http://carlosbrando.lighthouseapp.com/projects/19775-remarkable/tickets?q=all">fixed some bugs</a> and <a id="uimi" title="made some changes" href="http://github.com/carlosbrando/remarkable/commits/master">made some changes</a>, so we are safe and clear to work on new features and new matchers.</p>
<p>We also run our specs suite in Rails 2.3.x and Rspec 1.2.0 to assure that everything is working as supposed, and they are. :)</p>
<p>Keep on checking, we will have <strong>very good news</strong>, very soon. So get Remarkable on <a id="gmdj" title="Github" href="http://github.com/carlosbrando/remarkable/tree/master">Github</a>, appear in the <a id="d:ml" title="mailing list" href="http://groups.google.com/group/remarkable-core">mailing list</a> and if you find some problems, tell us about them in the <a id="kud:" title="bug tracking system." href="http://carlosbrando.lighthouseapp.com/projects/19775-remarkable/tickets?q=all">bug tracking system.</a></p>
<p>Thanks for everyone who collaborated, we are getting solid as rock. :)</p>
<p><a rel="bookmark" href="http://nomedojogo.com/2009/03/18/remarkable-23-is-out/"></a></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Utilizando valores de entrada como sugestões, a maneira fácil]]></title>
<link href="http://nomedojogo.com/2009/01/23/utilizando-valores-de-entrada-como-sugestoes-a-maneira-facil/"/>
<updated>2009-01-23T00:00:00-02:00</updated>
<id>http://nomedojogo.com/2009/01/23/utilizando-valores-de-entrada-como-sugestoes-a-maneira-facil</id>
<content type="html"><![CDATA[<p><a href="http://mir.aculo.us/">Thomas Fuchs</a>, o criador do <a href="http://script.aculo.us/">script.aculo.us</a> iniciou um novo projeto esta semana chamado <a href="http://github.com/madrobby/prototype_helpers/tree/master">Prototype helpers</a>. O projeto visa disponibilizar uma série de scripts do <a href="http://www.prototypejs.org/">Prototype</a> criados por ele.</p>
<p>Eu particularmente gostei muito do <a href="http://mir.aculo.us/2009/1/7/using-input-values-as-hints-the-easy-way">defaultValueActsAsHint</a>, um script que facilita a inclusão de dicas sobre o preenchimento de um formulário dentro do próprio campo no formato de um texto mais claro. Ao se clicar no campo o texto some, mas caso o usuário não preencha o campo o texto volta a aparecer ao perder o foco.</p>
<p><img class="center" src="http://old.nomedojogo.com/wp-content/uploads/2009/01/quickentry.png"></p>
<p>Enfim, é melhor mostrar do que falar. <a href="http://old.nomedojogo.com/wp-content/uploads/2009/01/jquery_helpers/defaultValueActsAsHint/test.html">Clique aqui</a> para ver um exemplo funcionando.</p>
<p>Como não sou um usuário de Prototype, fiz questão de portar este script para um plugin do <a href="http://jquery.com/">jQuery</a>, que faço questão de disponibilizar para vocês.</p>
<p>Para usar é muito fácil, lembrando que você deve estar usando o jQuery, basta incluir o script abaixo em sua página:</p>
<pre class="textmate-source"><span class="source source_js source_js_jquery"><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="keyword keyword_operator keyword_operator_js">$</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
<span class="meta meta_function meta_function_js"><span class="support support_class support_class_js">$.fn</span>.<span class="entity entity_name entity_name_function entity_name_function_js">defaultValueActsAsHint</span> = <span class="storage storage_type storage_type_function storage_type_function_js">function</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_js">)</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
<span class="keyword keyword_control keyword_control_js">return</span> <span class="variable variable_language variable_language_js">this</span><span class="support support_function support_function_js support_function_js_jquery">.each</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
<span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.attr</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>_default<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.attr</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>value<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">))</span>
<span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.addClass</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>hint<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.bind</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>focus<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="support support_class support_class_js">event</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
<span class="keyword keyword_control keyword_control_js">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.attr</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>_default<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span> <span class="keyword keyword_operator keyword_operator_js">==</span> <span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.attr</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>value<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">))</span>
<span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.removeClass</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>hint<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.attr</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>value<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.blur</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
<span class="keyword keyword_control keyword_control_js">if</span> <span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="keyword keyword_operator keyword_operator_js">$</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>trim<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.attr</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>value<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">))</span> <span class="keyword keyword_operator keyword_operator_js">==</span> <span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span>
<span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.addClass</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>hint<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.attr</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>value<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="variable variable_language variable_language_js">this</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.attr</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>_default<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">))</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)(</span>jQuery<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
</span></pre>
<h4>Download: <a href="http://old.nomedojogo.com/wp-content/uploads/2009/01/jquery_helpers/defaultValueActsAsHint/jquery.defaultvalueactsashint.js "><span>jquery.defaultvalueactsashint.js</span></a></h4>
<p>E definir quais campos se beneficiarão deste script, assim:</p>
<pre class="textmate-source"><span class="text text_html text_html_jquery"><span class="source source_js source_js_jquery source_js_jquery_embedded source_js_jquery_embedded_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"><</span><span class="entity entity_name entity_name_tag entity_name_tag_script entity_name_tag_script_html">script</span> type="text/javascript" charset="utf-8"<span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">></span>
<span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="punctuation punctuation_definition punctuation_definition_selector punctuation_definition_selector_begin punctuation_definition_selector_begin_js">'</span><span class="meta meta_selector meta_selector_css"><span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_id entity_other_attribute-name_id_css"><span class="punctuation punctuation_definition punctuation_definition_attribute-name punctuation_definition_attribute-name_css">#</span>foo</span></span><span class="punctuation punctuation_definition punctuation_definition_selector punctuation_definition_selector_end punctuation_definition_selector_end_js">'</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>defaultValueActsAsHint<span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
<span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"></</span><span class="entity entity_name entity_name_tag entity_name_tag_script entity_name_tag_script_html">script</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html">></span></span></span></pre>
<p>Como sempre, tudo está em um projeto no <a href="http://github.com/carlosbrando/jquery_helpers/tree/master">GitHub</a>. Bom divertimento!</p>
<p><a rel="bookmark" href="http://nomedojogo.com/2009/01/23/utilizando-valores-de-entrada-como-sugestoes-a-maneira-facil/"></a></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Remarkable 2.0.1 e Atualização do (Comovente) Guia de Ruby do Why]]></title>
<link href="http://nomedojogo.com/2008/12/19/remarkable-201-e-atualizacao-do-comovente-guia-de-ruby-do-why/"/>
<updated>2008-12-19T00:00:00-02:00</updated>
<id>http://nomedojogo.com/2008/12/19/remarkable-201-e-atualizacao-do-comovente-guia-de-ruby-do-why</id>
<content type="html"><![CDATA[<p>Desde que lancei a primeira versão do <a href="http://www.nomedojogo.com/2008/11/13/shoulda-para-rspec-e-remarkable/">Remarkable</a> tenho visto cada vez mais pessoas aderindo ao projeto para criar seus testes com maior rapidez. E com uma quantidade maior de pessoas usando nas mais diversas aplicações é claro que os bugs começaram a aparecer.</p>
<p>A maior parte dos problemas ocorriam por uma falha na arquitetura inicial do Remarkable, o que tornou necessário um refactoring no projeto inteiro para estruturá-lo melhor. Na primeira versão, internamente havia uma separação muito clara entre as duas sintaxes que o projeto oferecia. Com a reestruturação não existe mais esta separação, não importa qual é o seu estilo, <a href="http://github.com/carlosbrando/remarkable/wikis/rspec-macros">RSpec</a> ou <a href="http://github.com/carlosbrando/remarkable/wikis/shoulda-macros">Shoulda</a>, internamente você sempre usará o mesmo código para realizar os testes.</p>
<p>Desta forma, acabamos por ganhar muitas macros novas.</p>
<p>Enquanto na versão em RSpec isto já era algo comum:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rspec"><span class="meta meta_rspec meta_rspec_behaviour"><span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_behaviour">describe</span> <span class="variable variable_other variable_other_constant variable_other_constant_ruby">Dog</span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span></span>
<span class="meta meta_rspec meta_rspec_pending"> <span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_pending">it</span> <span class="string string_ruby">{ should belong_to(:user) }</span></span>
<span class="meta meta_rspec meta_rspec_pending"> <span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_pending">it</span> <span class="string string_ruby">{ should_not have_many(:fleas) }</span></span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>Na sintaxe do Shoulda apenas possuíamos macros <code>should<em>[alguma coisa]</code> e quase nenhuma <code>should_not</em>[alguma coisa]</code>. Mas agora todas as macros possuem as duas opções, assim:</p>
<pre class="textmate-source"><span class="source source_ruby source_ruby_rspec"><span class="meta meta_rspec meta_rspec_behaviour"><span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_behaviour">describe</span> <span class="variable variable_other variable_other_constant variable_other_constant_ruby">Dog</span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do</span></span>
should_belong_to <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>user</span>
should_not_have_many <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>fleas</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>Além disso mais testes foram adicionados para garantir que problemas antigos não voltem para nos assombrar.</p>
<p>Para atualizar o Remarkable, execute no terminal (lembrando que no Windows não precisa usar o <code>sudo</code>):</p>
<pre class="textmate-source"><span class="text text_plain"><span class="meta meta_paragraph meta_paragraph_text">gem sources -a <span class="markup markup_underline markup_underline_link markup_underline_link_text">http://gems.github.com</span>
sudo gem install carlosbrando-remarkable</span></span></pre>
<p>Ainda falta um logo e um site para o projeto. Alguém se habilita?</p>
<h2>O (Comovente) Guia de Ruby do Why</h2>
<p>Acabei de atualizar o <a href="http://why.nomedojogo.com/">livro</a> com novas traduções e correções. Devido a minha falta de tempo, acabei demorando para aplicar alguns dos patches que me foram enviados.</p>
<p>Na maioria das vezes, os colaboradores são rápidos demais e várias pessoas corrigem o mesmo texto de formas diferentes, e isto complica um pouco na hora de aceitar uma atualização. Eu tenho de olhar arquivo por arquivo antes de decidir qual será aplicado. Mas isto é bom, porque garante uma maior qualidade à tradução, embora torne o processo um pouco mais lento.</p>
<p>O livro pode ser encontrado na url: <a href="http://why.nomedojogo.com">http://why.nomedojogo.com</a>. Também existe uma versão para impressão em <a href="http://why.nomedojogo.com/print.html">http://why.nomedojogo.com/print.html</a>.</p>
<p>A processo de tradução já foi finalizado, todo o livro já está em português. Ainda falta ajustar algumas imagens e formatações de texto, mas acredito que se conseguirmos mais colaboradores teremos o livro completo e finalizado até o fim do ano.</p>
<p>Quer ajudar? Comece lendo o <a href="http://why.nomedojogo.com/">livro</a> e quando encontrar algo errado altere <a href="http://github.com/carlosbrando/poignant-br/tree/master">aqui</a>.</p>
<p><a rel="bookmark" href="http://nomedojogo.com/2008/12/19/remarkable-201-e-atualizacao-do-comovente-guia-de-ruby-do-why/"></a></p>
]]></content>
</entry>
</feed>