From 932e054f28dea9e4dc84dffa2b57d8e0fac5703d Mon Sep 17 00:00:00 2001 From: Antonio Terceiro Date: Wed, 30 Jul 2014 17:33:47 -0300 Subject: [PATCH] Add support for base plugins --- app/models/environment.rb | 2 +- baseplugins/README | 3 +++ baseplugins/people_block | 1 + config/plugins/people_block | 1 - debian/noosfero.install | 1 + lib/noosfero/plugin.rb | 6 +++++- lib/tasks/plugins.rake | 22 +++++++++++++--------- lib/tasks/plugins_tests.rake | 4 ++-- plugins/people_block/before_disable.rb | 2 -- script/noosfero-plugins | 33 ++++++++++++++++++--------------- 10 files changed, 44 insertions(+), 31 deletions(-) create mode 100644 baseplugins/README create mode 120000 baseplugins/people_block delete mode 120000 config/plugins/people_block delete mode 100644 plugins/people_block/before_disable.rb diff --git a/app/models/environment.rb b/app/models/environment.rb index 840a666..50061c8 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -286,7 +286,7 @@ class Environment < ActiveRecord::Base www.youtube.com ] + ('a' .. 'z').map{|i| "#{i}.yimg.com"} - settings_items :enabled_plugins, :type => Array, :default => [] + settings_items :enabled_plugins, :type => Array, :default => Noosfero::Plugin.available_plugin_names settings_items :search_hints, :type => Hash, :default => {} diff --git a/baseplugins/README b/baseplugins/README new file mode 100644 index 0000000..13701af --- /dev/null +++ b/baseplugins/README @@ -0,0 +1,3 @@ +Plugins in this directory are enabled by default, and cannot be disabled at the +system level. Each environment admistrator can still disable it in the web UI, +though. diff --git a/baseplugins/people_block b/baseplugins/people_block new file mode 120000 index 0000000..1a9a4e5 --- /dev/null +++ b/baseplugins/people_block @@ -0,0 +1 @@ +../plugins/people_block \ No newline at end of file diff --git a/config/plugins/people_block b/config/plugins/people_block deleted file mode 120000 index 4559c7b..0000000 --- a/config/plugins/people_block +++ /dev/null @@ -1 +0,0 @@ -../../plugins/people_block \ No newline at end of file diff --git a/debian/noosfero.install b/debian/noosfero.install index 4d0e046..3cb133a 100644 --- a/debian/noosfero.install +++ b/debian/noosfero.install @@ -21,6 +21,7 @@ config/locales usr/share/noosfero/config config.ru usr/share/noosfero plugins usr/share/noosfero +baseplugins usr/share/noosfero debian/dbinstall usr/lib/noosfero debian/dbupgrade usr/lib/noosfero diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb index e966ae3..bbe776d 100644 --- a/lib/noosfero/plugin.rb +++ b/lib/noosfero/plugin.rb @@ -104,7 +104,7 @@ class Noosfero::Plugin def available_plugins unless @available_plugins - path = File.join(Rails.root, 'config', 'plugins', '*') + path = File.join(Rails.root, '{baseplugins,config/plugins}', '*') @available_plugins = Dir.glob(path).select{ |i| File.directory?(i) } if Rails.env.test? && !@available_plugins.include?(File.join(Rails.root, 'config', 'plugins', 'foo')) @available_plugins << File.join(Rails.root, 'plugins', 'foo') @@ -113,6 +113,10 @@ class Noosfero::Plugin @available_plugins end + def available_plugin_names + available_plugins.map { |f| File.basename(f).camelize } + end + def all @all ||= available_plugins.map{ |dir| (File.basename(dir) + "_plugin").camelize } end diff --git a/lib/tasks/plugins.rake b/lib/tasks/plugins.rake index f5cf813..6b9c7e2 100644 --- a/lib/tasks/plugins.rake +++ b/lib/tasks/plugins.rake @@ -1,17 +1,18 @@ require 'active_record' #require_dependency 'active_record/migration' -class ActiveRecord::Migrator - alias_method :orig_initialize, :initialize - def initialize *args - orig_initialize *args - @migrations_paths = ["db/migrate", "config/plugins/*/db/migrate"] - end -end - namespace :noosfero do namespace :plugins do - plugin_migration_dirs = Dir.glob(Rails.root.join('config', 'plugins', '*', 'db', 'migrate')) + + plugin_migration_dirs = Dir.glob(Rails.root.join('{baseplugins,config/plugins}', '*', 'db', 'migrate')) + + task :load_config do + dirs = Dir.glob("{baseplugins,config/plugins}/*/db/migrate") + dirs.each do |dir| + ActiveRecord::Migrator.migrations_paths << dir + end + end + task :migrate do plugin_migration_dirs.each do |path| ActiveRecord::Migrator.migrate(path, ENV["VERSION"] ? @@ -20,3 +21,6 @@ namespace :noosfero do end end end + +task 'db:migrate' => 'noosfero:plugins:load_config' +task 'db:schema:load' => 'noosfero:plugins:load_config' diff --git a/lib/tasks/plugins_tests.rake b/lib/tasks/plugins_tests.rake index 2d9eb19..69134fe 100644 --- a/lib/tasks/plugins_tests.rake +++ b/lib/tasks/plugins_tests.rake @@ -3,7 +3,7 @@ @all_tasks = [:units, :functionals, :integration, :cucumber, :selenium] def enabled_plugins - Dir.glob('config/plugins/*').map { |f| File.basename(f) } - ['README'] + Dir.glob('{baseplugins,config/plugins}/*').map { |f| File.basename(f) } - ['README'] end @original_enabled_plugins = enabled_plugins @@ -51,7 +51,7 @@ def plugin_name(plugin) end def plugin_enabled?(plugin) - File.exist?(File.join('config', 'plugins', plugin)) + File.exist?(File.join('config', 'plugins', plugin)) || File.exist?(File.join('baseplugins', plugin)) end def plugin_disabled_warning(plugin) diff --git a/plugins/people_block/before_disable.rb b/plugins/people_block/before_disable.rb deleted file mode 100644 index 77914a7..0000000 --- a/plugins/people_block/before_disable.rb +++ /dev/null @@ -1,2 +0,0 @@ -raise "\nPeopleBlockPlugin shouldn't be enabled/disabled by hand, Noosfero" + - "\ninstallation already comes with it enabled by default!\n" diff --git a/script/noosfero-plugins b/script/noosfero-plugins index d81a48d..7a43a33 100755 --- a/script/noosfero-plugins +++ b/script/noosfero-plugins @@ -14,9 +14,10 @@ fi # data available_plugins_dir="$NOOSFERO_DIR/plugins" enabled_plugins_dir="$NOOSFERO_DIR/config/plugins" +base_plugins_dir="$NOOSFERO_DIR/baseplugins" available_plugins=$(find "$available_plugins_dir" -maxdepth 1 -mindepth 1 -type d -not -name 'template' -printf '%f\n' | sort) enabled_plugins=$(find -L "$enabled_plugins_dir" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort) -disabled_plugins=$(printf "%s\n" $available_plugins $enabled_plugins_dir | sort | uniq -u) +base_plugins=$(find -L "$base_plugins_dir" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort) # operation defaults quiet=false @@ -32,7 +33,7 @@ _list() { _status() { for plugin in $available_plugins; do - if [ -h "$enabled_plugins_dir/$plugin" ]; then + if [ -h "$enabled_plugins_dir/$plugin" -o -h "$base_plugins_dir/$plugin" ]; then status="*" else status=" " @@ -79,8 +80,9 @@ _enable(){ cd $enabled_plugins_dir source="../../plugins/$plugin" target="$enabled_plugins_dir/$plugin" + base="$base_plugins_dir/$plugin" run "$source/before_enable.rb" - if [ -h "$target" ]; then + if [ -h "$target" -o -h "$base" ]; then _say "$plugin already enabled" else if [ ! -d "$source" ]; then @@ -127,19 +129,20 @@ _disable(){ target="$enabled_plugins_dir/$plugin" plugins_public_dir="$NOOSFERO_DIR/public/plugins" plugins_features_dir="$NOOSFERO_DIR/features/plugins" - if ! run "$source/before_disable.rb"; then - echo "W: failed to disabling $plugin" - echo + + if [ -h "$base_plugins_dir/$plugin" ]; then + _say "$plugin is a base plugin and cannot be disabled" + return + fi + + if [ -h "$target" ]; then + rm "$target" + test -h "$plugins_public_dir/$plugin" && rm "$plugins_public_dir/$plugin" + test -h "$plugins_features_dir/$plugin" && rm "$plugins_features_dir/$plugin" + _say "$plugin disabled" + run "$source/after_disable.rb" else - if [ -h "$target" ]; then - rm "$target" - test -h "$plugins_public_dir/$plugin" && rm "$plugins_public_dir/$plugin" - test -h "$plugins_features_dir/$plugin" && rm "$plugins_features_dir/$plugin" - _say "$plugin disabled" - run "$source/after_disable.rb" - else - _say "$plugin already disabled" - fi + _say "$plugin already disabled" fi } -- libgit2 0.21.2