From e17f85d613cdb25d840b812740eee9e8a88c1d25 Mon Sep 17 00:00:00 2001 From: Rodrigo Souto Date: Thu, 18 Oct 2012 21:15:19 +0000 Subject: [PATCH] Creating generic settings for plugins (moving part of it from AntiSpam Plugin) --- config/initializers/plugins.rb | 1 + lib/noosfero/plugin/settings.rb | 45 +++++++++++++++++++++++++++++++++++++++++++++ plugins/anti_spam/controllers/anti_spam_plugin_admin_controller.rb | 2 +- plugins/anti_spam/lib/anti_spam_plugin.rb | 6 +++++- plugins/anti_spam/lib/anti_spam_plugin/settings.rb | 35 ----------------------------------- plugins/anti_spam/test/unit/anti_spam_plugin/settings_test.rb | 29 ----------------------------- plugins/anti_spam/test/unit/anti_spam_plugin_test.rb | 2 +- test/unit/plugin_settings_test.rb | 38 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 91 insertions(+), 67 deletions(-) create mode 100644 lib/noosfero/plugin/settings.rb delete mode 100644 plugins/anti_spam/lib/anti_spam_plugin/settings.rb delete mode 100644 plugins/anti_spam/test/unit/anti_spam_plugin/settings_test.rb create mode 100644 test/unit/plugin_settings_test.rb diff --git a/config/initializers/plugins.rb b/config/initializers/plugins.rb index 56188fa..7c95396 100644 --- a/config/initializers/plugins.rb +++ b/config/initializers/plugins.rb @@ -3,4 +3,5 @@ require 'noosfero/plugin/hot_spot' require 'noosfero/plugin/manager' require 'noosfero/plugin/active_record' require 'noosfero/plugin/mailer_base' +require 'noosfero/plugin/settings' Noosfero::Plugin.init_system if $NOOSFERO_LOAD_PLUGINS diff --git a/lib/noosfero/plugin/settings.rb b/lib/noosfero/plugin/settings.rb new file mode 100644 index 0000000..8b4e37a --- /dev/null +++ b/lib/noosfero/plugin/settings.rb @@ -0,0 +1,45 @@ +class Noosfero::Plugin::Settings + + def initialize(environment, plugin, attributes = nil) + @environment = environment + @plugin = plugin + attributes ||= {} + attributes.each do |k,v| + self.send("#{k}=", v) + end + end + + def settings + @environment.settings["#{@plugin.public_name}_plugin".to_sym] ||= {} + end + + def method_missing(method, *args, &block) + if method.to_s =~ /^(.+)=$/ + set_setting($1, args.first) + elsif method.to_s =~ /^(.+)$/ + get_setting($1) + end + end + + def get_setting(name) + if settings[name.to_sym].nil? + if @plugin.respond_to?("#{name}_default_setting") + @plugin.send("#{name}_default_setting") + else + nil + end + else + settings[name.to_sym] + end + end + + def set_setting(name, value) + settings[name.to_sym] = value + end + + def save! + @environment.save! + end + +end + diff --git a/plugins/anti_spam/controllers/anti_spam_plugin_admin_controller.rb b/plugins/anti_spam/controllers/anti_spam_plugin_admin_controller.rb index f749546..8787a7f 100644 --- a/plugins/anti_spam/controllers/anti_spam_plugin_admin_controller.rb +++ b/plugins/anti_spam/controllers/anti_spam_plugin_admin_controller.rb @@ -2,7 +2,7 @@ class AntiSpamPluginAdminController < AdminController append_view_path File.join(File.dirname(__FILE__) + '/../views') def index - @settings = AntiSpamPlugin::Settings.new(environment, params[:settings]) + @settings = Noosfero::Plugin::Settings.new(environment, AntiSpamPlugin, params[:settings]) if request.post? @settings.save! redirect_to :action => 'index' diff --git a/plugins/anti_spam/lib/anti_spam_plugin.rb b/plugins/anti_spam/lib/anti_spam_plugin.rb index 3aeacdc..5371ca9 100644 --- a/plugins/anti_spam/lib/anti_spam_plugin.rb +++ b/plugins/anti_spam/lib/anti_spam_plugin.rb @@ -8,6 +8,10 @@ class AntiSpamPlugin < Noosfero::Plugin _("Checks comments against a spam checking service compatible with the Akismet API") end + def self.host_default_setting + 'api.antispam.typepad.com' + end + def check_comment_for_spam(comment) if rakismet_call(comment, :spam?) comment.spam = true @@ -26,7 +30,7 @@ class AntiSpamPlugin < Noosfero::Plugin protected def rakismet_call(comment, op) - settings = AntiSpamPlugin::Settings.new(comment.environment) + settings = Noosfero::Plugin::Settings.new(comment.environment, self.class) Rakismet.host = settings.host Rakismet.key = settings.api_key diff --git a/plugins/anti_spam/lib/anti_spam_plugin/settings.rb b/plugins/anti_spam/lib/anti_spam_plugin/settings.rb deleted file mode 100644 index 0ab31c5..0000000 --- a/plugins/anti_spam/lib/anti_spam_plugin/settings.rb +++ /dev/null @@ -1,35 +0,0 @@ -class AntiSpamPlugin::Settings - - def initialize(environment, attributes = nil) - @environment = environment - attributes ||= {} - attributes.each do |k,v| - self.send("#{k}=", v) - end - end - - def settings - @environment.settings[:anti_spam_plugin] ||= {} - end - - def host - settings[:host] ||= 'api.antispam.typepad.com' - end - - def host=(value) - settings[:host] = value - end - - def api_key - settings[:api_key] - end - - def api_key=(value) - settings[:api_key] = value - end - - def save! - @environment.save! - end - -end diff --git a/plugins/anti_spam/test/unit/anti_spam_plugin/settings_test.rb b/plugins/anti_spam/test/unit/anti_spam_plugin/settings_test.rb deleted file mode 100644 index 612ce80..0000000 --- a/plugins/anti_spam/test/unit/anti_spam_plugin/settings_test.rb +++ /dev/null @@ -1,29 +0,0 @@ -require 'test_helper' - -class AntiSpamSettingsTest < ActiveSupport::TestCase - - def setup - @environment = Environment.new - @settings = AntiSpamPlugin::Settings.new(@environment) - end - - should 'store setttings in environment' do - @settings.host = 'foo.com' - @settings.api_key = '1234567890' - assert_equal 'foo.com', @environment.settings[:anti_spam_plugin][:host] - assert_equal '1234567890', @environment.settings[:anti_spam_plugin][:api_key] - assert_equal 'foo.com', @settings.host - assert_equal '1234567890', @settings.api_key - end - - should 'save environment on save' do - @environment.expects(:save!) - @settings.save! - end - - should 'use TypePad AntiSpam by default' do - assert_equal 'api.antispam.typepad.com', @settings.host - end - - -end diff --git a/plugins/anti_spam/test/unit/anti_spam_plugin_test.rb b/plugins/anti_spam/test/unit/anti_spam_plugin_test.rb index 99dd85b..74629ee 100644 --- a/plugins/anti_spam/test/unit/anti_spam_plugin_test.rb +++ b/plugins/anti_spam/test/unit/anti_spam_plugin_test.rb @@ -7,7 +7,7 @@ class AntiSpamPluginTest < ActiveSupport::TestCase article = fast_create(TextileArticle, :profile_id => profile.id) @comment = fast_create(Comment, :source_id => article.id, :source_type => 'Article') - @settings = AntiSpamPlugin::Settings.new(@comment.environment) + @settings = Noosfero::Plugin::Settings.new(@comment.environment, AntiSpamPlugin) @settings.api_key = 'b8b80ddb8084062d0c9119c945ce3bc3' @settings.save! diff --git a/test/unit/plugin_settings_test.rb b/test/unit/plugin_settings_test.rb new file mode 100644 index 0000000..c0b7b58 --- /dev/null +++ b/test/unit/plugin_settings_test.rb @@ -0,0 +1,38 @@ +require 'test_helper' + +class SolarSystemPlugin < Noosfero::Plugin + def self.secret_default_setting + 42 + end +end + +class PluginSettingsTest < ActiveSupport::TestCase + + def setup + @environment = Environment.new + @plugin = SolarSystemPlugin + @settings = Noosfero::Plugin::Settings.new(@environment, @plugin) + end + + attr_accessor :environment, :plugin, :settings + + should 'store setttings in environment' do + settings.star = 'sun' + settings.planets = 8 + assert_equal 'sun', environment.settings[:solar_system_plugin][:star] + assert_equal 8, environment.settings[:solar_system_plugin][:planets] + assert_equal 'sun', settings.star + assert_equal 8, settings.planets + end + + should 'save environment on save' do + environment.expects(:save!) + settings.save! + end + + should 'use default value defined on the plugin class' do + assert_equal 42, settings.secret + end + +end + -- libgit2 0.21.2