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/admin.rb
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Module: Admin (Aura)
|
|
2
|
+
# Admin stuff.
|
|
3
|
+
#
|
|
4
|
+
# ## Description
|
|
5
|
+
# This is accessible via {Aura.admin}.
|
|
6
|
+
#
|
|
7
|
+
class Aura
|
|
8
|
+
module Admin
|
|
9
|
+
extend self
|
|
10
|
+
|
|
11
|
+
# Class method: menu (Aura::Admin)
|
|
12
|
+
# Usage: Aura.admin.menu
|
|
13
|
+
#
|
|
14
|
+
# Returns admin menu items.
|
|
15
|
+
#
|
|
16
|
+
def menu
|
|
17
|
+
@menu ||= Menu.new
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Class method: css (Aura::Admin)
|
|
21
|
+
# Usage: Aura.admin.css
|
|
22
|
+
#
|
|
23
|
+
# Returns the list of CSS files.
|
|
24
|
+
#
|
|
25
|
+
# ## Description
|
|
26
|
+
# This allows you to customize the admin interface by adding your
|
|
27
|
+
# own CSS files.
|
|
28
|
+
#
|
|
29
|
+
# #### Example
|
|
30
|
+
# This example adds a CSS file to the admin. This should be in your
|
|
31
|
+
# project's `app/init/`.
|
|
32
|
+
#
|
|
33
|
+
# [/app/init/admin.rb (rb)]
|
|
34
|
+
# Aura.admin.css << {:href => '/css/admin-ext.css', :media => 'screen'}
|
|
35
|
+
#
|
|
36
|
+
def css
|
|
37
|
+
@css ||= Array.new([ { :href => '/css/admin.css', :media => 'screen' } ])
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
data/lib/aura/app.rb
ADDED
data/lib/aura/cli.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'shake'
|
|
2
|
+
|
|
3
|
+
# Class: CLI (Aura)
|
|
4
|
+
# The CLI runner.
|
|
5
|
+
#
|
|
6
|
+
# ## Description
|
|
7
|
+
# This is a runner based on the [Shake
|
|
8
|
+
# gem](http://github.com/rstacruz/shake).
|
|
9
|
+
#
|
|
10
|
+
class Aura
|
|
11
|
+
class CLI < Shake
|
|
12
|
+
autoload :Helpers, File.expand_path('../cli/helpers', __FILE__)
|
|
13
|
+
|
|
14
|
+
include Shake::Defaults
|
|
15
|
+
extend Helpers
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
require File.expand_path('../cli/base', __FILE__)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
class Aura::CLI
|
|
2
|
+
# TODO This looks stupid, refactor later
|
|
3
|
+
task :new do
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
require 'aura/version'
|
|
6
|
+
|
|
7
|
+
if params.empty?
|
|
8
|
+
err "Usage: #{$0} new PROJECT_NAME"
|
|
9
|
+
pass
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
name = params.first
|
|
13
|
+
path = File.join(ENV['AURA_ROOT'], 'default')
|
|
14
|
+
|
|
15
|
+
if File.exists?(name)
|
|
16
|
+
err "That path already exists."
|
|
17
|
+
pass
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
FileUtils.mkdir name
|
|
21
|
+
|
|
22
|
+
# Copy everything over
|
|
23
|
+
Dir["#{path}/**/{.*,*}"].sort.each do |from|
|
|
24
|
+
base = from.gsub(path, '')
|
|
25
|
+
fn = File.basename(from)
|
|
26
|
+
target = File.join(name, base)
|
|
27
|
+
|
|
28
|
+
next if ['Gemfile.lock', '.rvmrc'].include?(fn)
|
|
29
|
+
|
|
30
|
+
if File.file?(from)
|
|
31
|
+
FileUtils.mkdir_p File.dirname(target)
|
|
32
|
+
FileUtils.cp from, target
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Edit the Gemfile
|
|
37
|
+
gemfile = File.read(File.join(name, 'Gemfile'))
|
|
38
|
+
version = Aura.prerelease? ? Aura.version : "~> #{Aura.version}"
|
|
39
|
+
gemfile.gsub!("AURA_GEM_VERSION", version)
|
|
40
|
+
|
|
41
|
+
File.open(File.join(name, 'Gemfile'), 'w') { |f| f.write gemfile }
|
|
42
|
+
|
|
43
|
+
show_tree name
|
|
44
|
+
|
|
45
|
+
puts ""
|
|
46
|
+
puts "Done! Get started now:"
|
|
47
|
+
puts ""
|
|
48
|
+
puts " $ cd #{name}"
|
|
49
|
+
puts " $ bundle install"
|
|
50
|
+
puts ""
|
|
51
|
+
puts "Then start it as a Rack app."
|
|
52
|
+
puts ""
|
|
53
|
+
puts " $ rackup"
|
|
54
|
+
puts ""
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
task.description = "Starts a new project"
|
|
58
|
+
task.usage = "new NAME"
|
|
59
|
+
|
|
60
|
+
task :help do
|
|
61
|
+
err "Usage: #{executable} <command>"
|
|
62
|
+
err
|
|
63
|
+
err "Options:"
|
|
64
|
+
err " -v, [--version] Shows the Aura version number and quits"
|
|
65
|
+
err
|
|
66
|
+
err "Commands:"
|
|
67
|
+
tasks.each { |name, task| err " %-20s %s" % [ name, task.description ] }
|
|
68
|
+
err
|
|
69
|
+
err "Description:"
|
|
70
|
+
err " The '#{executable} new' command creates a new Aura application with"
|
|
71
|
+
err " the default directory structure."
|
|
72
|
+
err
|
|
73
|
+
err "Example:"
|
|
74
|
+
err " # This generates a new project in ./my_project."
|
|
75
|
+
err " $ #{executable} new my_project"
|
|
76
|
+
err
|
|
77
|
+
end
|
|
78
|
+
task.description = "Shows this help screen"
|
|
79
|
+
|
|
80
|
+
def self.run(*a)
|
|
81
|
+
if %w(-v --version).include?(a.join(' '))
|
|
82
|
+
require 'aura/version'
|
|
83
|
+
|
|
84
|
+
puts "Aura #{Aura.version}"
|
|
85
|
+
else
|
|
86
|
+
super *a
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Aura::CLI::Helpers
|
|
2
|
+
def color(what, n=32)
|
|
3
|
+
"\033[0;#{n}m#{what}\033[0;m"
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def status(what, message)
|
|
7
|
+
puts "%s %s" % [ color("%12s" % [what], 32), message ]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def show_tree(path, what=:create)
|
|
11
|
+
explore = lambda { |*a| #path, depth=0
|
|
12
|
+
path, depth = a
|
|
13
|
+
depth ||= 0
|
|
14
|
+
|
|
15
|
+
files = Dir["#{path}/{.*,*}"]
|
|
16
|
+
|
|
17
|
+
dirs = files.select { |f| File.directory?(f) && !%w(. ..).include?(File.basename(f)) }
|
|
18
|
+
files = files.select { |f| File.file?(f) }
|
|
19
|
+
|
|
20
|
+
dirname = File.basename(path)
|
|
21
|
+
status :create, path + '/'
|
|
22
|
+
|
|
23
|
+
files.each { |f|
|
|
24
|
+
status '', (path + '/' + color(File.basename(f), 30))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
dirs.each { |d| explore[d, depth+1] }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
explore[path]
|
|
31
|
+
end
|
|
32
|
+
end
|
data/lib/aura/editor.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Module: Editor (Aura)
|
|
2
|
+
# Editor stuff.
|
|
3
|
+
#
|
|
4
|
+
# ## Description
|
|
5
|
+
# This is accessible via {Aura.editor}.
|
|
6
|
+
#
|
|
7
|
+
class Aura
|
|
8
|
+
module Editor
|
|
9
|
+
# Class method: roots (Aura::Editor)
|
|
10
|
+
# Returns the root nodes to be shown on the editor sidebar.
|
|
11
|
+
#
|
|
12
|
+
# ## Usage
|
|
13
|
+
# Aura.editor.roots
|
|
14
|
+
#
|
|
15
|
+
# ## Description
|
|
16
|
+
# Returns instances of `Sequel::Model` as an array of hashes
|
|
17
|
+
# (HashArray).
|
|
18
|
+
#
|
|
19
|
+
def roots
|
|
20
|
+
models = Aura.models.all.select { |m| m.try(:editable?) }
|
|
21
|
+
|
|
22
|
+
models.inject(HashArray.new) do |hash, model|
|
|
23
|
+
hash << { model => model.roots }
|
|
24
|
+
hash
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module_function :roots
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
require 'ostruct'
|
|
3
|
+
|
|
4
|
+
class Aura
|
|
5
|
+
ExtensionNotFound = Class.new(StandardError)
|
|
6
|
+
|
|
7
|
+
# Class: Extension (Aura)
|
|
8
|
+
# A class representing an extension in Aura.
|
|
9
|
+
#
|
|
10
|
+
# #### Lookup
|
|
11
|
+
# Get an Extension instance by passing an extension name.
|
|
12
|
+
#
|
|
13
|
+
# ext = Aura::Extension['base']
|
|
14
|
+
#
|
|
15
|
+
# #### Loading extensions
|
|
16
|
+
#
|
|
17
|
+
# ext.active? #=> false (probably)
|
|
18
|
+
# ext.load!
|
|
19
|
+
# ext.active? #=> true
|
|
20
|
+
#
|
|
21
|
+
# #### Getting extension info
|
|
22
|
+
# These are loaded from an extension's YAML file.
|
|
23
|
+
#
|
|
24
|
+
# ext.info #=> #<OStruct>
|
|
25
|
+
# ext.info.author
|
|
26
|
+
#
|
|
27
|
+
# #### Getting paths
|
|
28
|
+
# Use {Aura::Extension#path}.
|
|
29
|
+
#
|
|
30
|
+
# ext.path #=> ~/aura/extensions/base
|
|
31
|
+
# ext.path('init.rb') #=> ~/aura/extensions/base/init.rb
|
|
32
|
+
#
|
|
33
|
+
# Aura::Extension.active # Active extensions (Array of #<Extension>)
|
|
34
|
+
# Aura::Extension.all # All extensions (Array of #<Extension>)
|
|
35
|
+
#
|
|
36
|
+
# #### Manual instanciation
|
|
37
|
+
# You can pass a path to the constructor.
|
|
38
|
+
#
|
|
39
|
+
# ext = Aura::Extension.new('/path/to/ext')
|
|
40
|
+
#
|
|
41
|
+
class Extension
|
|
42
|
+
attr_reader :name
|
|
43
|
+
|
|
44
|
+
# Returns an extension with the given ext name/path.
|
|
45
|
+
# Returns nil if it's not found.
|
|
46
|
+
def self.[](name)
|
|
47
|
+
self.new(name)
|
|
48
|
+
rescue ExtensionNotFound
|
|
49
|
+
nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Returns an extension with the given ext name/path.
|
|
53
|
+
# Raises ExtensionNotFound if it's not found.
|
|
54
|
+
def initialize(name)
|
|
55
|
+
@path, @name = nil
|
|
56
|
+
|
|
57
|
+
if File.directory?(name)
|
|
58
|
+
@path, @name = name, File.basename(name)
|
|
59
|
+
|
|
60
|
+
elsif Main.respond_to?(:extensions_path)
|
|
61
|
+
@name = name
|
|
62
|
+
[Main.extensions_path].flatten.each do |dir|
|
|
63
|
+
next unless @path.nil?
|
|
64
|
+
@path = File.join(dir, name)
|
|
65
|
+
@path = nil unless File.directory?(@path)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
raise ExtensionNotFound unless File.directory?(@path.to_s)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Method: path (Aura::Extension)
|
|
73
|
+
# Returns the path of the extension.
|
|
74
|
+
#
|
|
75
|
+
# ## Description
|
|
76
|
+
# If arguments are given, they are joined into the extension's path.
|
|
77
|
+
# nil will be returned if the path does not exist.
|
|
78
|
+
#
|
|
79
|
+
# ## Example
|
|
80
|
+
#
|
|
81
|
+
# Aura::Extension['base'].path #=> ~/aura/extensions/base
|
|
82
|
+
# Aura::Extension['base'].path('init.rb') #=> ~/aura/extensions/base/init.rb
|
|
83
|
+
#
|
|
84
|
+
def path(*a)
|
|
85
|
+
return @path if a.empty?
|
|
86
|
+
ret = File.join(@path, *(a.map { |arg| arg.to_s }))
|
|
87
|
+
ret = File.expand_path(ret) # Try to fix some heroku issues (?)
|
|
88
|
+
File.exists?(ret) ? ret : nil
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Method: load! (Aura::Extension)
|
|
92
|
+
# Loads an extension.
|
|
93
|
+
#
|
|
94
|
+
def load!
|
|
95
|
+
# TODO Don't load a module that's already loaded
|
|
96
|
+
|
|
97
|
+
# Load the main file
|
|
98
|
+
fname = path("#{name}.rb")
|
|
99
|
+
require fname unless fname.nil?
|
|
100
|
+
|
|
101
|
+
# Load the basic things usually autoloaded.
|
|
102
|
+
Dir["#{@path}/{init,models,routes,helpers}/*.rb"].each { |f| require f }
|
|
103
|
+
|
|
104
|
+
# Ensure public/ works
|
|
105
|
+
public_path = path(:public)
|
|
106
|
+
Main.add_public(public_path) unless public_path.nil?
|
|
107
|
+
|
|
108
|
+
# Add the view path, if it has
|
|
109
|
+
if path(:views)
|
|
110
|
+
paths = [path(:views)]
|
|
111
|
+
paths += Main.multi_views if Main.respond_to?(:multi_views)
|
|
112
|
+
Main.set :multi_views, paths
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Method: active? (Aura::Extension)
|
|
117
|
+
# Determines if the given extension is currently active in the config.
|
|
118
|
+
#
|
|
119
|
+
def active?
|
|
120
|
+
self.class.active_names.include?(@name)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Initializes an extension after it's already loaded.
|
|
124
|
+
# This is done after all extensions are loaded.
|
|
125
|
+
#
|
|
126
|
+
def init
|
|
127
|
+
fname = path("init.rb")
|
|
128
|
+
load fname unless fname.nil?
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Method: info (Aura::Extension)
|
|
132
|
+
# Returns an OpenStruct of information on the extension.
|
|
133
|
+
#
|
|
134
|
+
# ## Example
|
|
135
|
+
#
|
|
136
|
+
# Aura::Extension['default_theme'].info
|
|
137
|
+
# Aura::Extension['default_theme'].info.author
|
|
138
|
+
#
|
|
139
|
+
def info
|
|
140
|
+
return @info unless @info.nil?
|
|
141
|
+
|
|
142
|
+
fname = path('info.yml')
|
|
143
|
+
return nil if fname.nil?
|
|
144
|
+
|
|
145
|
+
@info ||= OpenStruct.new(YAML::load_file(fname).merge({:path => @path}))
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
alias to_s name
|
|
149
|
+
|
|
150
|
+
# Class method: active (Aura::Extension)
|
|
151
|
+
# Returns all the extensions that are loaded in the config.
|
|
152
|
+
#
|
|
153
|
+
# ## See also
|
|
154
|
+
# * {Aura::Extension.all}
|
|
155
|
+
#
|
|
156
|
+
def self.active
|
|
157
|
+
self.active_names.map { |ext| self[ext] }.compact
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Class method: active_names (Aura::Extension)
|
|
161
|
+
# Returns all names of the extensions that are loaded in the config.
|
|
162
|
+
#
|
|
163
|
+
# ## Description
|
|
164
|
+
# Returns an array of strings.
|
|
165
|
+
#
|
|
166
|
+
def self.active_names
|
|
167
|
+
exts = Array.new
|
|
168
|
+
exts += Main.additional_extensions if Main.respond_to?(:additional_extensions)
|
|
169
|
+
exts
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Class method: all (Aura::Extension)
|
|
173
|
+
# Returns all extensions (not just the ones loaded).
|
|
174
|
+
#
|
|
175
|
+
# ## Description
|
|
176
|
+
# Returns an array of {Aura::Extension} instances.
|
|
177
|
+
#
|
|
178
|
+
# ## See also
|
|
179
|
+
# * {Aura::Extension.active}
|
|
180
|
+
#
|
|
181
|
+
def self.all
|
|
182
|
+
return @all unless @all.nil?
|
|
183
|
+
|
|
184
|
+
paths = Main.extensions_path.map { |path| Dir["#{path}/*"] }.flatten
|
|
185
|
+
|
|
186
|
+
@all ||= paths.uniq.map { |path| self.new(path) }.compact
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
data/lib/aura/files.rb
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Module: Files (Aura)
|
|
2
|
+
# Files stuff.
|
|
3
|
+
#
|
|
4
|
+
# ## Description
|
|
5
|
+
# This is accessible via {Aura.files}.
|
|
6
|
+
#
|
|
7
|
+
# These functions checks for files in:
|
|
8
|
+
#
|
|
9
|
+
# * Aura's default app stuff (`(aura gem)/app/`)
|
|
10
|
+
# * Each of the active extensions's folders (`(extension)/`)
|
|
11
|
+
# * Your applications (`(application)/app/`)
|
|
12
|
+
#
|
|
13
|
+
class Aura
|
|
14
|
+
module Files
|
|
15
|
+
# Method [] (Aura::Files)
|
|
16
|
+
# Finds a file's path.
|
|
17
|
+
#
|
|
18
|
+
def self.[](fname)
|
|
19
|
+
try = lambda { |f| f if File.exists?(f) }
|
|
20
|
+
|
|
21
|
+
re = try[Aura.gem_root("app/#{fname}")]
|
|
22
|
+
Extension.active.each { |e| re ||= try["#{e.path}/#{fname}"] }
|
|
23
|
+
re ||= try[Aura.root("app/#{fname}")]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Method: glob (Aura::Files)
|
|
27
|
+
# Finds files with the given spec.
|
|
28
|
+
#
|
|
29
|
+
def self.glob(spec)
|
|
30
|
+
paths = Array.new
|
|
31
|
+
paths << Aura.gem_root("app/#{spec}")
|
|
32
|
+
paths += Extension.active.map { |e| "#{e.path}/#{spec}" }
|
|
33
|
+
paths << Aura.root("app/#{spec}")
|
|
34
|
+
|
|
35
|
+
paths.compact.map { |spec| Dir[spec].sort }.flatten.uniq
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|