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.
- data/.gitignore +6 -0
- data/.travis.yml +3 -0
- data/Gemfile +2 -0
- data/HISTORY.md +95 -0
- data/README.md +53 -0
- data/Rakefile +27 -0
- data/Scribefile +8 -0
- data/app/css/_utilities.scss +88 -0
- data/app/css/admin.scss +21 -0
- data/app/css/admin/_settings.scss +136 -0
- data/app/css/admin/chrome.scss +208 -0
- data/app/css/admin/common.scss +78 -0
- data/app/css/admin/forms.scss +342 -0
- data/app/css/admin/jquery_wysiwyg.scss +96 -0
- data/app/css/admin/loading.scss +18 -0
- data/app/css/admin/meta.scss +42 -0
- data/app/css/admin/reset.scss +46 -0
- data/app/css/admin/sections.scss +79 -0
- data/app/css/admin/setup.scss +22 -0
- data/app/css/admin/sidebar.scss +136 -0
- data/app/css/admin/slug.scss +78 -0
- data/app/css/admin/uiscreen.scss +22 -0
- data/app/css/admin/wysiwyg_field.scss +11 -0
- data/app/css/admin_watermark.scss +23 -0
- data/app/css/default_home_page.scss +13 -0
- data/app/css/login.scss +47 -0
- data/app/helpers/admin_helpers.rb +59 -0
- data/app/helpers/flash_helpers.rb +86 -0
- data/app/helpers/form_builder_helpers.rb +9 -0
- data/app/helpers/html_helpers.rb +27 -0
- data/app/helpers/jquery_helpers.rb +26 -0
- data/app/helpers/main_helpers.rb +67 -0
- data/app/helpers/page_helpers.rb +92 -0
- data/app/helpers/template_helpers.rb +94 -0
- data/app/helpers/user_helpers.rb +45 -0
- data/app/init/admin.rb +34 -0
- data/app/init/extensions.rb +18 -0
- data/app/init/pistol.rb +11 -0
- data/app/init/sequel.rb +11 -0
- data/app/main.rb +106 -0
- data/app/migrations/page.rb +29 -0
- data/app/migrations/settings.rb +11 -0
- data/app/migrations/user.rb +13 -0
- data/app/models/page.rb +116 -0
- data/app/models/page_seed.rb +47 -0
- data/app/models/settings.rb +59 -0
- data/app/models/user.rb +60 -0
- data/app/routes/admin.rb +44 -0
- data/app/routes/css_js.rb +53 -0
- data/app/routes/design_tests.rb +15 -0
- data/app/routes/editor.rb +152 -0
- data/app/routes/site.rb +33 -0
- data/app/routes/user.rb +48 -0
- data/app/views/admin/_back_to_dashboard.haml +3 -0
- data/app/views/admin/dashboard.haml +46 -0
- data/app/views/admin/layout.haml +73 -0
- data/app/views/admin/settings.haml +40 -0
- data/app/views/admin/settings/database.haml +42 -0
- data/app/views/base/crumbs.haml +50 -0
- data/app/views/base/delete.haml +19 -0
- data/app/views/base/edit.haml +61 -0
- data/app/views/base/errors.haml +10 -0
- data/app/views/base/form.haml +11 -0
- data/app/views/base/list.haml +14 -0
- data/app/views/base/list_actions.haml +4 -0
- data/app/views/base/list_item.haml +7 -0
- data/app/views/base/nav.haml +36 -0
- data/app/views/base/new.haml +36 -0
- data/app/views/base/preview.haml +28 -0
- data/app/views/base/tabs.haml +12 -0
- data/app/views/default_home_page.haml +15 -0
- data/app/views/design_tests/admin_styles.haml +58 -0
- data/app/views/form_builder/builder.haml +29 -0
- data/app/views/page/edit.haml +29 -0
- data/app/views/page/form.haml +22 -0
- data/app/views/page/meta_form.haml +22 -0
- data/app/views/page/new.haml +26 -0
- data/app/views/user/edit.haml +52 -0
- data/app/views/user/form.haml +43 -0
- data/app/views/user/list.haml +11 -0
- data/app/views/user/login.haml +33 -0
- data/app/views/user/new.haml +25 -0
- data/app/views/user/welcome.haml +29 -0
- data/app/views/watermark/watermark.haml +16 -0
- data/aura.gemspec +36 -0
- data/bin/aura +8 -0
- data/config/database.rb +12 -0
- data/config/extensions.rb +5 -0
- data/config/scss.rb +14 -0
- data/config/user.rb +10 -0
- data/default/.gitignore +6 -0
- data/default/Gemfile +11 -0
- data/default/README.md +24 -0
- data/default/Rakefile +8 -0
- data/default/app/README +3 -0
- data/default/app/css/.gitignore +0 -0
- data/default/app/helpers/helpers.rb.example +9 -0
- data/default/app/js/.gitignore +0 -0
- data/default/app/migrations/model.rb.example +20 -0
- data/default/app/models/model.rb.example +11 -0
- data/default/app/models/page-ext.rb.example +17 -0
- data/default/app/routes/site.rb.example +5 -0
- data/default/app/views/hello.haml.example +1 -0
- data/default/config.ru +3 -0
- data/default/config/.gitignore +0 -0
- data/default/config/database.rb.example +30 -0
- data/default/config/extensions.rb +5 -0
- data/default/config/user.rb.example +10 -0
- data/default/db/.gitignore +0 -0
- data/default/init.rb +15 -0
- data/default/public/.gitignore +0 -0
- data/extensions/contact_form/migrations/contact_form.rb +13 -0
- data/extensions/contact_form/models/contact_form.rb +13 -0
- data/extensions/contact_form/routes/contact_form.rb +11 -0
- data/extensions/contact_form/views/contact_form/edit.haml +8 -0
- data/extensions/contact_form/views/contact_form/form.haml +3 -0
- data/extensions/contact_form/views/contact_form/nav.haml +42 -0
- data/extensions/contact_form/views/contact_form/responses.haml +20 -0
- data/extensions/contact_form/views/contact_form/tabs.haml +8 -0
- data/extensions/default_theme/css/theme/_settings.scss +3 -0
- data/extensions/default_theme/css/theme/chrome.scss +66 -0
- data/extensions/default_theme/css/theme/reset.scss +34 -0
- data/extensions/default_theme/css/theme/style.scss +3 -0
- data/extensions/default_theme/info.yml +2 -0
- data/extensions/default_theme/public/browse.png +0 -0
- data/extensions/default_theme/views/base/id_portfolio.haml +32 -0
- data/extensions/default_theme/views/base/show.haml +31 -0
- data/extensions/default_theme/views/errors/error.haml +9 -0
- data/extensions/default_theme/views/errors/not_found.haml +11 -0
- data/extensions/default_theme/views/layout.haml +33 -0
- data/lib/aura.rb +315 -0
- data/lib/aura/admin.rb +41 -0
- data/lib/aura/app.rb +4 -0
- data/lib/aura/cli.rb +19 -0
- data/lib/aura/cli/base.rb +89 -0
- data/lib/aura/cli/helpers.rb +32 -0
- data/lib/aura/editor.rb +30 -0
- data/lib/aura/extension.rb +189 -0
- data/lib/aura/files.rb +38 -0
- data/lib/aura/menu.rb +142 -0
- data/lib/aura/models.rb +80 -0
- data/lib/aura/public.rb +68 -0
- data/lib/aura/rendering.rb +134 -0
- data/lib/aura/seeder.rb +38 -0
- data/lib/aura/slugs.rb +87 -0
- data/lib/aura/subtype.rb +48 -0
- data/lib/aura/tasks.rb +24 -0
- data/lib/aura/tasks/common.rb +17 -0
- data/lib/aura/tasks/db.rake +54 -0
- data/lib/aura/utils.rb +81 -0
- data/lib/aura/version.rb +25 -0
- data/lib/core/hasharray.rb +65 -0
- data/lib/core/object_ext.rb +9 -0
- data/lib/sequel/plugins/aura_custom.rb +16 -0
- data/lib/sequel/plugins/aura_editable.rb +39 -0
- data/lib/sequel/plugins/aura_hierarchy.rb +82 -0
- data/lib/sequel/plugins/aura_model.rb +271 -0
- data/lib/sequel/plugins/aura_renderable.rb +42 -0
- data/lib/sequel/plugins/aura_sluggable.rb +103 -0
- data/lib/sequel/plugins/aura_subtyped.rb +83 -0
- data/lib/terra.rb +185 -0
- data/lib/terra/ext.rb +16 -0
- data/lib/terra/field.rb +98 -0
- data/lib/terra/fields.rb +122 -0
- data/lib/terra/fieldset.rb +93 -0
- data/lib/terra/form.rb +111 -0
- data/manual/configuration.md +42 -0
- data/manual/extensions.md +45 -0
- data/manual/files.md +70 -0
- data/manual/helpers.md +39 -0
- data/manual/index.md +65 -0
- data/manual/models.md +58 -0
- data/manual/recipes.md +38 -0
- data/manual/recipes/bundling_sample_data.md +30 -0
- data/manual/recipes/creating_themes.md +10 -0
- data/manual/recipes/using_markdown_or_textile.md +24 -0
- data/manual/routes.md +39 -0
- data/manual/theming.md +55 -0
- data/manual/views.md +128 -0
- data/public/hi.html +0 -0
- data/public/images/admin/back.png +0 -0
- data/public/images/admin/browse.png +0 -0
- data/public/images/admin/mock-bg.png +0 -0
- data/public/images/admin/top-loader.gif +0 -0
- data/public/images/admin/uiscreen-loader.gif +0 -0
- data/public/images/admin_icons/add.png +0 -0
- data/public/images/admin_icons/contact.png +0 -0
- data/public/images/admin_icons/dashboard.png +0 -0
- data/public/images/admin_icons/generic.png +0 -0
- data/public/images/admin_icons/home-12.png +0 -0
- data/public/images/admin_icons/page.png +0 -0
- data/public/images/admin_icons/settings.png +0 -0
- data/public/images/jquery.wysiwyg.gif +0 -0
- data/public/js/admin.form_builder.js +15 -0
- data/public/js/admin.js +62 -0
- data/public/js/admin.layout.js +53 -0
- data/public/js/admin.nav.js +241 -0
- data/public/js/admin.slug.js +46 -0
- data/public/js/admin.subpage.js +15 -0
- data/public/js/jquery.hashlisten.js +85 -0
- data/public/js/jquery.js +166 -0
- data/public/js/jquery.livenavigate.js +58 -0
- data/public/js/jquery.livequery.js +226 -0
- data/public/js/jquery.quickvalidate.js +164 -0
- data/public/js/jquery.tmpl.js +486 -0
- data/public/js/jquery.uiscreen.js +150 -0
- data/public/js/jquery.wysiwyg.js +2339 -0
- data/public/js/jqueryui.js +766 -0
- data/public/js/lib.dirty.js +11 -0
- data/public/js/lib.loading.js +23 -0
- data/public/js/lib.wysiwyg.js +155 -0
- data/public/js/underscore-1.1.7.js +27 -0
- data/test/app/app/css/test_raw.css +1 -0
- data/test/app/app/css/test_sass.sass +3 -0
- data/test/app/app/damogram.txt +1 -0
- data/test/app/app/js/test_coffee.coffee +4 -0
- data/test/app/app/js/test_javascript.js +4 -0
- data/test/app/init.rb +5 -0
- data/test/stories/admin_css_story.rb +18 -0
- data/test/stories/css_js_story.rb +29 -0
- data/test/stories/first_login_story.rb +29 -0
- data/test/stories/visit_story.rb +39 -0
- data/test/stories_helper.rb +58 -0
- data/test/test_cli_helper.rb +31 -0
- data/test/test_helper.rb +111 -0
- data/test/test_temp_helper.rb +9 -0
- data/test/unit/cli_test.rb +38 -0
- data/test/unit/dump_test.rb +14 -0
- data/test/unit/extensions_test.rb +18 -0
- data/test/unit/files_test.rb +14 -0
- data/test/unit/flash_helper_test.rb +36 -0
- data/test/unit/html_helper_test.rb +29 -0
- data/test/unit/jquery_helper_test.rb +18 -0
- data/test/unit/model_test.rb +34 -0
- data/test/unit/page_helpers_test.rb +36 -0
- data/test/unit/seeder_test.rb +15 -0
- data/test/unit/settings_test.rb +29 -0
- data/test/unit/slug_test.rb +39 -0
- data/test/unit/ss_migration_test.rb +14 -0
- data/test/unit/terra_test.rb +125 -0
- data/test/unit/utils_test.rb +11 -0
- data/vendor/sinatra-sequel/.gitignore +3 -0
- data/vendor/sinatra-sequel/COPYING +18 -0
- data/vendor/sinatra-sequel/README.md +84 -0
- data/vendor/sinatra-sequel/Rakefile +67 -0
- data/vendor/sinatra-sequel/lib/sinatra/sequel.rb +73 -0
- data/vendor/sinatra-sequel/sinatra-sequel.gemspec +39 -0
- data/vendor/sinatra-sequel/spec/spec_sinatra_sequel.rb +70 -0
- metadata +536 -0
data/lib/aura/slugs.rb
ADDED
|
@@ -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
|
+
|
data/lib/aura/subtype.rb
ADDED
|
@@ -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
|
data/lib/aura/tasks.rb
ADDED
|
@@ -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
|
+
|
data/lib/aura/utils.rb
ADDED
|
@@ -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
|
data/lib/aura/version.rb
ADDED
|
@@ -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,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
|