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,94 @@
1
+ class Main
2
+ module TemplateHelpers
3
+ # Makes a template extend upon another template.
4
+ #
5
+ # Example:
6
+ #
7
+ # -# Should be the first line.
8
+ # != extends :'base/edit', options
9
+ #
10
+ # - content_for! :body do
11
+ # This will override the body of the base/edit template
12
+ #
13
+ def extends(name, locals={})
14
+ partial name, locals
15
+ end
16
+
17
+ # Template helper: partial (Helpers)
18
+ # Renders a partial.
19
+ #
20
+ def partial(template, *args) #locals={}, options={}
21
+ if template.respond_to?(:templates_for)
22
+ template = template.templates_for(args.shift || 'index')
23
+ end
24
+
25
+ locals = args.shift || {}
26
+ options = args.shift || {}
27
+
28
+ layout, @layout = @layout, nil
29
+ out = show template, {:layout => false}.merge(options), locals
30
+ @layout = layout
31
+ out
32
+ end
33
+
34
+ # Template helper: has_content? (Helpers)
35
+ # Checks if a given content block is defined.
36
+ #
37
+ def has_content?(key)
38
+ return false unless content_blocks.keys.include?(key.to_sym)
39
+ content_blocks[key.to_sym].any?
40
+ end
41
+
42
+ # Template helper: content_for! (Helpers)
43
+ # Like content_for, but overwrites any blocks.
44
+ #
45
+ def content_for!(key, &blk)
46
+ content_blocks[key.to_sym] = Array.new
47
+ content_for key, &blk
48
+ end
49
+
50
+ # Template helper: content_for? (Helpers)
51
+ # Synonym of has_content?
52
+ #
53
+ def content_for?(key)
54
+ (content_blocks[key.to_sym] || Array.new).any?
55
+ end
56
+
57
+ # Template helper: yield_content_of (Helpers)
58
+ # Loads a given template and yields a certain content block of it.
59
+ #
60
+ # ## Usage
61
+ # yield_content_of(template, section[, locals])
62
+ # yield_content_of(model, template, section[, locals])
63
+ #
64
+ def yield_content_of(template, *args) #section, locals={}
65
+ if template.respond_to?(:templates_for)
66
+ template = template.templates_for(args.shift || :index)
67
+ end
68
+
69
+ section = args.shift || :content
70
+ locals = args.shift || {}
71
+
72
+ custom_activate!
73
+
74
+ show template, { :layout => false }, locals
75
+ ret = yield_content(section)
76
+
77
+ custom_deactivate!
78
+ ret
79
+ end
80
+
81
+ protected
82
+ def custom_activate!
83
+ @old_content_blocks ||= Array.new
84
+ @old_content_blocks << @content_blocks
85
+ @content_blocks = Hash.new { |h, k| h[k] = [] }
86
+ end
87
+
88
+ def custom_deactivate!
89
+ @content_blocks = @old_content_blocks.pop
90
+ end
91
+ end
92
+
93
+ helpers TemplateHelpers
94
+ end
@@ -0,0 +1,45 @@
1
+ class Main
2
+ module UserHelpers
3
+ # User helper: logged_in? (Helpers)
4
+ # Checks if there is a user logged in or not.
5
+ #
6
+ def logged_in?
7
+ !! current_user
8
+ end
9
+
10
+ # User helper: current_user (Helpers)
11
+ # Returns the current user as an instance of {Aura::Models::User}.
12
+ #
13
+ def current_user
14
+ authenticated(User)
15
+ end
16
+
17
+ # User helper: require_login (Helpers)
18
+ # Ensures that a route is only accessible to logged in users.
19
+ #
20
+ def require_login
21
+ redirect R(:login) unless logged_in?
22
+ end
23
+
24
+ # Overridden in aura to track last login time.
25
+ # This is called when a user logs in.
26
+ #
27
+ def redirect_to_return_url(session_key = :return_to, default = '/admin')
28
+ u = current_user
29
+ first_login = u.last_login.nil?
30
+
31
+ u.last_login = Time.now
32
+ u.save
33
+
34
+ # On a user's first login, go to a admin welcome page
35
+ # where they can change their password.
36
+ if first_login
37
+ redirect R(:admin, :welcome)
38
+ end
39
+
40
+ redirect session.delete(:return_to) || default
41
+ end
42
+ end
43
+
44
+ helpers UserHelpers
45
+ end
@@ -0,0 +1,34 @@
1
+ Aura.admin.menu.tap { |m|
2
+ m.add "settings",
3
+ :name => "Settings",
4
+ :href => Rtopia.R(:admin, :settings),
5
+ :icon => 'settings'
6
+
7
+ m.add "settings.database",
8
+ :name => "Database",
9
+ :href => Rtopia.R(:admin, :settings, :database)
10
+
11
+ m.add "settings.your_account",
12
+ :name => "Your account",
13
+ :href => Rtopia.R(:user, :me, :edit)
14
+
15
+ m.add "settings.users",
16
+ :name => "Users",
17
+ :href => Rtopia.R(:user, :list)
18
+ }
19
+
20
+ Main.register Sinatra::CompressedJS
21
+
22
+ path = Main.root_path(%w(public js))
23
+
24
+ Main.serve_compressed_js :admin_js,
25
+ :prefix => '/js',
26
+ :root => path,
27
+ :path => '/admin/script.js',
28
+ :files =>
29
+ Dir["#{path}/jquery.*.js"].sort +
30
+ Dir["#{path}/lib.*.js"].sort +
31
+ Dir["#{path}/admin.js"].sort +
32
+ Dir["#{path}/admin.*.js"].sort
33
+
34
+
@@ -0,0 +1,18 @@
1
+ # Load extensions
2
+ Aura::Extension.active.each { |ext| ext.load! }
3
+
4
+ seed_file = Main.approot('config/seed.yml')
5
+
6
+ # If the file config/seed.yml is present, use that to initialize the DB.
7
+ # Only if the DB is pristine, though!
8
+ if File.exists?(seed_file) and Main.database.tables.empty?
9
+ puts "Note: Restoring sample data from config/seed.yml."
10
+ Aura.db_restore YAML::load_file(seed_file)
11
+
12
+ # ..otherwise, setup the database: do migrations and put in fresh data.
13
+ else
14
+ Aura.run_migrations!
15
+ Main.seed
16
+ end
17
+
18
+ Aura::Extension.active.each { |ext| ext.init }
@@ -0,0 +1,11 @@
1
+ # Reloading
2
+ class Main
3
+ unless production?
4
+ FileUtils.mkdir_p Aura.root('tmp/')
5
+ FileUtils.touch Aura.root('tmp/restart.txt')
6
+
7
+ use(Pistol, app_files + [Aura.root('tmp/restart.txt')]) {
8
+ reset! and load(ENV['APP_FILE'])
9
+ }
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ Sequel::Model.plugin :aura_model
2
+ Sequel::Model.plugin :validation_helpers
3
+ Sequel::Model.plugin :hook_class_methods
4
+ Sequel.extension :inflector
5
+
6
+ class Sequel::Model
7
+ def self.inherited(klass)
8
+ Aura.models.all << klass
9
+ super
10
+ end
11
+ end
@@ -0,0 +1,106 @@
1
+ root = Aura.method(:gem_root)
2
+ approot = Aura.method(:root)
3
+
4
+ $:.unshift *Dir[root["/vendor/*/lib"]]
5
+ require "sinatra/base"
6
+ require "sinatra/support"
7
+ require "rtopia"
8
+ require "sequel"
9
+ require "sinatra/content_for"
10
+ require "sinatra/sequel"
11
+ require "pistol"
12
+ require "json"
13
+ require "yaml"
14
+ require "shield"
15
+ require "ostruct"
16
+ require "fileutils"
17
+
18
+ # Helpers
19
+ require root['lib/core/hasharray']
20
+ require root['lib/core/object_ext']
21
+
22
+ # Aura proper
23
+ require root['lib/aura']
24
+ require root['lib/terra']
25
+ require root['lib/terra/ext']
26
+
27
+ if defined?(::Encoding)
28
+ Encoding.default_external = 'utf-8'
29
+ end
30
+
31
+ # Class: Main
32
+ # The main Sinatra application.
33
+ #
34
+ # ## Description
35
+ # This is the main application. It is also accessible as `Aura::App`.
36
+ #
37
+ class Main < Sinatra::Base
38
+ set :root, lambda { |*args| File.join(ENV['AURA_ROOT'], *args) }
39
+ set :root_path, lambda { |*args| root *args }
40
+ set :approot, lambda { |*args| File.join(ENV['APP_ROOT'] || root, *args) }
41
+
42
+ set :haml, :escape_html => true
43
+ set :haml, :escape_html => true, :ugly => true if production?
44
+
45
+ enable :raise_errors
46
+
47
+ use Rack::Session::Cookie
48
+ use Rack::Deflater if production?
49
+
50
+ register Aura::Public
51
+ register Aura::Rendering
52
+ register Aura::Seeder
53
+ register Sinatra::SequelExtension
54
+
55
+ helpers Rtopia
56
+ helpers Sinatra::ContentFor
57
+ helpers Sinatra::UserAgentHelpers
58
+ helpers Shield::Helpers
59
+
60
+ # Load all, but load defaults first
61
+ ( Dir[root('config/*.rb')].sort +
62
+ Dir[approot('config/*.rb')].sort
63
+ ).uniq.each { |f| load f }
64
+
65
+ register Sinatra::CompassSupport
66
+
67
+ set :login_success_message, nil
68
+
69
+ set :multi_views, [root('app/views')]
70
+ set :app_files, [ENV['APP_FILE']] + Dir[root('**/*.rb')] + Dir[approot('**/*.rb')]
71
+ set :extensions_path, [root('extensions'), approot('extensions')]
72
+
73
+ # Heroku - override the DB config with this env var.
74
+ set :database_url, ENV['DATABASE_URL'] unless ENV['DATABASE_URL'].nil?
75
+
76
+ add_public approot('public')
77
+
78
+ def self.restart!
79
+ require 'fileutils'
80
+ FileUtils.touch approot('tmp', 'restart.txt')
81
+ end
82
+
83
+ # Connect to db
84
+ database
85
+ end
86
+
87
+ # Initializers
88
+ require root['app/init/pistol.rb']
89
+ require root['app/init/admin.rb']
90
+ require root['app/init/sequel.rb']
91
+
92
+ # Bootstrap Aura
93
+ Dir[root['app/{models,helpers,routes}/**/*.rb']].each { |f| require f }
94
+
95
+ # Extensions
96
+ require root['app/init/extensions.rb']
97
+
98
+ # Load app/
99
+ if File.directory?(Main.approot('app'))
100
+ Aura::Extension.new(Main.approot('app')).load!
101
+ end
102
+
103
+ Aura::App = Main
104
+
105
+ Main.set :port, ENV['PORT'].to_i unless ENV['PORT'].nil?
106
+ Main.run! if ENV['APP_FILE'] == $0
@@ -0,0 +1,29 @@
1
+ class Main
2
+ migration "Aura v0.0.1 - page" do
3
+ database.create_table :pages do
4
+ # aura_hierarchy
5
+ primary_key :id
6
+ foreign_key :parent_id, :pages
7
+
8
+ String :title
9
+ String :body, :text => true
10
+ String :custom, :text => true
11
+
12
+ # aura_sluggable
13
+ String :slug
14
+
15
+ # aura_subtyped
16
+ String :subtype
17
+
18
+ String :author_name #unused
19
+
20
+ String :meta_keywords
21
+ String :meta_description
22
+
23
+ Boolean :shown_in_menu
24
+
25
+ Time :created_at
26
+ Time :modified_at
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ class Main
2
+ migration "Aura v0.0.1 - settings" do
3
+ database.create_table :settings do
4
+ primary_key :id
5
+
6
+ String :key
7
+ String :value, :text => true
8
+ index :key
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ class Main
2
+ migration "Aura v0.0.1 - user" do
3
+ database.create_table :users do
4
+ primary_key :id
5
+
6
+ String :email
7
+ String :slug
8
+ String :crypted_password
9
+ Time :last_login
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,116 @@
1
+ # Model: Page
2
+ # Inherits: {AuraModel} {AuraSluggable} {AuraRenderable} {AuraEditable} {AuraHierarchy} {AuraSubtyped}
3
+ # The page model.
4
+ #
5
+ # ## Inherits from
6
+ # * {AuraModel}
7
+ # * {AuraSluggable}
8
+ # * {AuraRenderable}
9
+ # * {AuraEditable}
10
+ # * {AuraHierarchy}
11
+ # * {AuraSubtyped}
12
+ #
13
+ class Page < Sequel::Model
14
+ plugin :aura_sluggable # Accessible via slug: /about-us/services
15
+ plugin :aura_renderable # Can show a page when accessed by that URL
16
+ plugin :aura_editable # Editable in the admin area
17
+ plugin :aura_hierarchy # Can have children
18
+ plugin :aura_subtyped # Has subtypes
19
+
20
+ plugin :timestamps
21
+ plugin :serialization, :yaml, :custom
22
+
23
+ form do
24
+ # title (show it big), main-title (use it on the page heading)
25
+ text :title, "Page title", :class => 'title main-title no-label assert required'
26
+ html :body, "Body text", :class => 'long no-label'
27
+ text :slug, "Slug", :class => 'compact hide'
28
+
29
+ # fieldset(:meta, "Metadata") do
30
+ # text :meta_keywords, "Keywords", :class => 'compact-top'
31
+ # text :meta_description, "Description", :class => 'compact-bottom'
32
+ # end
33
+ end
34
+
35
+ def initialize(*a)
36
+ super
37
+ self.shown_in_menu = true if self.shown_in_menu.nil?
38
+ end
39
+
40
+ def shown_in_menu?
41
+ !! self.shown_in_menu
42
+ end
43
+
44
+ # Method: child_subtypes (Page)
45
+ # Returns an array of Subtypes allowed for its children.
46
+ def child_subtypes
47
+ types = self.class.subtypes
48
+ types.select! { |t| self.subtype.allowed_subtypes.include? t.id.to_sym } if self.try(:subtype).try(:allowed_subtypes).is_a?(Array)
49
+ types
50
+ end
51
+
52
+ # Method: subtypes (Page)
53
+ # Returns an array of Subtypes allowed for this page.
54
+ def subtypes
55
+ parent? ? parent.child_subtypes : self.class.subtypes
56
+ end
57
+
58
+ # Method: parentable? (Page)
59
+ # Checks if a given page can have children from the admin interface.
60
+ def parentable?
61
+ return false if self.subtype && self.subtype.parentable? == false
62
+ true
63
+ end
64
+
65
+ # Method: deletable? (Page)
66
+ # Checks if a given page can be deleted from the admin interface.
67
+ def deletable?
68
+ return false if self.subtype && self.subtype.deletable? == false
69
+ true
70
+ end
71
+
72
+ def validate
73
+ super
74
+ validates_presence :title
75
+ end
76
+
77
+ # Returns the *other* form that depends on the subtype.
78
+ def subform
79
+ return nil if subtype.nil?
80
+ self.class.form subtype._id
81
+ end
82
+
83
+ # Class method: custom_field (Page)
84
+ # Creates a custom field and adds getters/setters for it.
85
+ #
86
+ # ## Example
87
+ #
88
+ # #### Creating custom fields
89
+ #
90
+ # [app/models/page-ext.rb (rb)]
91
+ # class Page
92
+ # custom_field :recipe
93
+ # end
94
+ #
95
+ # p = Page.new
96
+ # p.recipe = "Chili Con Carne"
97
+ #
98
+ def self.custom_field(name)
99
+ name = name.to_sym
100
+ self.send(:define_method, name) do
101
+ self.custom[name] if self.custom.is_a? Hash
102
+ end
103
+
104
+ self.send(:define_method, :"#{name}=") do |v|
105
+ self.custom ||= Hash.new
106
+ self.custom[name] = v
107
+ end
108
+ end
109
+
110
+ def self.content?; true; end
111
+ def self.show_on_sidebar?; true; end
112
+
113
+ # Class method: root_creatable? (Page)
114
+ # Returns 'true' if the "Add new page" should be shown.
115
+ def self.root_creatable?; true; end
116
+ end