aura 0.0.1.pre10

Sign up to get free protection for your applications and to get access to all the features.
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,87 @@
1
+ class Aura
2
+ module Slugs
3
+ extend self
4
+
5
+ # @group Module functions
6
+
7
+ # Finds a record from a path.
8
+ #
9
+ # Please use {Aura.find}.
10
+ #
11
+ def find(path)
12
+ item = find_by_model_id(path)
13
+ return item unless item.nil?
14
+
15
+ path = path.split('/').reject { |s| s.empty? }
16
+ item = nil
17
+
18
+ path.each do |slug|
19
+ item = find_single(slug, item)
20
+ return nil if item.nil?
21
+ end
22
+
23
+ item
24
+ end
25
+
26
+ # Finds a record from a model id path in the format */model_name/id*.
27
+ #
28
+ # You do not need to call this as this is already done by
29
+ # {Aura.find}.
30
+ #
31
+ # @example
32
+ #
33
+ # page = Aura.slugs.find_by_model_id('/page/2')
34
+ # assert page == Page[2]
35
+ #
36
+ def find_by_model_id(path)
37
+ model_name, id = path.squeeze('/').split('/').compact
38
+ return nil if id.nil?
39
+
40
+ # Make sure it's numeric
41
+ id = id.to_i
42
+ return nil if id == 0
43
+
44
+ model = Aura.models.all.detect { |m| m.class_name == model_name }
45
+ return nil if model.nil?
46
+
47
+ model[id]
48
+ end
49
+
50
+ # Ensures that a given model is going to be searched by
51
+ # {Aura.find}.
52
+ #
53
+ # This is automatically called by {AuraSluggable}.
54
+ #
55
+ # @example
56
+ #
57
+ # # Loading the sluggable plugin does {#register} automatically.
58
+ # class MyModel < Aura::Model
59
+ # plugin :aura_sluggable
60
+ # end
61
+ #
62
+ # item = MyModel.new :slug => 'hello'
63
+ # item.save
64
+ #
65
+ # # Now you may search for it.
66
+ # assert item == Aura.find('/hello')
67
+ #
68
+ def register(model)
69
+ @models ||= []
70
+ @models << model unless @models.include? model
71
+ end
72
+
73
+ protected
74
+ def find_single(slug, parent=nil)
75
+ models.each do |model|
76
+ item = model.get_by_slug(slug, parent)
77
+ return item unless item.nil?
78
+ end
79
+ nil
80
+ end
81
+
82
+ def models
83
+ @models ||= []
84
+ end
85
+ end
86
+ end
87
+
@@ -0,0 +1,48 @@
1
+ require 'ostruct'
2
+
3
+ # Class: Subtype (Aura)
4
+ # A subtype.
5
+ #
6
+ # ## Description
7
+ # This is an OpenStruct. See {AuraSubtyped} for details.
8
+ #
9
+ # ## Allowed options
10
+ #
11
+ # * `name`
12
+ # * `template`
13
+ # * `parentable`
14
+ # * `deletable`
15
+ # * `allowed_subtypes` - Array of symbols of subtypes permitted for its children
16
+ #
17
+ class Aura
18
+ class Subtype < OpenStruct
19
+ def parentable
20
+ r = @table[:parentable]; r.nil? ? true : r
21
+ end
22
+
23
+ alias parentable? parentable
24
+
25
+ def deletable
26
+ r = @table[:deletable]; r.nil? ? true : r
27
+ end
28
+
29
+ alias deletable? deletable
30
+
31
+ def to_s
32
+ name
33
+ end
34
+
35
+ def name
36
+ @table[:name].to_s
37
+ end
38
+
39
+ def template
40
+ @table[:template] || 'show'
41
+ end
42
+
43
+ def _id
44
+ # Alias for #id for 1.8.6 compatibility
45
+ @table[:id]
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,24 @@
1
+ # Module: Tasks (Aura)
2
+ # Rake tasks loader.
3
+ #
4
+ # #### Loading Rake tasks
5
+ # Put {Aura::Tasks.load!} in your project's `Rakefile`.
6
+ #
7
+ # # [Rakefile (ruby)]
8
+ # require 'aura'
9
+ # Aura::Tasks.load!
10
+ #
11
+ class Aura
12
+ module Tasks
13
+ # Class method: load! (Aura::Tasks)
14
+ # Loads rake tasks.
15
+ #
16
+ # ## Description
17
+ # Put this in your app's Rakefile. See {Aura::Tasks} for an example.
18
+ #
19
+ def self.load!
20
+ require File.expand_path('../tasks/common.rb', __FILE__)
21
+ load File.expand_path('../tasks/db.rake', __FILE__)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ class RakeStatus
2
+ def self.heading(what, status)
3
+ if what == :run
4
+ color = 30
5
+ puts "\033[1;#{color}m$ %s \033[0m" % [status]
6
+ return
7
+ end
8
+ puts "* %s" % [status]
9
+ end
10
+
11
+ def self.print(what, status)
12
+ color = 32
13
+ color = 31 if what == :error
14
+ what = "" if what == :info
15
+ puts "\033[1;#{color}m %-14s\033[0m %s" % [what, status]
16
+ end
17
+ end
@@ -0,0 +1,54 @@
1
+ namespace :db do
2
+ desc "Clears the database (no undo!)"
3
+ task :flush do
4
+ require ENV['APP_FILE']
5
+ RakeStatus.heading :info, "Clearing the database..."
6
+ Main.flush! { |*a| RakeStatus.print(*a) }
7
+ Main.restart!
8
+ end
9
+
10
+ desc "Load sample values."
11
+ task :sample do
12
+ require ENV['APP_FILE']
13
+ RakeStatus.heading :info, "Loading sample values..."
14
+ Main.seed!(:sample) { |*a| RakeStatus.print(*a) }
15
+ Main.restart!
16
+ end
17
+
18
+ desc "Dumps seed."
19
+ task :dump do
20
+ require ENV['APP_FILE']
21
+
22
+ RakeStatus.heading :info, "Working..."
23
+ output = Aura.db_dump_yaml
24
+
25
+ RakeStatus.heading :info, "Writing to config/seed.yml..."
26
+ File.open("config/seed.yml", 'w') { |f| f.write output }
27
+
28
+ puts ""
29
+ puts "Done."
30
+ puts ""
31
+ puts "The next time your app starts with a blank database, it will"
32
+ puts "load the data you have now. You can also load it manually"
33
+ puts "with rake db:load."
34
+ puts ""
35
+ puts "To disable this, remove the config/seed.yml file."
36
+ puts ""
37
+ end
38
+
39
+ desc "Loads seed."
40
+ task :load do
41
+ require ENV['APP_FILE']
42
+ RakeStatus.heading :info, "Clearing the database..."
43
+ Main.flush! { |*a| RakeStatus.print(*a) }
44
+ RakeStatus.heading :info, "Loading data from config/seed.yml..."
45
+ seed_file = Main.approot('config/seed.yml')
46
+ Aura.db_restore YAML::load_file(seed_file)
47
+ Main.restart!
48
+ end
49
+ end
50
+
51
+ task :default do
52
+ exec 'rake -s -T'
53
+ end
54
+
@@ -0,0 +1,81 @@
1
+ # Module: Utils (Aura)
2
+ # Miscellaneous utilities.
3
+ #
4
+ class Aura
5
+ module Utils
6
+ extend self
7
+
8
+ # Method: query_string (Aura::Utils)
9
+ # Converts a hash into a query string.
10
+ #
11
+ # ## Usage
12
+ # query_string(hash)
13
+ #
14
+ # ## Example
15
+ # query_string(:q => "peanuts", :page => 2)
16
+ # #=> q=peanuts&page=2
17
+ #
18
+ # query_string(:fruits => %w[apple banana])
19
+ # #=> q[]=apple&q[]=banana
20
+ #
21
+ def query_string(hash)
22
+ hash.inject([]) { |arr, (key, value)|
23
+ if value.is_a?(Array)
24
+ value.each do |e|
25
+ arr << key_value("#{key}[]", e)
26
+ end
27
+ arr
28
+ elsif value.is_a?(Hash)
29
+ value.each do |namespace, deeper|
30
+ arr << key_value("#{key}[#{namespace}]", deeper)
31
+ end
32
+ arr
33
+ else
34
+ arr << key_value(key, value)
35
+ end
36
+ }.join('&')
37
+ end
38
+
39
+ # Method: key_value (Aura::Utils)
40
+ # Converts two strings into a key value pair.
41
+ #
42
+ # ## Example
43
+ # key_value('q', 'peanuts')
44
+ # #=> q=peanuts
45
+ #
46
+ def key_value(k, v)
47
+ require 'cgi'
48
+ '%s=%s' % [CGI.escape(k.to_s), URI.escape(v.to_s)]
49
+ end
50
+
51
+ # Method: underscorize (Aura::Utils)
52
+ # Underscorizes a class's name.
53
+ #
54
+ # ## Example
55
+ # underscorize(Sequel::Plugins::AuraSluggable)
56
+ # #=> 'aura_sluggable'
57
+ #
58
+ def underscorize(klass)
59
+ klass.to_s.split('::').last.scan(/[A-Z][a-z0-9]*/).map { |s| s.downcase }.join('_')
60
+ end
61
+
62
+ # Method: in_dir? (Aura::Utils)
63
+ # Usage: Utils.in_dir?(file, dir)
64
+ #
65
+ # Checks if a given `file` is inside `dir`.
66
+ #
67
+ def in_dir?(file, dir)
68
+ return false unless File.exists?(file)
69
+ return false unless File.directory?(dir)
70
+
71
+ node = File.dirname(file)
72
+
73
+ while true
74
+ parent = File.join(node, '..')
75
+ return false if File.identical?(parent, node)
76
+ return true if File.identical?(node, dir)
77
+ node = parent
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,25 @@
1
+ class Aura
2
+ # Class method: version (Aura)
3
+ # Returns the current version.
4
+ #
5
+ # ## Example
6
+ # Aura.version #=> "0.5.2"
7
+ #
8
+ def self.version
9
+ "0.0.1.pre10"
10
+ end
11
+
12
+ # Class method: prerelease? (Aura)
13
+ # Checks if the Aura version is a prerelease.
14
+ #
15
+ # ## Example
16
+ # Aura.version #=> "0.5.2"
17
+ # Aura.prerelease? #=> false
18
+ #
19
+ # Aura.version #=> "0.6.0.pre4"
20
+ # Aura.prerelease? #=> true
21
+ #
22
+ def self.prerelease?
23
+ version.count('.') > 2
24
+ end
25
+ end
@@ -0,0 +1,65 @@
1
+ # Class: HashArray
2
+ # A stopgap solution to Ruby 1.8's lack of ordered hashes.
3
+ #
4
+ # A HashArray, for all intents and purposes, acts like an array. However, the
5
+ # common stuff are overloaded to work with hashes.
6
+ #
7
+ # ## Basic usage
8
+ #
9
+ # #### Creating
10
+ # You can create a HashArray by passing it an array.
11
+ #
12
+ # dict = HashArray.new([
13
+ # { :good_morning => "Bonjour" },
14
+ # { :goodbye => "Au revoir" },
15
+ # { :good_evening => "Bon nuit" }
16
+ # ])
17
+ #
18
+ # #### Converting
19
+ # You may also use it like so:
20
+ #
21
+ # letters = [ { :a => "Aye"}, { :b => "Bee" } ].to_hash_array
22
+ #
23
+ # #### Iterating
24
+ # Now you can use the typical enumerator functions:
25
+ #
26
+ # dict.each do |(key, value)|
27
+ # puts "#{key} is #{value}"
28
+ # end
29
+ #
30
+ # #=> :good_morning is "Bonjour"
31
+ # # :goodbye is "Au revoir"
32
+ # # :good_evening is "Bon nuit"
33
+ #
34
+ class HashArray < Array
35
+ # Works like Hash#each.
36
+ #
37
+ # By extension, methods that rely on #each (like #inject) will work
38
+ # as intended.
39
+ #
40
+ def each(&block)
41
+ super { |hash| yield hash.to_a.flatten }
42
+ end
43
+
44
+ # Works like Hash#map.
45
+ def map(&block)
46
+ super { |hash| yield hash.to_a.flatten }
47
+ end
48
+
49
+ # Works like Hash#values.
50
+ def values
51
+ inject([]) { |a, (k, v)| a << v; a }
52
+ end
53
+
54
+ # Returns everything as a hash.
55
+ def to_hash
56
+ inject({}) { |hash, (k, v)| hash[k] = v; hash }
57
+ end
58
+ end
59
+
60
+ class Array
61
+ # Transforms a given array of hashes into a HashArray.
62
+ def to_hash_array
63
+ HashArray.new self
64
+ end
65
+ end
@@ -0,0 +1,9 @@
1
+ class Object
2
+ def try(meth, *a)
3
+ send(meth, *a) if respond_to?(meth)
4
+ end
5
+
6
+ def tap
7
+ yield self; self
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ module Sequel
2
+ module Plugins
3
+ module AuraCustom
4
+ module InstanceMethods
5
+ def custom
6
+ @values[:custom]
7
+ end
8
+
9
+ def custom=(hash)
10
+ @values[:custom] ||= Hash.new
11
+ @values[:custom] = @values[:custom].merge(hash)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,39 @@
1
+ # Sequel plugin: AuraEditable
2
+ # For things that you can edit in the admin panel.
3
+ #
4
+ # ## Description
5
+ # Use this plugin in you want your model editable.
6
+ #
7
+ # #### How to use
8
+ # Use `plugin :aura_editable`.
9
+ #
10
+ # class Book < Sequel::Model
11
+ # plugin :aura_editable
12
+ # end
13
+ #
14
+ module Sequel
15
+ module Plugins
16
+ module AuraEditable
17
+ module InstanceMethods
18
+ def editable?
19
+ true
20
+ end
21
+ end
22
+
23
+ module ClassMethods
24
+ def editable?
25
+ true
26
+ end
27
+
28
+ def form(type=:edit, &block)
29
+ @forms ||= Hash.new
30
+ return @forms[type] unless block_given?
31
+
32
+ @forms[type] = ::Terra::Form.new
33
+ @forms[type].root_name 'editor'
34
+ @forms[type].configure &block
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end