tft_rails 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. data/.gitignore +6 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +8 -0
  4. data/LICENSE +57 -0
  5. data/README.md +72 -0
  6. data/Rakefile +25 -0
  7. data/lib/generators/chapter07/begin/USAGE +27 -0
  8. data/lib/generators/chapter07/begin/begin_generator.rb +32 -0
  9. data/lib/generators/chapter07/begin/instructions.md +74 -0
  10. data/lib/generators/chapter07/begin/templates/app/controllers/application_controller.rb +8 -0
  11. data/lib/generators/chapter07/begin/templates/app/controllers/pages_controller.rb +11 -0
  12. data/lib/generators/chapter07/begin/templates/app/controllers/users_controller.rb +3 -0
  13. data/lib/generators/chapter07/begin/templates/app/helpers/application_helper.rb +12 -0
  14. data/lib/generators/chapter07/begin/templates/app/helpers/pages_helper.rb +2 -0
  15. data/lib/generators/chapter07/begin/templates/app/helpers/users_helper.rb +7 -0
  16. data/lib/generators/chapter07/begin/templates/app/models/user.rb +9 -0
  17. data/lib/generators/chapter07/begin/templates/app/views/layouts/_footer.html.erb +9 -0
  18. data/lib/generators/chapter07/begin/templates/app/views/layouts/_header.html.erb +10 -0
  19. data/lib/generators/chapter07/begin/templates/app/views/layouts/_stylesheets.html.erb +7 -0
  20. data/lib/generators/chapter07/begin/templates/app/views/layouts/application.html.erb +17 -0
  21. data/lib/generators/chapter07/begin/templates/app/views/pages/about.html.erb +7 -0
  22. data/lib/generators/chapter07/begin/templates/app/views/pages/contact.html.erb +5 -0
  23. data/lib/generators/chapter07/begin/templates/app/views/pages/home.html.erb +7 -0
  24. data/lib/generators/chapter07/begin/templates/app/views/users/show.html.erb +15 -0
  25. data/lib/generators/chapter07/begin/templates/config/initializers/devise.rb +194 -0
  26. data/lib/generators/chapter07/begin/templates/config/locales/devise.en.yml +50 -0
  27. data/lib/generators/chapter07/begin/templates/config/routes.rb.tt +17 -0
  28. data/lib/generators/chapter07/begin/templates/db/migrate/20110608224650_devise_create_users.rb +29 -0
  29. data/lib/generators/chapter07/begin/templates/db/schema.rb +34 -0
  30. data/lib/generators/chapter07/begin/templates/public/images/logo.png +0 -0
  31. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/ie.css +36 -0
  32. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/buttons/icons/cross.png +0 -0
  33. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/buttons/icons/key.png +0 -0
  34. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/buttons/icons/tick.png +0 -0
  35. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/buttons/readme.txt +32 -0
  36. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/buttons/screen.css +97 -0
  37. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/fancy-type/readme.txt +14 -0
  38. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/fancy-type/screen.css +71 -0
  39. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/icons/doc.png +0 -0
  40. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/icons/email.png +0 -0
  41. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/icons/external.png +0 -0
  42. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/icons/feed.png +0 -0
  43. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/icons/im.png +0 -0
  44. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/icons/lock.png +0 -0
  45. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/icons/pdf.png +0 -0
  46. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/icons/visited.png +0 -0
  47. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/icons/xls.png +0 -0
  48. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/readme.txt +18 -0
  49. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/link-icons/screen.css +42 -0
  50. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/rtl/readme.txt +10 -0
  51. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/plugins/rtl/screen.css +110 -0
  52. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/print.css +29 -0
  53. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/screen.css +265 -0
  54. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/src/forms.css +82 -0
  55. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/src/grid.css +280 -0
  56. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/src/grid.png +0 -0
  57. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/src/ie.css +79 -0
  58. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/src/print.css +92 -0
  59. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/src/reset.css +65 -0
  60. data/lib/generators/chapter07/begin/templates/public/stylesheets/blueprint/src/typography.css +123 -0
  61. data/lib/generators/chapter07/begin/templates/public/stylesheets/custom.css +137 -0
  62. data/lib/generators/chapter07/begin/templates/spec/controllers/pages_controller_07_spec.rb +48 -0
  63. data/lib/generators/chapter07/begin/templates/spec/controllers/users_controller_07_spec.rb +38 -0
  64. data/lib/generators/chapter07/begin/templates/spec/factories.rb +7 -0
  65. data/lib/generators/chapter07/begin/templates/spec/models/user_07_spec.rb +38 -0
  66. data/lib/generators/chapter07/begin/templates/spec/requests/layout_links_07_spec.rb +44 -0
  67. data/lib/generators/chapter07/begin/templates/spec/spec_helper.rb +29 -0
  68. data/lib/generators/chapter07/solutions/USAGE +21 -0
  69. data/lib/generators/chapter07/solutions/solutions_generator.rb +23 -0
  70. data/lib/generators/chapter07/solutions/templates/app/controllers/pages_controller.rb +18 -0
  71. data/lib/generators/chapter07/solutions/templates/app/controllers/users_controller.rb +8 -0
  72. data/lib/generators/chapter07/solutions/templates/app/models/user.rb +11 -0
  73. data/lib/generators/chapter07/solutions/templates/app/views/layouts/_footer.html.erb +10 -0
  74. data/lib/generators/chapter07/solutions/templates/app/views/layouts/_header.html.erb +11 -0
  75. data/lib/generators/chapter07/solutions/templates/app/views/pages/help.html.erb +4 -0
  76. data/lib/generators/chapter07/solutions/templates/app/views/pages/home.html.erb +7 -0
  77. data/lib/generators/chapter07/solutions/templates/app/views/users/show.html.erb +15 -0
  78. data/lib/generators/chapter08_09/begin/USAGE +24 -0
  79. data/lib/generators/chapter08_09/begin/begin_generator.rb +29 -0
  80. data/lib/generators/chapter08_09/begin/instructions.md +54 -0
  81. data/lib/generators/chapter08_09/begin/snippets/custom.css +49 -0
  82. data/lib/generators/chapter08_09/begin/templates/spec/controllers/devise/registrations_controller_08_spec.rb +83 -0
  83. data/lib/generators/chapter08_09/begin/templates/spec/requests/layout_links_09_spec.rb +35 -0
  84. data/lib/generators/chapter08_09/begin/templates/spec/requests/users_signup_08_spec.rb +36 -0
  85. data/lib/generators/chapter08_09/solutions/USAGE +18 -0
  86. data/lib/generators/chapter08_09/solutions/solutions_generator.rb +12 -0
  87. data/lib/generators/chapter08_09/solutions/templates/app/helpers/application_helper.rb +16 -0
  88. data/lib/generators/chapter08_09/solutions/templates/app/views/devise/passwords/edit.html.erb +16 -0
  89. data/lib/generators/chapter08_09/solutions/templates/app/views/devise/passwords/new.html.erb +12 -0
  90. data/lib/generators/chapter08_09/solutions/templates/app/views/devise/registrations/_fields.html.erb +16 -0
  91. data/lib/generators/chapter08_09/solutions/templates/app/views/devise/registrations/edit.html.erb +28 -0
  92. data/lib/generators/chapter08_09/solutions/templates/app/views/devise/registrations/new.html.erb +13 -0
  93. data/lib/generators/chapter08_09/solutions/templates/app/views/devise/sessions/new.html.erb +17 -0
  94. data/lib/generators/chapter08_09/solutions/templates/app/views/devise/shared/_links.erb +25 -0
  95. data/lib/generators/chapter08_09/solutions/templates/app/views/layouts/_header.html.erb +19 -0
  96. data/lib/generators/chapter08_09/solutions/templates/app/views/layouts/application.html.erb +20 -0
  97. data/lib/tft_rails.rb +2 -0
  98. metadata +160 -0
@@ -0,0 +1,79 @@
1
+ /* --------------------------------------------------------------
2
+
3
+ ie.css
4
+
5
+ Contains every hack for Internet Explorer,
6
+ so that our core files stay sweet and nimble.
7
+
8
+ -------------------------------------------------------------- */
9
+
10
+ /* Make sure the layout is centered in IE5 */
11
+ body { text-align: center; }
12
+ .container { text-align: left; }
13
+
14
+ /* Fixes IE margin bugs */
15
+ * html .column, * html .span-1, * html .span-2,
16
+ * html .span-3, * html .span-4, * html .span-5,
17
+ * html .span-6, * html .span-7, * html .span-8,
18
+ * html .span-9, * html .span-10, * html .span-11,
19
+ * html .span-12, * html .span-13, * html .span-14,
20
+ * html .span-15, * html .span-16, * html .span-17,
21
+ * html .span-18, * html .span-19, * html .span-20,
22
+ * html .span-21, * html .span-22, * html .span-23,
23
+ * html .span-24 { display:inline; overflow-x: hidden; }
24
+
25
+
26
+ /* Elements
27
+ -------------------------------------------------------------- */
28
+
29
+ /* Fixes incorrect styling of legend in IE6. */
30
+ * html legend { margin:0px -8px 16px 0; padding:0; }
31
+
32
+ /* Fixes wrong line-height on sup/sub in IE. */
33
+ sup { vertical-align:text-top; }
34
+ sub { vertical-align:text-bottom; }
35
+
36
+ /* Fixes IE7 missing wrapping of code elements. */
37
+ html>body p code { *white-space: normal; }
38
+
39
+ /* IE 6&7 has problems with setting proper <hr> margins. */
40
+ hr { margin:-8px auto 11px; }
41
+
42
+ /* Explicitly set interpolation, allowing dynamically resized images to not look horrible */
43
+ img { -ms-interpolation-mode:bicubic; }
44
+
45
+ /* Clearing
46
+ -------------------------------------------------------------- */
47
+
48
+ /* Makes clearfix actually work in IE */
49
+ .clearfix, .container { display:inline-block; }
50
+ * html .clearfix,
51
+ * html .container { height:1%; }
52
+
53
+
54
+ /* Forms
55
+ -------------------------------------------------------------- */
56
+
57
+ /* Fixes padding on fieldset */
58
+ fieldset { padding-top:0; }
59
+ legend { margin-top:-0.2em; margin-bottom:1em; margin-left:-0.5em; }
60
+
61
+ /* Makes classic textareas in IE 6 resemble other browsers */
62
+ textarea { overflow:auto; }
63
+
64
+ /* Makes labels behave correctly in IE 6 and 7 */
65
+ label { vertical-align:middle; position:relative; top:-0.25em; }
66
+
67
+ /* Fixes rule that IE 6 ignores */
68
+ input.text, input.title, textarea { background-color:#fff; border:1px solid #bbb; }
69
+ input.text:focus, input.title:focus { border-color:#666; }
70
+ input.text, input.title, textarea, select { margin:0.5em 0; }
71
+ input.checkbox, input.radio { position:relative; top:.25em; }
72
+
73
+ /* Fixes alignment of inline form elements */
74
+ form.inline div, form.inline p { vertical-align:middle; }
75
+ form.inline input.checkbox, form.inline input.radio,
76
+ form.inline input.button, form.inline button {
77
+ margin:0.5em 0;
78
+ }
79
+ button, input.button { position:relative;top:0.25em; }
@@ -0,0 +1,92 @@
1
+ /* --------------------------------------------------------------
2
+
3
+ print.css
4
+ * Gives you some sensible styles for printing pages.
5
+ * See Readme file in this directory for further instructions.
6
+
7
+ Some additions you'll want to make, customized to your markup:
8
+ #header, #footer, #navigation { display:none; }
9
+
10
+ -------------------------------------------------------------- */
11
+
12
+ body {
13
+ line-height: 1.5;
14
+ font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
15
+ color:#000;
16
+ background: none;
17
+ font-size: 10pt;
18
+ }
19
+
20
+
21
+ /* Layout
22
+ -------------------------------------------------------------- */
23
+
24
+ .container {
25
+ background: none;
26
+ }
27
+
28
+ hr {
29
+ background:#ccc;
30
+ color:#ccc;
31
+ width:100%;
32
+ height:2px;
33
+ margin:2em 0;
34
+ padding:0;
35
+ border:none;
36
+ }
37
+ hr.space {
38
+ background: #fff;
39
+ color: #fff;
40
+ visibility: hidden;
41
+ }
42
+
43
+
44
+ /* Text
45
+ -------------------------------------------------------------- */
46
+
47
+ h1,h2,h3,h4,h5,h6 { font-family: "Helvetica Neue", Arial, "Lucida Grande", sans-serif; }
48
+ code { font:.9em "Courier New", Monaco, Courier, monospace; }
49
+
50
+ a img { border:none; }
51
+ p img.top { margin-top: 0; }
52
+
53
+ blockquote {
54
+ margin:1.5em;
55
+ padding:1em;
56
+ font-style:italic;
57
+ font-size:.9em;
58
+ }
59
+
60
+ .small { font-size: .9em; }
61
+ .large { font-size: 1.1em; }
62
+ .quiet { color: #999; }
63
+ .hide { display:none; }
64
+
65
+
66
+ /* Links
67
+ -------------------------------------------------------------- */
68
+
69
+ a:link, a:visited {
70
+ background: transparent;
71
+ font-weight:700;
72
+ text-decoration: underline;
73
+ }
74
+
75
+ /*
76
+ This has been the source of many questions in the past. This
77
+ snippet of CSS appends the URL of each link within the text.
78
+ The idea is that users printing your webpage will want to know
79
+ the URLs they go to. If you want to remove this functionality,
80
+ comment out this snippet and make sure to re-compress your files.
81
+ */
82
+ a:link:after, a:visited:after {
83
+ content: " (" attr(href) ")";
84
+ font-size: 90%;
85
+ }
86
+
87
+ /* If you're having trouble printing relative links, uncomment and customize this:
88
+ (note: This is valid CSS3, but it still won't go through the W3C CSS Validator) */
89
+
90
+ /* a[href^="/"]:after {
91
+ content: " (http://www.yourdomain.com" attr(href) ") ";
92
+ } */
@@ -0,0 +1,65 @@
1
+ /* --------------------------------------------------------------
2
+
3
+ reset.css
4
+ * Resets default browser CSS.
5
+
6
+ -------------------------------------------------------------- */
7
+
8
+ html {
9
+ margin:0;
10
+ padding:0;
11
+ border:0;
12
+ }
13
+
14
+ body, div, span, object, iframe,
15
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
16
+ a, abbr, acronym, address, code,
17
+ del, dfn, em, img, q, dl, dt, dd, ol, ul, li,
18
+ fieldset, form, label, legend,
19
+ table, caption, tbody, tfoot, thead, tr, th, td,
20
+ article, aside, dialog, figure, footer, header,
21
+ hgroup, nav, section {
22
+ margin: 0;
23
+ padding: 0;
24
+ border: 0;
25
+ font-size: 100%;
26
+ font: inherit;
27
+ vertical-align: baseline;
28
+ }
29
+
30
+ /* This helps to make newer HTML5 elements behave like DIVs in older browers */
31
+ article, aside, details, figcaption, figure, dialog,
32
+ footer, header, hgroup, menu, nav, section {
33
+ display:block;
34
+ }
35
+
36
+ /* Line-height should always be unitless! */
37
+ body {
38
+ line-height: 1.5;
39
+ background: white;
40
+ }
41
+
42
+ /* Tables still need 'cellspacing="0"' in the markup. */
43
+ table {
44
+ border-collapse: separate;
45
+ border-spacing: 0;
46
+ }
47
+ /* float:none prevents the span-x classes from breaking table-cell display */
48
+ caption, th, td {
49
+ text-align: left;
50
+ font-weight: normal;
51
+ float:none !important;
52
+ }
53
+ table, th, td {
54
+ vertical-align: middle;
55
+ }
56
+
57
+ /* Remove possible quote marks (") from <q>, <blockquote>. */
58
+ blockquote:before, blockquote:after, q:before, q:after { content: ''; }
59
+ blockquote, q { quotes: "" ""; }
60
+
61
+ /* Remove annoying border on linked images. */
62
+ a img { border: none; }
63
+
64
+ /* Remember to define your own focus styles! */
65
+ :focus { outline: 0; }
@@ -0,0 +1,123 @@
1
+ /* --------------------------------------------------------------
2
+
3
+ typography.css
4
+ * Sets up some sensible default typography.
5
+
6
+ -------------------------------------------------------------- */
7
+
8
+ /* Default font settings.
9
+ The font-size percentage is of 16px. (0.75 * 16px = 12px) */
10
+ html { font-size:100.01%; }
11
+ body {
12
+ font-size: 75%;
13
+ color: #222;
14
+ background: #fff;
15
+ font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
16
+ }
17
+
18
+
19
+ /* Headings
20
+ -------------------------------------------------------------- */
21
+
22
+ h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111; }
23
+
24
+ h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; }
25
+ h2 { font-size: 2em; margin-bottom: 0.75em; }
26
+ h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; }
27
+ h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
28
+ h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; }
29
+ h6 { font-size: 1em; font-weight: bold; }
30
+
31
+ h1 img, h2 img, h3 img,
32
+ h4 img, h5 img, h6 img {
33
+ margin: 0;
34
+ }
35
+
36
+
37
+ /* Text elements
38
+ -------------------------------------------------------------- */
39
+
40
+ p { margin: 0 0 1.5em; }
41
+ /*
42
+ These can be used to pull an image at the start of a paragraph, so
43
+ that the text flows around it (usage: <p><img class="left">Text</p>)
44
+ */
45
+ .left { float: left !important; }
46
+ p .left { margin: 1.5em 1.5em 1.5em 0; padding: 0; }
47
+ .right { float: right !important; }
48
+ p .right { margin: 1.5em 0 1.5em 1.5em; padding: 0; }
49
+
50
+ a:focus,
51
+ a:hover { color: #09f; }
52
+ a { color: #06c; text-decoration: underline; }
53
+
54
+ blockquote { margin: 1.5em; color: #666; font-style: italic; }
55
+ strong,dfn { font-weight: bold; }
56
+ em,dfn { font-style: italic; }
57
+ sup, sub { line-height: 0; }
58
+
59
+ abbr,
60
+ acronym { border-bottom: 1px dotted #666; }
61
+ address { margin: 0 0 1.5em; font-style: italic; }
62
+ del { color:#666; }
63
+
64
+ pre { margin: 1.5em 0; white-space: pre; }
65
+ pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; }
66
+
67
+
68
+ /* Lists
69
+ -------------------------------------------------------------- */
70
+
71
+ li ul,
72
+ li ol { margin: 0; }
73
+ ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 1.5em; }
74
+
75
+ ul { list-style-type: disc; }
76
+ ol { list-style-type: decimal; }
77
+
78
+ dl { margin: 0 0 1.5em 0; }
79
+ dl dt { font-weight: bold; }
80
+ dd { margin-left: 1.5em;}
81
+
82
+
83
+ /* Tables
84
+ -------------------------------------------------------------- */
85
+
86
+ /*
87
+ Because of the need for padding on TH and TD, the vertical rhythm
88
+ on table cells has to be 27px, instead of the standard 18px or 36px
89
+ of other elements.
90
+ */
91
+ table { margin-bottom: 1.4em; width:100%; }
92
+ th { font-weight: bold; }
93
+ thead th { background: #c3d9ff; }
94
+ th,td,caption { padding: 4px 10px 4px 5px; }
95
+ /*
96
+ You can zebra-stripe your tables in outdated browsers by adding
97
+ the class "even" to every other table row.
98
+ */
99
+ tbody tr:nth-child(even) td,
100
+ tbody tr.even td {
101
+ background: #e5ecf9;
102
+ }
103
+ tfoot { font-style: italic; }
104
+ caption { background: #eee; }
105
+
106
+
107
+ /* Misc classes
108
+ -------------------------------------------------------------- */
109
+
110
+ .small { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; }
111
+ .large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
112
+ .hide { display: none; }
113
+
114
+ .quiet { color: #666; }
115
+ .loud { color: #000; }
116
+ .highlight { background:#ff0; }
117
+ .added { background:#060; color: #fff; }
118
+ .removed { background:#900; color: #fff; }
119
+
120
+ .first { margin-left:0; padding-left:0; }
121
+ .last { margin-right:0; padding-right:0; }
122
+ .top { margin-top:0; padding-top:0; }
123
+ .bottom { margin-bottom:0; padding-bottom:0; }
@@ -0,0 +1,137 @@
1
+ .container {
2
+ width: 710px;
3
+ }
4
+
5
+ body {
6
+ background: #cff;
7
+ }
8
+
9
+ header {
10
+ padding-top: 20px;
11
+ }
12
+
13
+ header img {
14
+ padding: 1em;
15
+ background: #fff;
16
+ }
17
+
18
+ section {
19
+ margin-top: 1em;
20
+ font-size: 120%;
21
+ padding: 20px;
22
+ background: #fff;
23
+ }
24
+
25
+ section h1 {
26
+ font-size: 200%;
27
+ }
28
+
29
+ /* Links */
30
+
31
+ a {
32
+ color: #09c;
33
+ text-decoration: none;
34
+ }
35
+
36
+ a:hover {
37
+ color: #069;
38
+ text-decoration: underline;
39
+ }
40
+
41
+ a:visited {
42
+ color: #069;
43
+ }
44
+
45
+ /* Navigation */
46
+
47
+ nav {
48
+ float: right;
49
+ }
50
+
51
+ nav {
52
+ background-color: white;
53
+ padding: 0 0.7em;
54
+ white-space: nowrap;
55
+ }
56
+
57
+ nav ul {
58
+ margin: 0;
59
+ padding: 0;
60
+ }
61
+
62
+ nav ul li {
63
+ list-style-type: none;
64
+ display: inline-block;
65
+ padding: 0.2em 0;
66
+ }
67
+
68
+ nav ul li a {
69
+ padding: 0 5px;
70
+ font-weight: bold;
71
+ }
72
+
73
+ nav ul li a:visited {
74
+ color: #09c;
75
+ }
76
+
77
+ nav ul li a:hover {
78
+ text-decoration: underline;
79
+ }
80
+
81
+ /* Sign up button */
82
+
83
+ a.signup_button {
84
+ margin-left: auto;
85
+ margin-right: auto;
86
+ display: block;
87
+ text-align: center;
88
+ width: 190px;
89
+ color: #fff;
90
+ background: #006400;
91
+ font-size: 150%;
92
+ font-weight: bold;
93
+ padding: 20px;
94
+ }
95
+
96
+ /* Round corners */
97
+
98
+ .round {
99
+ -moz-border-radius: 10px;
100
+ -webkit-border-radius: 10px;
101
+ border-radius: 10px;
102
+ }
103
+
104
+ footer {
105
+ text-align: center;
106
+ margin-top: 10px;
107
+ width: 710px;
108
+ margin-left: auto;
109
+ margin-right: auto;
110
+ }
111
+
112
+ footer nav {
113
+ float: none;
114
+ }
115
+
116
+ /* User show page */
117
+ table.profile {
118
+ width: 100%;
119
+ margin-bottom: 0;
120
+ }
121
+
122
+ td.main {
123
+ width: 70%;
124
+ padding: 1em;
125
+ }
126
+
127
+ td.sidebar {
128
+ width: 30%;
129
+ padding: 1em;
130
+ vertical-align: top;
131
+ background: #ffc;
132
+ }
133
+
134
+ .profile img.gravatar {
135
+ border: 1px solid #999;
136
+ margin-bottom: -15px;
137
+ }
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe PagesController do
4
+ render_views
5
+
6
+ before(:each) do
7
+ @base_title = 'Ruby on Rails Tutorial Sample App'
8
+ end
9
+
10
+ describe "GET 'home'" do
11
+ it "should be successful" do
12
+ get 'home'
13
+ response.should be_success
14
+ end
15
+
16
+ it "should have the right title" do
17
+ get 'home'
18
+ response.should have_selector("title",
19
+ :content => @base_title + " | Home")
20
+ end
21
+ end
22
+
23
+ describe "GET 'contact'" do
24
+ it "should be successful" do
25
+ get 'contact'
26
+ response.should be_success
27
+ end
28
+
29
+ it "should have the right title" do
30
+ get 'contact'
31
+ response.should have_selector("title",
32
+ :content => @base_title + " | Contact")
33
+ end
34
+ end
35
+
36
+ describe "GET 'about'" do
37
+ it "should be successful" do
38
+ get 'about'
39
+ response.should be_success
40
+ end
41
+
42
+ it "should have the right title" do
43
+ get 'about'
44
+ response.should have_selector("title",
45
+ :content => @base_title + " | About")
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe UsersController do
4
+ render_views
5
+
6
+ describe "GET 'show'" do
7
+
8
+ before(:each) do
9
+ @user = Factory(:user)
10
+ end
11
+
12
+ it "should be successful" do
13
+ get :show, :id => @user
14
+ response.should be_success
15
+ end
16
+
17
+ it "should find the right user" do
18
+ get :show, :id => @user
19
+ assigns(:user).should == @user
20
+ end
21
+
22
+ it "should have the right title" do
23
+ get :show, :id => @user
24
+ response.should have_selector("title", :content => @user.name)
25
+ end
26
+
27
+ it "should include the user's name" do
28
+ get :show, :id => @user
29
+ response.should have_selector("h1", :content => @user.name)
30
+ end
31
+
32
+ it "should have a profile image" do
33
+ get :show, :id => @user
34
+ response.should have_selector("h1>img", :class => "gravatar")
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,7 @@
1
+ # By using the symbol ':user', we get Factory Girl to simulate the User model.
2
+ Factory.define :user do |user|
3
+ user.name "Michael Hartl"
4
+ user.email "mhartl@example.com"
5
+ user.password "foobar"
6
+ user.password_confirmation "foobar"
7
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe User do
4
+
5
+ it "has a name method" do
6
+ # Note: Ruby has a way to ask a class if it has a certain method defined,
7
+ # like User.respond_to?(:name) returns true or false depending on whether the
8
+ # class has a method called "name" defined on it
9
+ # RSpec's way of asserting this is with "should respond_to(:method_name)"
10
+
11
+ # Question: How does ActiveRecord know there is a name method? There is no such
12
+ # method explicitly defined in the class (user.rb)
13
+ User.should respond_to(:name)
14
+ end
15
+
16
+ it "can set and read back name" do
17
+ u = User.new
18
+ u.name = 'Joe Smith'
19
+ u.name.should == 'Joe Smith'
20
+ end
21
+
22
+ it "requires a name" do
23
+ no_name_user = User.new # Note: no attributes set at all, i.e. name is nil
24
+ # Note: the errors array on a model object is populated when valid? is called
25
+ # RSpec's be_valid is a fancy way of saying valid?.should == true
26
+ # This will call valid, and populate the error array, so we can check
27
+ # what failure occurred
28
+ no_name_user.should_not be_valid
29
+ no_name_user.errors[:name].should == ["can't be blank"]
30
+ end
31
+
32
+ it "rejects names that are too long" do
33
+ long_name_user = User.new(:name => 'a' * 51)
34
+ long_name_user.should_not be_valid
35
+ long_name_user.errors[:name].should == ["is too long (maximum is 50 characters)"]
36
+ end
37
+
38
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe "LayoutLinks" do
4
+
5
+ it "should have a Home page at '/'" do
6
+ get '/'
7
+ response.should have_selector('title', :content => "Home")
8
+ end
9
+
10
+ it "should have a Contact page at '/contact'" do
11
+ get '/contact'
12
+ response.should have_selector('title', :content => "Contact")
13
+ end
14
+
15
+ it "should have an About page at '/about'" do
16
+ get '/about'
17
+ response.should have_selector('title', :content => "About")
18
+ end
19
+
20
+ it "should have a Help page at '/help'" do
21
+ get '/help'
22
+ response.should have_selector('title', :content => "Help")
23
+ end
24
+
25
+ it "should have a signup page at '/signup'" do
26
+ get '/signup'
27
+ response.should be_success
28
+ end
29
+
30
+ it "should have the right links on the layout" do
31
+ visit root_path
32
+ click_link "About"
33
+ response.should have_selector('title', :content => "About")
34
+ click_link "Help"
35
+ response.should have_selector('title', :content => "Help")
36
+ click_link "Contact"
37
+ response.should have_selector('title', :content => "Contact")
38
+ click_link "Home"
39
+ response.should have_selector('title', :content => "Home")
40
+ click_link "Sign up now!"
41
+ response.should be_success
42
+ end
43
+
44
+ end
@@ -0,0 +1,29 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV["RAILS_ENV"] ||= 'test'
3
+ require File.expand_path("../../config/environment", __FILE__)
4
+ require 'rspec/rails'
5
+
6
+ # Requires supporting ruby files with custom matchers and macros, etc,
7
+ # in spec/support/ and its subdirectories.
8
+ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+ # == Mock Framework
12
+ #
13
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
14
+ #
15
+ # config.mock_with :mocha
16
+ # config.mock_with :flexmock
17
+ # config.mock_with :rr
18
+ config.mock_with :rspec
19
+
20
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
21
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
22
+
23
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
24
+ # examples within a transaction, remove the following line or assign false
25
+ # instead of true.
26
+ config.use_transactional_fixtures = true
27
+
28
+ config.include Devise::TestHelpers, :type => :controller
29
+ end