zen 0.2.4.1 → 0.2.5
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/MANIFEST +42 -33
- data/README.md +14 -27
- data/ROADMAP.md +20 -2
- data/{Thorfile → Rakefile} +2 -3
- data/bin/zen +27 -5
- data/lib/zen.rb +70 -52
- data/lib/zen/asset.rb +258 -0
- data/lib/zen/bin/app.rb +42 -0
- data/lib/zen/controller/admin_controller.rb +53 -36
- data/lib/zen/controller/base_controller.rb +13 -8
- data/lib/zen/controller/frontend_controller.rb +4 -3
- data/lib/zen/controller/main_controller.rb +17 -33
- data/lib/zen/error/validation_error.rb +10 -0
- data/lib/zen/ext/string.rb +185 -0
- data/lib/zen/helper/acl.rb +120 -92
- data/lib/zen/helper/common.rb +1 -3
- data/lib/zen/helper/theme.rb +73 -0
- data/lib/zen/language.rb +66 -57
- data/lib/zen/layout/admin.xhtml +5 -48
- data/lib/zen/layout/login.xhtml +4 -44
- data/lib/zen/model/methods.rb +1 -1
- data/lib/zen/model/settings.rb +0 -3
- data/lib/zen/package.rb +101 -83
- data/lib/zen/package/base.rb +62 -0
- data/lib/zen/package/categories/lib/categories.rb +29 -10
- data/lib/zen/package/categories/lib/categories/controller/categories.rb +4 -5
- data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +4 -5
- data/lib/zen/package/categories/lib/categories/language/en/category_groups.yml +4 -3
- data/lib/zen/package/categories/lib/categories/model/category.rb +2 -2
- data/lib/zen/package/categories/lib/categories/model/category_group.rb +3 -3
- data/lib/zen/package/categories/lib/categories/plugin/categories.rb +130 -0
- data/lib/zen/package/categories/lib/categories/view/admin/categories/form.xhtml +1 -1
- data/lib/zen/package/categories/lib/categories/view/admin/categories/index.xhtml +2 -2
- data/lib/zen/package/categories/lib/categories/view/admin/category-groups/index.xhtml +11 -6
- data/lib/zen/package/comments/lib/comments.rb +23 -13
- data/lib/zen/package/comments/lib/comments/controller/comments.rb +4 -5
- data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +7 -8
- data/lib/zen/package/comments/lib/comments/model/comment.rb +4 -4
- data/lib/zen/package/comments/lib/comments/plugin/comments.rb +111 -0
- data/lib/zen/package/comments/lib/comments/view/admin/comments/form.xhtml +2 -2
- data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +3 -3
- data/lib/zen/package/custom_fields/lib/custom_fields.rb +18 -11
- data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +4 -5
- data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +4 -5
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +2 -2
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +3 -3
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +3 -3
- data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/index.xhtml +9 -5
- data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/form.xhtml +1 -1
- data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/index.xhtml +3 -3
- data/lib/zen/package/menus/lib/menus.rb +25 -43
- data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +5 -6
- data/lib/zen/package/menus/lib/menus/controller/menus.rb +9 -5
- data/lib/zen/package/menus/lib/menus/helper/menu_item.rb +4 -4
- data/lib/zen/package/menus/lib/menus/model/menu.rb +2 -2
- data/lib/zen/package/menus/lib/menus/model/menu_item.rb +4 -1
- data/lib/zen/package/menus/lib/menus/plugin/menus.rb +152 -0
- data/lib/zen/package/menus/lib/menus/view/admin/menu-items/form.xhtml +1 -1
- data/lib/zen/package/menus/lib/menus/view/admin/menu-items/index.xhtml +3 -3
- data/lib/zen/package/menus/lib/menus/view/admin/menus/index.xhtml +7 -7
- data/lib/zen/package/sections/lib/sections.rb +32 -16
- data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +9 -18
- data/lib/zen/package/sections/lib/sections/controller/sections.rb +8 -9
- data/lib/zen/package/sections/lib/sections/language/en/section_entries.yml +1 -1
- data/lib/zen/package/sections/lib/sections/model/section.rb +4 -4
- data/lib/zen/package/sections/lib/sections/model/section_entry.rb +9 -10
- data/lib/zen/package/sections/lib/sections/plugin/section_entries.rb +224 -0
- data/lib/zen/package/sections/lib/sections/plugin/sections.rb +85 -0
- data/lib/zen/package/sections/lib/sections/view/admin/form.xhtml +1 -1
- data/lib/zen/package/sections/lib/sections/view/admin/index.xhtml +9 -5
- data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +2 -2
- data/lib/zen/package/settings/lib/settings.rb +145 -10
- data/lib/zen/package/settings/lib/settings/controller/settings.rb +28 -24
- data/lib/zen/package/settings/lib/settings/language/en/settings.yml +10 -0
- data/lib/zen/package/settings/lib/settings/model/setting.rb +3 -64
- data/lib/zen/package/settings/lib/settings/plugin/group_base.rb +40 -0
- data/lib/zen/package/settings/lib/settings/plugin/setting_base.rb +76 -0
- data/lib/zen/package/settings/lib/settings/plugin/settings.rb +236 -0
- data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +20 -49
- data/lib/zen/package/settings/migrations/1295597111_create_schema.rb +0 -12
- data/lib/zen/package/settings/migrations/1303196915_settings_plugin.rb +31 -0
- data/lib/zen/package/users/lib/users.rb +18 -15
- data/lib/zen/package/users/lib/users/controller/access_rules.rb +44 -8
- data/lib/zen/package/users/lib/users/controller/user_groups.rb +4 -5
- data/lib/zen/package/users/lib/users/controller/users.rb +5 -6
- data/lib/zen/package/users/lib/users/language/en/access_rules.yml +11 -9
- data/lib/zen/package/users/lib/users/model/access_rule.rb +7 -6
- data/lib/zen/package/users/lib/users/model/user.rb +4 -4
- data/lib/zen/package/users/lib/users/model/user_group.rb +3 -3
- data/lib/zen/package/users/lib/users/public/admin/js/users/access_rules.js +50 -0
- data/lib/zen/package/users/lib/users/view/admin/access-rules/form.xhtml +32 -29
- data/lib/zen/package/users/lib/users/view/admin/access-rules/index.xhtml +8 -6
- data/lib/zen/package/users/lib/users/view/admin/user-groups/index.xhtml +3 -3
- data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +2 -2
- data/lib/zen/package/users/migrations/1303510943_class_rules.rb +13 -0
- data/lib/zen/plugin.rb +110 -104
- data/lib/zen/plugin/base.rb +46 -0
- data/lib/zen/{liquid/controller_behavior.rb → plugin/controller.rb} +9 -7
- data/lib/zen/plugin/helper.rb +47 -0
- data/lib/zen/plugin/markup/lib/markup.rb +14 -0
- data/lib/zen/plugin/markup/lib/markup/language/en/markup.yml +6 -0
- data/lib/zen/plugin/markup/lib/markup/markup.rb +154 -0
- data/lib/zen/public/admin/css/forms.css +4 -0
- data/lib/zen/public/admin/css/general.css +15 -15
- data/lib/zen/public/admin/css/layout.css +10 -10
- data/lib/zen/public/admin/css/reset.css +123 -0
- data/lib/zen/public/admin/images/icons/accept.png +0 -0
- data/lib/zen/public/admin/images/icons/add.png +0 -0
- data/lib/zen/public/admin/images/icons/back.png +0 -0
- data/lib/zen/public/admin/images/icons/bold.png +0 -0
- data/lib/zen/public/admin/images/icons/close.png +0 -0
- data/lib/zen/public/admin/images/icons/delete.png +0 -0
- data/lib/zen/public/admin/images/icons/edit.png +0 -0
- data/lib/zen/public/admin/images/icons/error.png +0 -0
- data/lib/zen/public/admin/images/icons/help.png +0 -0
- data/lib/zen/public/admin/images/icons/info.png +0 -0
- data/lib/zen/public/admin/images/icons/italic.png +0 -0
- data/lib/zen/public/admin/images/icons/large/error.png +0 -0
- data/lib/zen/public/admin/images/icons/large/notice.png +0 -0
- data/lib/zen/public/admin/images/icons/large/success.png +0 -0
- data/lib/zen/public/admin/images/icons/link.png +0 -0
- data/lib/zen/public/admin/images/icons/logout.png +0 -0
- data/lib/zen/public/admin/images/icons/ol.png +0 -0
- data/lib/zen/public/admin/images/icons/pdf.png +0 -0
- data/lib/zen/public/admin/images/icons/ul.png +0 -0
- data/lib/zen/public/admin/images/icons/user.png +0 -0
- data/lib/zen/public/admin/images/icons/view.png +0 -0
- data/lib/zen/public/admin/js/mootools/core.js +384 -333
- data/lib/zen/public/admin/js/mootools/more.js +256 -231
- data/lib/zen/public/admin/js/vendor/{datepicker/Picker.Date.js → datepicker.js} +447 -0
- data/lib/zen/public/admin/js/vendor/yepnope.js +1 -0
- data/lib/zen/public/admin/js/zen/editor/base.js +8 -1
- data/lib/zen/public/admin/js/zen/init.js +89 -26
- data/lib/zen/public/favicon.ico +0 -0
- data/lib/zen/task.rb +7 -0
- data/lib/zen/task/build.rake +60 -0
- data/lib/zen/task/clean.rake +27 -0
- data/lib/zen/task/db.rake +111 -0
- data/lib/zen/task/package.rake +67 -0
- data/lib/zen/task/plugin.rake +24 -0
- data/lib/zen/task/proto.rake +95 -0
- data/lib/zen/task/theme.rake +68 -0
- data/lib/zen/theme.rb +28 -55
- data/lib/zen/theme/base.rb +64 -0
- data/lib/zen/validation.rb +149 -0
- data/lib/zen/version.rb +1 -1
- data/lib/zen/view/bottom.xhtml +6 -0
- data/lib/zen/view/main.xhtml +32 -0
- data/proto/app/Rakefile +12 -0
- data/proto/app/app.rb +6 -6
- data/proto/app/config/config.rb +7 -14
- data/proto/app/config/database.rb +0 -20
- data/proto/app/start.rb +0 -1
- data/proto/app/{vendor/themes → task}/.gitkeep +0 -0
- data/proto/app/vendor/theme/.gitkeep +0 -0
- data/proto/package/lib/package.rb +8 -17
- data/proto/package/lib/package/controller/controllers.rb +4 -4
- data/proto/package/lib/package/language/en/languages.yml +3 -3
- data/proto/package/lib/package/model/model.rb +1 -1
- metadata +73 -73
- data/lib/zen/bin/base.rb +0 -109
- data/lib/zen/helper/asset.rb +0 -106
- data/lib/zen/liquid/general.rb +0 -94
- data/lib/zen/liquid/redirect.rb +0 -70
- data/lib/zen/liquid/strip.rb +0 -60
- data/lib/zen/package/categories/lib/categories/liquid/categories.rb +0 -16
- data/lib/zen/package/comments/lib/comments/liquid/comment_form.rb +0 -127
- data/lib/zen/package/comments/lib/comments/liquid/comments.rb +0 -115
- data/lib/zen/package/menus/lib/menus/liquid/menus.rb +0 -152
- data/lib/zen/package/sections/lib/sections/liquid/section_entries.rb +0 -228
- data/lib/zen/package/sections/lib/sections/liquid/sections.rb +0 -77
- data/lib/zen/package/settings/lib/settings/liquid/setting.rb +0 -58
- data/lib/zen/package/users/lib/users/liquid/user.rb +0 -77
- data/lib/zen/package/users/lib/users/liquid/users.rb +0 -82
- data/lib/zen/plugin/markup.rb +0 -30
- data/lib/zen/public/admin/css/boilerplate.css +0 -176
- data/lib/zen/public/admin/images/general/noise.jpg +0 -0
- data/lib/zen/public/admin/js/vendor/datepicker/Picker.Attach.js +0 -137
- data/lib/zen/public/admin/js/vendor/datepicker/Picker.js +0 -291
- data/lib/zen/public/admin/js/vendor/datepicker/README.md +0 -325
- data/lib/zen/public/admin/js/vendor/datepicker/locale.js +0 -16
- data/lib/zen/strict_struct.rb +0 -36
- data/lib/zen/task/build.rb +0 -123
- data/lib/zen/task/clean.rb +0 -46
- data/lib/zen/task/db.rb +0 -130
- data/lib/zen/task/package.rb +0 -87
- data/lib/zen/task/proto.rb +0 -116
- data/lib/zen/task/theme.rb +0 -88
- data/proto/app/Thorfile +0 -4
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Task group for managing plugins.
|
|
3
|
+
#
|
|
4
|
+
# @author Yorick Peterse
|
|
5
|
+
# @since 0.2.5
|
|
6
|
+
#
|
|
7
|
+
namespace :plugin do
|
|
8
|
+
|
|
9
|
+
desc 'Lists all installed plugins'
|
|
10
|
+
task :list do
|
|
11
|
+
Zen::Plugin::Registered.each do |name, pkg|
|
|
12
|
+
message = <<-MSG
|
|
13
|
+
--------------------------
|
|
14
|
+
Name: #{name}
|
|
15
|
+
Author: #{pkg.author}
|
|
16
|
+
|
|
17
|
+
#{pkg.about}
|
|
18
|
+
MSG
|
|
19
|
+
|
|
20
|
+
puts message
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require __DIR__('../ext/string')
|
|
3
|
+
|
|
4
|
+
##
|
|
5
|
+
# Task group used for creating various prototypes.
|
|
6
|
+
#
|
|
7
|
+
# @author Yorick Peterse
|
|
8
|
+
# @since 0.2.5
|
|
9
|
+
#
|
|
10
|
+
namespace :proto do
|
|
11
|
+
|
|
12
|
+
desc 'Creates a new migration'
|
|
13
|
+
task :migration, :directory, :name do |task, args|
|
|
14
|
+
# Validate the input
|
|
15
|
+
if !args[:directory]
|
|
16
|
+
abort 'You need to specify a directory for the migration.'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
if !args[:name]
|
|
20
|
+
abort 'You need to specify a name for the migration.'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
if !File.directory?(args[:directory])
|
|
24
|
+
abort "The directory #{args[:directory]} doesn't exist."
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
proto_path = File.expand_path('../../../../proto/migration.rb', __FILE__)
|
|
28
|
+
new_path = File.join(args[:directory], "#{Time.new.to_i}_#{args[:name]}.rb")
|
|
29
|
+
|
|
30
|
+
# Copy the prototype to the location
|
|
31
|
+
begin
|
|
32
|
+
FileUtils.cp(proto_path, new_path)
|
|
33
|
+
puts "Migration saved in #{new_path}"
|
|
34
|
+
rescue => e
|
|
35
|
+
puts "Failed to create the migration: #{e.message}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
desc 'Creates a new package'
|
|
40
|
+
task :package, :directory, :name do |task, args|
|
|
41
|
+
# Validate the input
|
|
42
|
+
if !args[:name]
|
|
43
|
+
abort 'You need to specify the name of your package.'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
if !args[:directory]
|
|
47
|
+
abort 'You need to specify a directory where the package should be saved.'
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
name = args[:name]
|
|
51
|
+
proto = File.expand_path('../../../../proto/package', __FILE__)
|
|
52
|
+
klass = name.camel_case
|
|
53
|
+
extension_path = File.join(args[:directory], name)
|
|
54
|
+
|
|
55
|
+
FileUtils.rm_rf(extension_path)
|
|
56
|
+
|
|
57
|
+
# Rename all files and folders
|
|
58
|
+
begin
|
|
59
|
+
FileUtils.cp_r(proto, extension_path)
|
|
60
|
+
|
|
61
|
+
lib_path = "#{extension_path}/lib/#{name}"
|
|
62
|
+
|
|
63
|
+
# Rename the base file and directory
|
|
64
|
+
FileUtils.mv("#{extension_path}/lib/package" , lib_path)
|
|
65
|
+
FileUtils.mv("#{extension_path}/lib/package.rb", "#{extension_path}/lib/#{name}.rb")
|
|
66
|
+
|
|
67
|
+
controller_filename = klass.snake_case.pluralize
|
|
68
|
+
model_filename = klass.snake_case.singularize
|
|
69
|
+
|
|
70
|
+
# Generate the controller
|
|
71
|
+
controller = File.open("#{lib_path}/controller/controllers.rb", 'r').read
|
|
72
|
+
controller.gsub!('CONTROLLER', klass.pluralize)
|
|
73
|
+
controller.gsub!('EXTENSION' , klass.pluralize)
|
|
74
|
+
|
|
75
|
+
FileUtils.mv("#{lib_path}/controller/controllers.rb", "#{lib_path}/controller/#{controller_filename}.rb")
|
|
76
|
+
File.open("#{lib_path}/controller/#{controller_filename}.rb", 'w').write(controller)
|
|
77
|
+
|
|
78
|
+
# Move the view directory
|
|
79
|
+
FileUtils.mv("#{lib_path}/view/admin/package", "#{lib_path}/view/admin/#{controller_filename}")
|
|
80
|
+
|
|
81
|
+
# Generate the model
|
|
82
|
+
model = File.open("#{lib_path}/model/model.rb", 'r').read
|
|
83
|
+
model.gsub!('MODEL' , klass.singularize)
|
|
84
|
+
model.gsub!('EXTENSION' , klass.pluralize)
|
|
85
|
+
|
|
86
|
+
FileUtils.mv("#{lib_path}/model/model.rb", "#{lib_path}/model/#{model_filename}.rb")
|
|
87
|
+
File.open("#{lib_path}/model/#{model_filename}.rb", 'w').write(model)
|
|
88
|
+
|
|
89
|
+
puts "Done! Don't forget to rename the controllers/models/etc"
|
|
90
|
+
rescue => e
|
|
91
|
+
abort "Failed to generate the package: #{e}"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Task group for managing themes.
|
|
3
|
+
#
|
|
4
|
+
# @author Yorick Peterse
|
|
5
|
+
# @since 0.2.5
|
|
6
|
+
#
|
|
7
|
+
namespace :theme do
|
|
8
|
+
|
|
9
|
+
desc 'Lists all installed themes'
|
|
10
|
+
task :list do
|
|
11
|
+
Zen::Theme::Registered.each do |name, pkg|
|
|
12
|
+
message = <<-MSG
|
|
13
|
+
--------------------------
|
|
14
|
+
Name: #{name}
|
|
15
|
+
Author: #{pkg.author}
|
|
16
|
+
Template directory: #{pkg.template_dir}
|
|
17
|
+
|
|
18
|
+
#{pkg.about}
|
|
19
|
+
MSG
|
|
20
|
+
|
|
21
|
+
puts message
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
desc 'Migrates a theme to the given version'
|
|
26
|
+
task :migrate, :name, :version do |task, args|
|
|
27
|
+
if !args[:name]
|
|
28
|
+
abort 'You need to specify the name of the theme.'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
if !args[:version]
|
|
32
|
+
version = nil
|
|
33
|
+
puts 'No version specified, choosing the most recent version...'
|
|
34
|
+
else
|
|
35
|
+
version = args[:version].to_i
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
name = args[:name].to_sym
|
|
39
|
+
|
|
40
|
+
if !Zen::Theme::Registered[name]
|
|
41
|
+
abort 'The specified theme does not exist.'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
theme = Zen::Theme::Registered[name]
|
|
45
|
+
table = 'migrations_theme_' + theme.name.to_s
|
|
46
|
+
|
|
47
|
+
# Fetch the migrations directory
|
|
48
|
+
if theme.respond_to?(:migration_dir) and !theme.migration_dir.nil?
|
|
49
|
+
dir = theme.migration_dir
|
|
50
|
+
else
|
|
51
|
+
abort 'The specified theme does not have a migrations directory.'
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
if !File.directory?(dir)
|
|
55
|
+
abort 'The theme\'s migration directory doesn\'t exist.'
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Time to migrate the theme
|
|
59
|
+
puts 'Migrating...'
|
|
60
|
+
|
|
61
|
+
Zen::Database.handle.transaction do
|
|
62
|
+
Sequel::Migrator.run(
|
|
63
|
+
Zen::Database.handle, dir, :table => table, :target => version
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
data/lib/zen/theme.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require __DIR__('error/theme_error')
|
|
2
|
+
require __DIR__('theme/base')
|
|
2
3
|
require 'pathname'
|
|
3
4
|
|
|
4
5
|
#:nodoc:
|
|
@@ -25,32 +26,22 @@ module Zen
|
|
|
25
26
|
# Example:
|
|
26
27
|
#
|
|
27
28
|
# Zen::Theme.add do |theme|
|
|
28
|
-
# theme.author
|
|
29
|
-
# theme.name
|
|
30
|
-
# theme.identifier = 'com.yorickpeterse.theme.default'
|
|
29
|
+
# theme.author = 'Yorick Peterse'
|
|
30
|
+
# theme.name = 'default'
|
|
31
31
|
# end
|
|
32
32
|
#
|
|
33
|
-
# The "identifier" key is very important and just like packages and plugins it should
|
|
34
|
-
# always stay the same once it has been set.
|
|
35
|
-
#
|
|
36
|
-
# ## Identifiers
|
|
37
|
-
#
|
|
38
|
-
# Theme identifiers should be in the following format:
|
|
39
|
-
#
|
|
40
|
-
# com.VENDOR.theme.NAME
|
|
41
|
-
#
|
|
42
|
-
# For example:
|
|
43
|
-
#
|
|
44
|
-
# com.yorickpeterse.theme.fancy_blog
|
|
45
|
-
#
|
|
46
33
|
# @author Yorick Peterse
|
|
47
34
|
# @since 0.2.4
|
|
48
|
-
# @attr_reader [Array] themes Array of all installed themes.
|
|
49
35
|
#
|
|
50
36
|
module Theme
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
37
|
+
##
|
|
38
|
+
# Hash containing all registered themes. The keys are the names of the themes and
|
|
39
|
+
# the values instances of Zen::Theme::Base.
|
|
40
|
+
#
|
|
41
|
+
# @author Yorick Peterse
|
|
42
|
+
# @since 0.2.5
|
|
43
|
+
#
|
|
44
|
+
Registered = {}
|
|
54
45
|
|
|
55
46
|
##
|
|
56
47
|
# Adds a new theme to Zen. Note that the theme won't be used unless it has been set
|
|
@@ -58,33 +49,15 @@ module Zen
|
|
|
58
49
|
#
|
|
59
50
|
# @author Yorick Peterse
|
|
60
51
|
# @since 0.2.4
|
|
61
|
-
# @yield [theme] Struct object containing all getter/setters for each theme.
|
|
62
52
|
#
|
|
63
53
|
def self.add
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
required = [:name, :author, :about, :identifier, :template_dir]
|
|
67
|
-
theme = Zen::StrictStruct.new(
|
|
68
|
-
:name, :author, :about, :url, :identifier, :template_dir, :partial_dir,
|
|
69
|
-
:public_dir, :migration_dir
|
|
70
|
-
).new
|
|
54
|
+
theme = Base.new
|
|
71
55
|
|
|
72
56
|
yield theme
|
|
73
57
|
|
|
74
|
-
#
|
|
75
|
-
theme.validate
|
|
76
|
-
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Validate all paths set
|
|
80
|
-
[:template_dir, :partial_dir, :public_dir, :migration_dir].each do |k|
|
|
81
|
-
# Only validate the path if it has been set
|
|
82
|
-
if theme.respond_to?(k) and !theme.send(k).nil? and !theme.send(k).empty?
|
|
83
|
-
if !File.exist?(theme.send(k))
|
|
84
|
-
raise(Zen::ThemeError, "The path #{k} doesn't exist.")
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
58
|
+
# Validate the theme
|
|
59
|
+
theme.validate
|
|
60
|
+
theme.name = theme.name.to_sym
|
|
88
61
|
|
|
89
62
|
# Do we have a public directory?
|
|
90
63
|
if theme.respond_to?(:public_dir) and !theme.public_dir.nil?
|
|
@@ -98,11 +71,7 @@ module Zen
|
|
|
98
71
|
end
|
|
99
72
|
end
|
|
100
73
|
|
|
101
|
-
|
|
102
|
-
raise(Zen::ThemeError, "The theme #{theme.name} already exists.")
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
@themes[theme.identifier] = theme
|
|
74
|
+
Registered[theme.name] = theme
|
|
106
75
|
end
|
|
107
76
|
|
|
108
77
|
##
|
|
@@ -110,19 +79,23 @@ module Zen
|
|
|
110
79
|
#
|
|
111
80
|
# @author Yorick Peterse
|
|
112
81
|
# @since 0.2.4
|
|
113
|
-
# @param [String]
|
|
114
|
-
# @return [
|
|
82
|
+
# @param [String/Symbol] name The name of the theme to retrieve.
|
|
83
|
+
# @return [Zen::Theme::Base]
|
|
115
84
|
#
|
|
116
|
-
def self.[](
|
|
117
|
-
if
|
|
118
|
-
|
|
85
|
+
def self.[](name)
|
|
86
|
+
if name.class != Symbol
|
|
87
|
+
name = name.to_sym
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
if Registered.nil?
|
|
91
|
+
raise(Zen::ThemeError, "No themes have been added yet.")
|
|
119
92
|
end
|
|
120
93
|
|
|
121
|
-
if
|
|
122
|
-
raise(Zen::ThemeError, "The theme #{
|
|
94
|
+
if !Registered[name]
|
|
95
|
+
raise(Zen::ThemeError, "The theme #{name} doesn't exist.")
|
|
123
96
|
end
|
|
124
97
|
|
|
125
|
-
return
|
|
98
|
+
return Registered[name]
|
|
126
99
|
end
|
|
127
100
|
|
|
128
101
|
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#:nodoc:
|
|
2
|
+
module Zen
|
|
3
|
+
#:nodoc:
|
|
4
|
+
module Theme
|
|
5
|
+
##
|
|
6
|
+
# Base class used for all themes.
|
|
7
|
+
#
|
|
8
|
+
# @author Yorick Peterse
|
|
9
|
+
# @since 0.2.5
|
|
10
|
+
#
|
|
11
|
+
class Base
|
|
12
|
+
include ::Zen::Validation
|
|
13
|
+
|
|
14
|
+
# The name of the theme
|
|
15
|
+
attr_accessor :name
|
|
16
|
+
|
|
17
|
+
# The author of the theme
|
|
18
|
+
attr_accessor :author
|
|
19
|
+
|
|
20
|
+
# A small description of the theme
|
|
21
|
+
attr_accessor :about
|
|
22
|
+
|
|
23
|
+
# The URL to the theme's homepage
|
|
24
|
+
attr_accessor :url
|
|
25
|
+
|
|
26
|
+
# Path to the directory containing all templates
|
|
27
|
+
attr_accessor :template_dir
|
|
28
|
+
|
|
29
|
+
# Path to the directory containing all template partials
|
|
30
|
+
attr_accessor :partial_dir
|
|
31
|
+
|
|
32
|
+
# Path to the theme's public directory (useful for CSS and Javascript files)
|
|
33
|
+
attr_accessor :public_dir
|
|
34
|
+
|
|
35
|
+
# Path to the directory containing all migrations for the theme
|
|
36
|
+
attr_accessor :migration_dir
|
|
37
|
+
|
|
38
|
+
##
|
|
39
|
+
# Validates all attributes of this class.
|
|
40
|
+
#
|
|
41
|
+
# @author Yorick Peterse
|
|
42
|
+
# @since 0.2.5
|
|
43
|
+
#
|
|
44
|
+
def validate
|
|
45
|
+
validates_presence([:name, :author, :about, :template_dir])
|
|
46
|
+
|
|
47
|
+
# Validate all the directories
|
|
48
|
+
validates_filepath(:template_dir)
|
|
49
|
+
|
|
50
|
+
[:partial_dir, :public_dir, :migration_dir].each do |m|
|
|
51
|
+
if !send(m).nil?
|
|
52
|
+
validates_filepath(m)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Check if the theme hasn't already been registered
|
|
57
|
+
if ::Zen::Theme::Registered.key?(name.to_sym)
|
|
58
|
+
raise(::Zen::ValidationError, "The theme #{name} has already been registered.")
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
require __DIR__('error/validation_error')
|
|
2
|
+
|
|
3
|
+
#:nodoc:
|
|
4
|
+
module Zen
|
|
5
|
+
##
|
|
6
|
+
# The Validation module is a very basic validation framework that's used by various
|
|
7
|
+
# internal modules/classes such as Zen::Plugin and Zen::Package.
|
|
8
|
+
#
|
|
9
|
+
# ## Usage
|
|
10
|
+
#
|
|
11
|
+
# Using the module is pretty simple. Include it, specify the validation rules in a
|
|
12
|
+
# method and call it. All official modules and classes use a method called "validate"
|
|
13
|
+
# but you're free to name it whatever you want. A basic example looks like the
|
|
14
|
+
# following:
|
|
15
|
+
#
|
|
16
|
+
# class Something
|
|
17
|
+
# include Zen::Validation
|
|
18
|
+
#
|
|
19
|
+
# attr_accessor :name
|
|
20
|
+
#
|
|
21
|
+
# def validate
|
|
22
|
+
# validates_presence(:name)
|
|
23
|
+
# end
|
|
24
|
+
# end
|
|
25
|
+
#
|
|
26
|
+
# @author Yorick Peterse
|
|
27
|
+
# @since 0.2.5
|
|
28
|
+
#
|
|
29
|
+
module Validation
|
|
30
|
+
|
|
31
|
+
##
|
|
32
|
+
# Checks if the specified attributes exist and aren't set to nil.
|
|
33
|
+
#
|
|
34
|
+
# @example
|
|
35
|
+
# validates_presence(:name)
|
|
36
|
+
#
|
|
37
|
+
# @author Yorick Peterse
|
|
38
|
+
# @since 0.2.5
|
|
39
|
+
# @param [Array/Symbol/String] attributes Either a single or multiple attributes to
|
|
40
|
+
# validate.
|
|
41
|
+
# @raise [ValidationError] Raised whenever a attribute is missing or is set to nil.
|
|
42
|
+
#
|
|
43
|
+
def validates_presence(attributes)
|
|
44
|
+
if attributes.class != Array
|
|
45
|
+
attributes = [attributes]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
attributes.each do |f|
|
|
49
|
+
if !respond_to?(f) or send(f).nil?
|
|
50
|
+
raise(ValidationError, "The attribute \"#{f}\" doesn't exist.")
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
##
|
|
56
|
+
# Checks if the length of a string matches the given length. You can specify a minimum
|
|
57
|
+
# length, a maximum one as well as both.
|
|
58
|
+
#
|
|
59
|
+
# @example
|
|
60
|
+
# validates_length(:foobar, :min => 5, :max => 10)
|
|
61
|
+
#
|
|
62
|
+
# @author Yorick Peterse
|
|
63
|
+
# @since 0.2.5
|
|
64
|
+
# @param [String/Symbol] attribute The attribute to validate.
|
|
65
|
+
# @param [Hash] options Hash containing the options to use for determining how long
|
|
66
|
+
# the attribute's value should be.
|
|
67
|
+
# @option options [Fixnum] :min The minimum length of the attribute's value.
|
|
68
|
+
# @option options [Fixnum] :max The maximum length of the value.
|
|
69
|
+
# @raise [ValidationError] Raised then the value of the attribute isn't long or short
|
|
70
|
+
# enough.
|
|
71
|
+
#
|
|
72
|
+
def validates_length(attribute, options)
|
|
73
|
+
value = send(attribute)
|
|
74
|
+
|
|
75
|
+
if !value.respond_to?(:length)
|
|
76
|
+
raise(
|
|
77
|
+
ValidationError,
|
|
78
|
+
"The length of \"#{attribute}\" can't be checked as the method \"length\" " +
|
|
79
|
+
"doesn't exist."
|
|
80
|
+
)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Time to validate the length
|
|
84
|
+
length = value.length
|
|
85
|
+
|
|
86
|
+
if options.key?(:min) and length < options[:min]
|
|
87
|
+
raise(ValidationError, "The attribute \"#{attribute}\" is too short.")
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
if options.key?(:max) and length > options[:max]
|
|
91
|
+
raise(ValidationError, "The attribute \"#{attribute}\" is too long.")
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
##
|
|
96
|
+
# Checks if the given attributes match the specified regular expressions.
|
|
97
|
+
# When a hash is specified the keys should be the names of the attributes to validate
|
|
98
|
+
# and the values the regular expressions to use.
|
|
99
|
+
#
|
|
100
|
+
# @example
|
|
101
|
+
# validates_format(:name, /[\w\-]+/)
|
|
102
|
+
# validates_format(:name => /[\w\-]+/, :age => /[0-9]+/)
|
|
103
|
+
#
|
|
104
|
+
# @author Yorick Peterse
|
|
105
|
+
# @since 0.2.5
|
|
106
|
+
# @param [Hash/Symbol] attribute The name of the attribute to validate or a hash
|
|
107
|
+
# containing all the attributes and their regular expressions.
|
|
108
|
+
# @param [Regexp] regexp The regular expression to use when validating a single
|
|
109
|
+
# attribute.
|
|
110
|
+
# @raise [ValidationError] Raised when one of the attributes doesn't matches the
|
|
111
|
+
# regular expression.
|
|
112
|
+
#
|
|
113
|
+
def validates_format(attribute, regexp = nil)
|
|
114
|
+
if attribute.class != Hash
|
|
115
|
+
attribute = {attribute => regexp}
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Try to match all attributes
|
|
119
|
+
attribute.each do |attr, regexp|
|
|
120
|
+
val = send(attr)
|
|
121
|
+
match = val =~ regexp
|
|
122
|
+
|
|
123
|
+
if !match
|
|
124
|
+
raise(ValidationError, "The attribute \"#{attr}\" doesn't match #{regexp}.")
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
##
|
|
130
|
+
# Checks if the specified attribute contains a valid filepath.
|
|
131
|
+
#
|
|
132
|
+
# @example
|
|
133
|
+
# validates_filepath(:directory)
|
|
134
|
+
#
|
|
135
|
+
# @author Yorick Peterse
|
|
136
|
+
# @since 0.2.5
|
|
137
|
+
# @param [String/Symbol] attribute The attribute to validate.
|
|
138
|
+
# @raise [ValidationError] Raised when one of the paths didn't exist.
|
|
139
|
+
#
|
|
140
|
+
def validates_filepath(attribute)
|
|
141
|
+
path = send(attribute)
|
|
142
|
+
|
|
143
|
+
if !File.exist?(path)
|
|
144
|
+
raise(ValidationError, "The path #{path} in \"#{attribute}\" doesn't exist.")
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
end
|
|
149
|
+
end
|