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,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