aura 0.0.1.pre10

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 (249) hide show
  1. data/.gitignore +6 -0
  2. data/.travis.yml +3 -0
  3. data/Gemfile +2 -0
  4. data/HISTORY.md +95 -0
  5. data/README.md +53 -0
  6. data/Rakefile +27 -0
  7. data/Scribefile +8 -0
  8. data/app/css/_utilities.scss +88 -0
  9. data/app/css/admin.scss +21 -0
  10. data/app/css/admin/_settings.scss +136 -0
  11. data/app/css/admin/chrome.scss +208 -0
  12. data/app/css/admin/common.scss +78 -0
  13. data/app/css/admin/forms.scss +342 -0
  14. data/app/css/admin/jquery_wysiwyg.scss +96 -0
  15. data/app/css/admin/loading.scss +18 -0
  16. data/app/css/admin/meta.scss +42 -0
  17. data/app/css/admin/reset.scss +46 -0
  18. data/app/css/admin/sections.scss +79 -0
  19. data/app/css/admin/setup.scss +22 -0
  20. data/app/css/admin/sidebar.scss +136 -0
  21. data/app/css/admin/slug.scss +78 -0
  22. data/app/css/admin/uiscreen.scss +22 -0
  23. data/app/css/admin/wysiwyg_field.scss +11 -0
  24. data/app/css/admin_watermark.scss +23 -0
  25. data/app/css/default_home_page.scss +13 -0
  26. data/app/css/login.scss +47 -0
  27. data/app/helpers/admin_helpers.rb +59 -0
  28. data/app/helpers/flash_helpers.rb +86 -0
  29. data/app/helpers/form_builder_helpers.rb +9 -0
  30. data/app/helpers/html_helpers.rb +27 -0
  31. data/app/helpers/jquery_helpers.rb +26 -0
  32. data/app/helpers/main_helpers.rb +67 -0
  33. data/app/helpers/page_helpers.rb +92 -0
  34. data/app/helpers/template_helpers.rb +94 -0
  35. data/app/helpers/user_helpers.rb +45 -0
  36. data/app/init/admin.rb +34 -0
  37. data/app/init/extensions.rb +18 -0
  38. data/app/init/pistol.rb +11 -0
  39. data/app/init/sequel.rb +11 -0
  40. data/app/main.rb +106 -0
  41. data/app/migrations/page.rb +29 -0
  42. data/app/migrations/settings.rb +11 -0
  43. data/app/migrations/user.rb +13 -0
  44. data/app/models/page.rb +116 -0
  45. data/app/models/page_seed.rb +47 -0
  46. data/app/models/settings.rb +59 -0
  47. data/app/models/user.rb +60 -0
  48. data/app/routes/admin.rb +44 -0
  49. data/app/routes/css_js.rb +53 -0
  50. data/app/routes/design_tests.rb +15 -0
  51. data/app/routes/editor.rb +152 -0
  52. data/app/routes/site.rb +33 -0
  53. data/app/routes/user.rb +48 -0
  54. data/app/views/admin/_back_to_dashboard.haml +3 -0
  55. data/app/views/admin/dashboard.haml +46 -0
  56. data/app/views/admin/layout.haml +73 -0
  57. data/app/views/admin/settings.haml +40 -0
  58. data/app/views/admin/settings/database.haml +42 -0
  59. data/app/views/base/crumbs.haml +50 -0
  60. data/app/views/base/delete.haml +19 -0
  61. data/app/views/base/edit.haml +61 -0
  62. data/app/views/base/errors.haml +10 -0
  63. data/app/views/base/form.haml +11 -0
  64. data/app/views/base/list.haml +14 -0
  65. data/app/views/base/list_actions.haml +4 -0
  66. data/app/views/base/list_item.haml +7 -0
  67. data/app/views/base/nav.haml +36 -0
  68. data/app/views/base/new.haml +36 -0
  69. data/app/views/base/preview.haml +28 -0
  70. data/app/views/base/tabs.haml +12 -0
  71. data/app/views/default_home_page.haml +15 -0
  72. data/app/views/design_tests/admin_styles.haml +58 -0
  73. data/app/views/form_builder/builder.haml +29 -0
  74. data/app/views/page/edit.haml +29 -0
  75. data/app/views/page/form.haml +22 -0
  76. data/app/views/page/meta_form.haml +22 -0
  77. data/app/views/page/new.haml +26 -0
  78. data/app/views/user/edit.haml +52 -0
  79. data/app/views/user/form.haml +43 -0
  80. data/app/views/user/list.haml +11 -0
  81. data/app/views/user/login.haml +33 -0
  82. data/app/views/user/new.haml +25 -0
  83. data/app/views/user/welcome.haml +29 -0
  84. data/app/views/watermark/watermark.haml +16 -0
  85. data/aura.gemspec +36 -0
  86. data/bin/aura +8 -0
  87. data/config/database.rb +12 -0
  88. data/config/extensions.rb +5 -0
  89. data/config/scss.rb +14 -0
  90. data/config/user.rb +10 -0
  91. data/default/.gitignore +6 -0
  92. data/default/Gemfile +11 -0
  93. data/default/README.md +24 -0
  94. data/default/Rakefile +8 -0
  95. data/default/app/README +3 -0
  96. data/default/app/css/.gitignore +0 -0
  97. data/default/app/helpers/helpers.rb.example +9 -0
  98. data/default/app/js/.gitignore +0 -0
  99. data/default/app/migrations/model.rb.example +20 -0
  100. data/default/app/models/model.rb.example +11 -0
  101. data/default/app/models/page-ext.rb.example +17 -0
  102. data/default/app/routes/site.rb.example +5 -0
  103. data/default/app/views/hello.haml.example +1 -0
  104. data/default/config.ru +3 -0
  105. data/default/config/.gitignore +0 -0
  106. data/default/config/database.rb.example +30 -0
  107. data/default/config/extensions.rb +5 -0
  108. data/default/config/user.rb.example +10 -0
  109. data/default/db/.gitignore +0 -0
  110. data/default/init.rb +15 -0
  111. data/default/public/.gitignore +0 -0
  112. data/extensions/contact_form/migrations/contact_form.rb +13 -0
  113. data/extensions/contact_form/models/contact_form.rb +13 -0
  114. data/extensions/contact_form/routes/contact_form.rb +11 -0
  115. data/extensions/contact_form/views/contact_form/edit.haml +8 -0
  116. data/extensions/contact_form/views/contact_form/form.haml +3 -0
  117. data/extensions/contact_form/views/contact_form/nav.haml +42 -0
  118. data/extensions/contact_form/views/contact_form/responses.haml +20 -0
  119. data/extensions/contact_form/views/contact_form/tabs.haml +8 -0
  120. data/extensions/default_theme/css/theme/_settings.scss +3 -0
  121. data/extensions/default_theme/css/theme/chrome.scss +66 -0
  122. data/extensions/default_theme/css/theme/reset.scss +34 -0
  123. data/extensions/default_theme/css/theme/style.scss +3 -0
  124. data/extensions/default_theme/info.yml +2 -0
  125. data/extensions/default_theme/public/browse.png +0 -0
  126. data/extensions/default_theme/views/base/id_portfolio.haml +32 -0
  127. data/extensions/default_theme/views/base/show.haml +31 -0
  128. data/extensions/default_theme/views/errors/error.haml +9 -0
  129. data/extensions/default_theme/views/errors/not_found.haml +11 -0
  130. data/extensions/default_theme/views/layout.haml +33 -0
  131. data/lib/aura.rb +315 -0
  132. data/lib/aura/admin.rb +41 -0
  133. data/lib/aura/app.rb +4 -0
  134. data/lib/aura/cli.rb +19 -0
  135. data/lib/aura/cli/base.rb +89 -0
  136. data/lib/aura/cli/helpers.rb +32 -0
  137. data/lib/aura/editor.rb +30 -0
  138. data/lib/aura/extension.rb +189 -0
  139. data/lib/aura/files.rb +38 -0
  140. data/lib/aura/menu.rb +142 -0
  141. data/lib/aura/models.rb +80 -0
  142. data/lib/aura/public.rb +68 -0
  143. data/lib/aura/rendering.rb +134 -0
  144. data/lib/aura/seeder.rb +38 -0
  145. data/lib/aura/slugs.rb +87 -0
  146. data/lib/aura/subtype.rb +48 -0
  147. data/lib/aura/tasks.rb +24 -0
  148. data/lib/aura/tasks/common.rb +17 -0
  149. data/lib/aura/tasks/db.rake +54 -0
  150. data/lib/aura/utils.rb +81 -0
  151. data/lib/aura/version.rb +25 -0
  152. data/lib/core/hasharray.rb +65 -0
  153. data/lib/core/object_ext.rb +9 -0
  154. data/lib/sequel/plugins/aura_custom.rb +16 -0
  155. data/lib/sequel/plugins/aura_editable.rb +39 -0
  156. data/lib/sequel/plugins/aura_hierarchy.rb +82 -0
  157. data/lib/sequel/plugins/aura_model.rb +271 -0
  158. data/lib/sequel/plugins/aura_renderable.rb +42 -0
  159. data/lib/sequel/plugins/aura_sluggable.rb +103 -0
  160. data/lib/sequel/plugins/aura_subtyped.rb +83 -0
  161. data/lib/terra.rb +185 -0
  162. data/lib/terra/ext.rb +16 -0
  163. data/lib/terra/field.rb +98 -0
  164. data/lib/terra/fields.rb +122 -0
  165. data/lib/terra/fieldset.rb +93 -0
  166. data/lib/terra/form.rb +111 -0
  167. data/manual/configuration.md +42 -0
  168. data/manual/extensions.md +45 -0
  169. data/manual/files.md +70 -0
  170. data/manual/helpers.md +39 -0
  171. data/manual/index.md +65 -0
  172. data/manual/models.md +58 -0
  173. data/manual/recipes.md +38 -0
  174. data/manual/recipes/bundling_sample_data.md +30 -0
  175. data/manual/recipes/creating_themes.md +10 -0
  176. data/manual/recipes/using_markdown_or_textile.md +24 -0
  177. data/manual/routes.md +39 -0
  178. data/manual/theming.md +55 -0
  179. data/manual/views.md +128 -0
  180. data/public/hi.html +0 -0
  181. data/public/images/admin/back.png +0 -0
  182. data/public/images/admin/browse.png +0 -0
  183. data/public/images/admin/mock-bg.png +0 -0
  184. data/public/images/admin/top-loader.gif +0 -0
  185. data/public/images/admin/uiscreen-loader.gif +0 -0
  186. data/public/images/admin_icons/add.png +0 -0
  187. data/public/images/admin_icons/contact.png +0 -0
  188. data/public/images/admin_icons/dashboard.png +0 -0
  189. data/public/images/admin_icons/generic.png +0 -0
  190. data/public/images/admin_icons/home-12.png +0 -0
  191. data/public/images/admin_icons/page.png +0 -0
  192. data/public/images/admin_icons/settings.png +0 -0
  193. data/public/images/jquery.wysiwyg.gif +0 -0
  194. data/public/js/admin.form_builder.js +15 -0
  195. data/public/js/admin.js +62 -0
  196. data/public/js/admin.layout.js +53 -0
  197. data/public/js/admin.nav.js +241 -0
  198. data/public/js/admin.slug.js +46 -0
  199. data/public/js/admin.subpage.js +15 -0
  200. data/public/js/jquery.hashlisten.js +85 -0
  201. data/public/js/jquery.js +166 -0
  202. data/public/js/jquery.livenavigate.js +58 -0
  203. data/public/js/jquery.livequery.js +226 -0
  204. data/public/js/jquery.quickvalidate.js +164 -0
  205. data/public/js/jquery.tmpl.js +486 -0
  206. data/public/js/jquery.uiscreen.js +150 -0
  207. data/public/js/jquery.wysiwyg.js +2339 -0
  208. data/public/js/jqueryui.js +766 -0
  209. data/public/js/lib.dirty.js +11 -0
  210. data/public/js/lib.loading.js +23 -0
  211. data/public/js/lib.wysiwyg.js +155 -0
  212. data/public/js/underscore-1.1.7.js +27 -0
  213. data/test/app/app/css/test_raw.css +1 -0
  214. data/test/app/app/css/test_sass.sass +3 -0
  215. data/test/app/app/damogram.txt +1 -0
  216. data/test/app/app/js/test_coffee.coffee +4 -0
  217. data/test/app/app/js/test_javascript.js +4 -0
  218. data/test/app/init.rb +5 -0
  219. data/test/stories/admin_css_story.rb +18 -0
  220. data/test/stories/css_js_story.rb +29 -0
  221. data/test/stories/first_login_story.rb +29 -0
  222. data/test/stories/visit_story.rb +39 -0
  223. data/test/stories_helper.rb +58 -0
  224. data/test/test_cli_helper.rb +31 -0
  225. data/test/test_helper.rb +111 -0
  226. data/test/test_temp_helper.rb +9 -0
  227. data/test/unit/cli_test.rb +38 -0
  228. data/test/unit/dump_test.rb +14 -0
  229. data/test/unit/extensions_test.rb +18 -0
  230. data/test/unit/files_test.rb +14 -0
  231. data/test/unit/flash_helper_test.rb +36 -0
  232. data/test/unit/html_helper_test.rb +29 -0
  233. data/test/unit/jquery_helper_test.rb +18 -0
  234. data/test/unit/model_test.rb +34 -0
  235. data/test/unit/page_helpers_test.rb +36 -0
  236. data/test/unit/seeder_test.rb +15 -0
  237. data/test/unit/settings_test.rb +29 -0
  238. data/test/unit/slug_test.rb +39 -0
  239. data/test/unit/ss_migration_test.rb +14 -0
  240. data/test/unit/terra_test.rb +125 -0
  241. data/test/unit/utils_test.rb +11 -0
  242. data/vendor/sinatra-sequel/.gitignore +3 -0
  243. data/vendor/sinatra-sequel/COPYING +18 -0
  244. data/vendor/sinatra-sequel/README.md +84 -0
  245. data/vendor/sinatra-sequel/Rakefile +67 -0
  246. data/vendor/sinatra-sequel/lib/sinatra/sequel.rb +73 -0
  247. data/vendor/sinatra-sequel/sinatra-sequel.gemspec +39 -0
  248. data/vendor/sinatra-sequel/spec/spec_sinatra_sequel.rb +70 -0
  249. metadata +536 -0
@@ -0,0 +1,42 @@
1
+ -# Either parent or model will be given
2
+ - parent ||= nil
3
+ - model ||= nil
4
+ - items ||= nil
5
+
6
+ -# If home page
7
+ - unless items.nil?
8
+ %nav
9
+ %h3
10
+ %ul
11
+ - model.all.each do |item|
12
+ %li.browse
13
+ != link_to item.path(:responses) do
14
+ != admin_icon 'contact'
15
+ = item.to_s
16
+
17
+ %li.add
18
+ != link_to model.path(:new) do
19
+ != admin_icon('add')
20
+ = "New #{model.title.downcase}"
21
+
22
+ - else
23
+
24
+ != admin_back_to_dashboard
25
+
26
+ %nav.crumbs
27
+ != link_to parent.path(:responses) do
28
+ != admin_icon 'contact'
29
+ = parent.to_s
30
+
31
+ %nav
32
+ %ul
33
+ %li
34
+ != link_to parent.path(:edit) do
35
+ != admin_icon 'generic'
36
+ = "Options"
37
+
38
+ %nav
39
+ %h3 Recent responses
40
+ %ul
41
+ %li.blank
42
+ No responses yet.
@@ -0,0 +1,20 @@
1
+ -# Inherit
2
+ != partial :'base/edit', :item => item, :action => ''
3
+
4
+ - title "%s - Responses" % [ item.to_s ]
5
+
6
+ - content_for! :nav do
7
+ != partial item, :nav, :parent => item, :model => item.class
8
+
9
+ - content_for! :title do
10
+ %h1
11
+ = item.to_s
12
+ %em Responses
13
+
14
+ - content_for! :toolbar do
15
+ != ""
16
+
17
+ - content_for! :body do
18
+ .fixed
19
+ %div.dialog
20
+ There are no responses yet.
@@ -0,0 +1,8 @@
1
+ - unless item.nil?
2
+ %ul
3
+ %li
4
+ != link_to item.path(:responses), "Responses"
5
+ %li
6
+ != link_to item.path(:edit), "Options"
7
+ %li
8
+ != link_to item.path(:preview), "Preview"
@@ -0,0 +1,3 @@
1
+ @import "compass/css3";
2
+ @import "utilities";
3
+
@@ -0,0 +1,66 @@
1
+ body { background: #7bd * 0.8; color: #eee; text-shadow: 1px 1px 0 $shadow10; }
2
+
3
+ #top,
4
+ #content { width: 760px; margin: 0 auto; }
5
+
6
+ #top {
7
+ border-bottom: solid 1px $hilite20; padding: 20px 0 10px 0; overflow: hidden;
8
+
9
+ h3 { margin: 0; padding: 0; float: left; }
10
+ h3 strong { display: block; color: #d8a; text-shadow: 1px 1px 0 $hilite20; }
11
+ h3 small { font-weight: normal; display: block; color: #cde; font-size: 8pt; }
12
+
13
+ nav {
14
+ float: right; margin-top: 10px;
15
+ ul { @include horiz-list; }
16
+ a {
17
+ display: block; margin-left: 12px; color: #adf * 1.2; padding: 1px 8px;
18
+ background: $hilite10;
19
+ @include border-radius(4px); @include shadow(1px 1px 0 $shadow10);
20
+ }
21
+ li.active a,
22
+ a:hover { background: #ddd; color: #333; text-shadow: 1px 1px 0 $shadow20; text-decoration: none; }
23
+ li a:hover { background: #eee; }
24
+ }
25
+ }
26
+
27
+ #content {
28
+ @include clearfix;
29
+
30
+ p { border-top: solid 1px $hilite20; padding-top: 10px; }
31
+ .back { width: 15%; float: left; }
32
+ .body { width: 50%; float: left; }
33
+ .nav { width: 30%; float: right; }
34
+ h1 { font-size: 23pt; margin: 50px 0 10px 0; }
35
+ h1.level-1 { font-size: 40pt; margin: 100px 0 30px 0; }
36
+ }
37
+
38
+ #content .back {
39
+ border-top: solid 1px $hilite20;
40
+ padding: 10px 0;
41
+ margin-top: 12px;
42
+ margin-right: 15px;
43
+
44
+ a {
45
+ color: #adf * 1.2; font-weight: normal;
46
+ span { display: block; font-size: 2em; margin: -3px 0 5px 0; }
47
+ &:hover { text-decoration: none; }
48
+ }
49
+ }
50
+
51
+ #content .crumbs {
52
+ border-bottom: solid 1px $hilite20;
53
+
54
+ ul { @include horiz-list; }
55
+ ul li:after { content: ' > '; float: left; display: block; padding: 10px 0; color: #7bd; }
56
+ a { padding: 10px; display: block; color: #adf * 1.2; float: left; font-weight: normal; }
57
+ ul li:first-child a { padding-left: 0; }
58
+ ul li:last-child:after { content: ''; }
59
+ ul li.active a { color: white; font-weight: bold; }
60
+ }
61
+
62
+ #content .nav {
63
+ ul { @include non-list; margin-top: 12px; }
64
+ a { border-top: solid 1px $hilite20; padding: 10px 0; color: #adf * 1.2; display: block; text-align: left; }
65
+ }
66
+
@@ -0,0 +1,34 @@
1
+ /* Reset */
2
+ div, dl, dt, dd, ul, ol, li, form, fieldset, input, blockquote, th, td, legend { margin: 0; padding: 0; }
3
+
4
+ #content {
5
+ pre, p, blockquote,
6
+ h1, h2, h3, h4, h5, h6 { margin: 1em 0 1em 0; }
7
+ blockquote { border-left: solid 2px #ccc; padding: 0 1em; margin-left: 0.2em; color: #888; }
8
+ h1 { font-size: 1.4em; }
9
+ h2 { font-size: 1.3em; }
10
+ h3 { font-size: 1.2em; }
11
+ h4 { font-size: 1.1em; }
12
+ h5 { font-size: 0.9em; }
13
+ h6 { font-size: 0.9em; }
14
+ ol, ul { margin-left: 2em; }
15
+ }
16
+
17
+ /* Body & wrapper */
18
+ html, body { margin: 0; padding: 0; }
19
+ body, td, input, textarea { font-family: arial, helvetica, sans-serif; font-size: 1em; }
20
+ body { font-size: 0.75em; line-height: 1.5; background: white; color: #333; }
21
+ #all { margin: 0 auto; width: auto; position: relative; }
22
+
23
+ input, textarea { line-height: 1.4; }
24
+
25
+ /* Links */
26
+ a { color: #379; text-decoration: none; font-weight: bold; padding: 1px; }
27
+ a:visited { color: #379; }
28
+ a:hover { color: #379; text-decoration: underline; }
29
+ a img { border: 0; }
30
+
31
+ button { cursor: pointer; }
32
+
33
+ /* HTML5 */
34
+ header, footer, aside, section, article, nav { display: block; }
@@ -0,0 +1,3 @@
1
+ @import "theme/settings";
2
+ @import "theme/reset";
3
+ @import "theme/chrome";
@@ -0,0 +1,2 @@
1
+ name: Default theme
2
+ author: Aura team
@@ -0,0 +1,32 @@
1
+ - layout 'layout'
2
+ - title item.to_s
3
+
4
+ #content
5
+ .crumbs
6
+ %ul
7
+ %li
8
+ %a{:href => '/'}!= "♥"
9
+ - item.crumbs.each do |p|
10
+ %li{:class => ('active' if @item == p)}
11
+ %a{:href => p.path}= p
12
+
13
+ %h1{:class => 'level-3' }
14
+ Porfolio:
15
+ = item.to_s
16
+
17
+ .back
18
+ - if item.parent?
19
+ %a{:href => item.parent.path}
20
+ %span!= "«"
21
+ Back to
22
+ %br
23
+ %strong= item.parent
24
+
25
+ .body
26
+ != item.body if item.respond_to?(:body)
27
+ .nav
28
+ %ul
29
+ - item.children.each do |p|
30
+ - next unless p.try(:renderable?)
31
+ %li
32
+ %a{:href => p.path}= p
@@ -0,0 +1,31 @@
1
+ - layout 'layout'
2
+ - title item.to_s
3
+
4
+ #content
5
+ .crumbs
6
+ %ul
7
+ %li
8
+ %a{:href => '/'}!= "♥"
9
+ - item.crumbs.each do |p|
10
+ %li{:class => ('active' if @item == p)}
11
+ %a{:href => p.path}= p
12
+
13
+ %h1{:class => 'level-%i' % [ item.crumbs.size ] }
14
+ = item.to_s
15
+
16
+ .back
17
+ - if item.parent?
18
+ %a{:href => item.parent.path}
19
+ %span!= "«"
20
+ Back to
21
+ %br
22
+ %strong= item.parent
23
+
24
+ .body
25
+ != html(item.body) if item.respond_to?(:body)
26
+ .nav
27
+ %ul
28
+ - item.submenu.each do |p|
29
+ - next unless p.try(:renderable?)
30
+ %li
31
+ %a{:href => p.path}= p.menu_title
@@ -0,0 +1,9 @@
1
+ - layout 'layout'
2
+
3
+ #content
4
+ %h1
5
+ Error
6
+
7
+ %p
8
+ Try again later.
9
+
@@ -0,0 +1,11 @@
1
+ - layout 'layout'
2
+ - title "Not found"
3
+
4
+ #content
5
+ %h1
6
+ Not found
7
+
8
+ %p
9
+ The requested path
10
+ %strong= request.fullpath
11
+ was not found.
@@ -0,0 +1,33 @@
1
+ !!! 5
2
+ %html{:class => browser.body_class}
3
+ %head
4
+ %meta(charset='UTF-8')
5
+ %title!= title ? "#{title} — Aura" : "Aura"
6
+ %link(rel='stylesheet' media='screen' type='text/css' href='/css/theme/reset.css')
7
+ %link(rel='stylesheet' media='screen' type='text/css' href='/css/theme/style.css')
8
+
9
+ - if @item.try(:meta_keywords)
10
+ %meta{:name => 'keywords', :value => @item.meta_keywords}
11
+ - if @item.try(:meta_description)
12
+ %meta{:name => 'description', :value => @item.meta_description}
13
+
14
+ %body{:class => body_class}
15
+
16
+ %header#top
17
+ %h3
18
+ %strong This is my site
19
+ %small Yes it is, and it's very very nice
20
+
21
+ %nav
22
+ %ul
23
+ - Aura.menu.each do |p|
24
+ - next unless p.try(:renderable?)
25
+ %li{:class => ('active' if !@item.nil? and @item.crumbs.include?(p))}
26
+ %a{:href => p.path}= p.menu_title
27
+
28
+ #all
29
+ - if content_for?(:content)
30
+ != yield_content(:content)
31
+ != yield
32
+
33
+ != admin_watermark
@@ -0,0 +1,315 @@
1
+ ENV['AURA_ROOT'] ||= File.expand_path('../../', __FILE__)
2
+
3
+ if ENV['APP_FILE']
4
+ ENV['APP_ROOT'] ||= File.dirname(ENV['APP_FILE'])
5
+ else
6
+ ENV['APP_ROOT'] ||= ENV['AURA_ROOT']
7
+ ENV['APP_FILE'] ||= __FILE__
8
+ end
9
+
10
+ require "sequel"
11
+
12
+ # Class: Aura
13
+ # The main class.
14
+ #
15
+ # #### Paths
16
+ #
17
+ # Aura.root #=> "~/myapp/root"
18
+ # Aura.gem_root #=> "/usr/lib/ruby/gems.../aura-0.0.1"
19
+ #
20
+ # #### Files
21
+ #
22
+ # Aura.files['models/book.rb'] #=> "~/myapp/app/models/book.rb"
23
+ # Aura.files.glob('css/**/*') #=> #<Array>
24
+ #
25
+ # #### Settings
26
+ #
27
+ # Aura.set 'site.name', 'Othello'
28
+ # Aura.get('site.name') #=> "Othello"
29
+ #
30
+ # # Attempts to set the default site.name, but fails because it was
31
+ # # already set previously.
32
+ # Aura.default 'site.name', 'Talamasca'
33
+ # puts Aura.get('site.name').inspect
34
+ # #=> "Othello"
35
+ #
36
+ class Aura
37
+ PREFIX = File.dirname(__FILE__)
38
+
39
+ # Class method: gem_root (Aura)
40
+ # Usage: Aura.gem_root([args])
41
+ # Returns the root path of the Aura gem.
42
+ #
43
+ def self.gem_root(*a)
44
+ File.join(ENV['AURA_ROOT'], *a)
45
+ end
46
+
47
+ # Class method: root (Aura)
48
+ # Usage: Aura.root([args])
49
+ # Returns the root path of the application.
50
+ #
51
+ # ## Example
52
+ # Aura.root #=> "~/myapp"
53
+ # Aura.root('init.rb') #=> "~/myapp/init.rb"
54
+ #
55
+ def self.root(*a)
56
+ File.join(ENV['APP_ROOT'], *a)
57
+ end
58
+
59
+ autoload :Extension, gem_root("lib/aura/extension")
60
+ autoload :ExtensionNotFound, gem_root("lib/aura/extension")
61
+ autoload :CLI, gem_root("lib/aura/cli")
62
+ autoload :Menu, gem_root("lib/aura/menu")
63
+ autoload :Models, gem_root("lib/aura/models")
64
+ autoload :Slugs, gem_root("lib/aura/slugs")
65
+ autoload :Subtype, gem_root("lib/aura/subtype")
66
+ autoload :Seeder, gem_root("lib/aura/seeder")
67
+ autoload :Utils, gem_root("lib/aura/utils")
68
+ autoload :Editor, gem_root("lib/aura/editor")
69
+ autoload :Public, gem_root("lib/aura/public")
70
+ autoload :Rendering, gem_root("lib/aura/rendering")
71
+ autoload :Files, gem_root("lib/aura/files")
72
+ autoload :Admin, gem_root("lib/aura/admin")
73
+ autoload :App, gem_root("app/main")
74
+
75
+ require "#{PREFIX}/aura/version"
76
+
77
+ # Alias for Setting.get.
78
+ # See Setting.get for an example.
79
+ def self.get(key)
80
+ Setting.get key
81
+ end
82
+
83
+ # Alias for Setting.set.
84
+ # See Setting.get for an example.
85
+ def self.set(key, value)
86
+ Setting.set key, value
87
+ end
88
+
89
+ # Alias for Setting.default.
90
+ # See Setting.get for an example.
91
+ def self.default(key, value)
92
+ Setting.default key, value
93
+ end
94
+
95
+ # Alias for Setting.delete.
96
+ # See Setting.get for an example.
97
+ def self.del(key)
98
+ Setting.del key
99
+ end
100
+
101
+ # Class method: db_dump (Aura)
102
+ # Returns the database backup as a hash.
103
+ #
104
+ # @see db_dump_yaml
105
+ #
106
+ # ## Example
107
+ #
108
+ # data = Aura.db_dump
109
+ # yml_data = YAML::dump(data) # also see db_dump_yaml.
110
+ # File.open('backup.yml', 'w') { |f| f << yml_data }
111
+ # puts yml_data.inspect
112
+ #
113
+ # # Sample output:
114
+ # # pages:
115
+ # # - title: Hello.
116
+ # # body: Good day everyone!
117
+ # # - title: Cheers!
118
+ # # body: What's going on?
119
+ # # settings:
120
+ # # - ...
121
+ #
122
+ def self.db_dump
123
+ db = models.all.first.db
124
+
125
+ models.all.inject({}) { |hash, model|
126
+ table = model.table_name
127
+ hash[table] = db[table].all
128
+ hash
129
+ }
130
+ end
131
+
132
+ # Class method: db_restore (Aura)
133
+ # Restores a previous output of db_dump.
134
+ #
135
+ # This function takes in the parameter `hash`, which is a hash table
136
+ # with the keys as the table names, and it's values are arrays of
137
+ # records.
138
+ #
139
+ # See #db_dump for an example of the hash that #db_restore expects.
140
+ #
141
+ # ## Example
142
+ #
143
+ # # Load a previously saved copy of the hash, as spitted out
144
+ # # by db_dump.
145
+ # yaml_data = YAML::load_file 'backup.yml'
146
+ #
147
+ # # Load it.
148
+ # Aura.db_restore(yaml_data)
149
+ #
150
+ def self.db_restore(hash)
151
+ # Hash format:
152
+ # { :table_name => [ array of hashes of rows ], ... }
153
+
154
+ # Bring the DB back to the state where we have tables ready.
155
+ Main.flush!
156
+ Aura.run_migrations!
157
+ db = models.all.first.db
158
+
159
+ hash.each do |table, entries|
160
+ entries.each do |entry|
161
+ db[table] << entry
162
+ end
163
+ end
164
+ end
165
+
166
+ # Class method: db_dump_yaml (Aura)
167
+ # Returns the database backup as a YAML document.
168
+ #
169
+ def self.db_dump_yaml
170
+ require 'yaml'
171
+ YAML::dump db_dump
172
+ end
173
+
174
+ # Class method: site_empty? (Aura)
175
+ # Checks if the site is empty.
176
+ #
177
+ # All content models are queried to see if there are any records available.
178
+ # Content models are determined by checking if the model classes respond
179
+ # #content? as `true`.
180
+ #
181
+ # ## Example
182
+ #
183
+ # if Aura.site_empty?
184
+ # page = Page.new :title => "Hello"
185
+ # page.save
186
+ # assert Aura.site_empty? == false
187
+ # end
188
+ #
189
+ def self.site_empty?
190
+ ! models.all.select { |m| m.content? }.detect { |m| m.any? }
191
+ end
192
+
193
+ # Class method: find (Aura)
194
+ # Finds a record that corresponds to a path.
195
+ #
196
+ # ## Example
197
+ #
198
+ # products = Page.new :slug => 'products'
199
+ # products.save
200
+ #
201
+ # boots = Page.new :parent => 'products', :slug => 'boots'
202
+ # boots.save
203
+ #
204
+ # foo = Aura.find('/products/boots')
205
+ # assert foo == boots
206
+ #
207
+ def self.find(path)
208
+ Slugs.find path
209
+ end
210
+
211
+ # Class method: roots (Aura)
212
+ # Returns all model records without parents.
213
+ #
214
+ # Records are considered without parents when they respond to #parent
215
+ # with `nil`.
216
+ #
217
+ def self.roots
218
+ models.all.inject([]) { |a, m| a += m.roots.try(:all) }
219
+ end
220
+
221
+ # Class method: menu (Aura)
222
+ # Returns the menu items, sorted properly.
223
+ #
224
+ # ## Example
225
+ #
226
+ # - Aura.menu.each do |item|
227
+ # %li
228
+ # %a{:href => item.path}= item.menu_title
229
+ #
230
+ def self.menu
231
+ roots.select { |item| item.shown_in_menu? }.sort
232
+ end
233
+
234
+ # Class method: run_migrations! (Aura)
235
+ # Runs migrations for everything.
236
+ def self.run_migrations!
237
+ Aura.files.glob('migrations/**/*.rb').each { |f| load f }
238
+
239
+ # Reload models to ensure they get the right schemae.
240
+ Aura.models.reload!
241
+ end
242
+
243
+ # Class method: models (Aura)
244
+ # Returns a list of models.
245
+ #
246
+ # ## Description
247
+ # This returns a {Aura::Models} instance. See the class
248
+ # documentation for more info.
249
+ #
250
+ def self.models
251
+ Aura::Models.new
252
+ end
253
+
254
+ # Class method: slugs (Aura)
255
+ # Returns the Slugs module.
256
+ #
257
+ # ## Description
258
+ # Returns {Aura::Slugs} where you can access methods that
259
+ # deal with URL slugs.
260
+ #
261
+ # ## Example
262
+ # Aura.slugs.find('/boots')
263
+ #
264
+ def self.slugs
265
+ Slugs
266
+ end
267
+
268
+ # Class method: editor (Aura)
269
+ # Usage: Aura.editor
270
+ #
271
+ # Returns the Editor module.
272
+ #
273
+ # ## Description
274
+ # Returns {Aura::Editor} where you can access methods that
275
+ # deal with the editor.
276
+ #
277
+ # ## Example
278
+ # Aura.editor.roots
279
+ #
280
+ def self.editor
281
+ Editor
282
+ end
283
+
284
+ # Class method: files (Aura)
285
+ # Usage: Aura.files
286
+ #
287
+ # Returns the Files module.
288
+ #
289
+ # ## Description
290
+ # Returns {Aura::Files} where you can access methods that
291
+ # deal with files.
292
+ #
293
+ # ## Example
294
+ # Aura.files['models/page.rb']
295
+ #
296
+ def self.files
297
+ Files
298
+ end
299
+
300
+ # Class method: admin (Aura)
301
+ # Usage: Aura.admin
302
+ #
303
+ # Returns the Admin module.
304
+ #
305
+ # ## Description
306
+ # Returns {Aura::Admin} where you can access methods that
307
+ # deal with files.
308
+ #
309
+ # ## Example
310
+ # Aura.admin.menu
311
+ #
312
+ def self.admin
313
+ Admin
314
+ end
315
+ end