Um passo da dependencia entre plugins

Bráulio Bhavamitra brauliobhavamitra at gmail.com
Fri May 10 10:06:35 BRT 2013


2013/5/10 Bráulio Bhavamitra <brauliobhavamitra at gmail.com>

> Oi pessoal,
>
> Estava olhando o código e vi que o noosfero está quase pronto para
> implementar dependencias entre plugins. Com o carregamento do
> dependencies.rb, já é possível fazer um require da classe de outro plugin.
> O problema é: e se o outro plugin ainda não foi colocado no path? Aí o
> require inevitavelmente vai falhar.
>
> A solução para isto é simples: hoje o noosfero, depois de adicionar os
> paths para cada plugin, carrega a classe do plugin. Se mudar um pouco esta
> ordem, de modo que todas os paths de todos os plugins sejam adicionados e
> só depois suas respectivas classes sejam carregadas, então os plugins
> poderão acessar o código dos outros livremente.
>
> Isto seria bem simples de implementar: só tirar o klass(dir) do
> init_system e colocá-lo em outro loop.
>
Além disso tem que mudar a ordem das coisas, primeiro carregar os paths
depois checar as dependencias. Segue um patch que testei:

diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb
index 8d1d371..241abda 100644
--- a/lib/noosfero/plugin.rb
+++ b/lib/noosfero/plugin.rb
@@ -21,6 +21,20 @@ class Noosfero::Plugin
       end.each do |dir|
         plugin_name = File.basename(dir)

+        Rails.configuration.controller_paths << File.join(dir,
'controllers')
+        ActiveSupport::Dependencies.load_paths << File.join(dir,
'controllers')
+        controllers_folders = %w[public profile myprofile admin]
+        controllers_folders.each do |folder|
+          Rails.configuration.controller_paths << File.join(dir,
'controllers', folder)
+          ActiveSupport::Dependencies.load_paths << File.join(dir,
'controllers', folder)
+        end
+        [ ActiveSupport::Dependencies.load_paths, $:].each do |path|
+          path << File.join(dir, 'models')
+          path << File.join(dir, 'lib')
+        end
+      end.each do |dir|
+        plugin_name = File.basename(dir)
+
         plugin_dependencies_ok = true
         plugin_dependencies_file = File.join(dir, 'dependencies.rb')
         if File.exists?(plugin_dependencies_file)
@@ -33,18 +47,6 @@ class Noosfero::Plugin
         end

         if plugin_dependencies_ok
-          Rails.configuration.controller_paths << File.join(dir,
'controllers')
-          ActiveSupport::Dependencies.load_paths << File.join(dir,
'controllers')
-          controllers_folders = %w[public profile myprofile admin]
-          controllers_folders.each do |folder|
-            Rails.configuration.controller_paths << File.join(dir,
'controllers', folder)
-            ActiveSupport::Dependencies.load_paths << File.join(dir,
'controllers', folder)
-          end
-          [ ActiveSupport::Dependencies.load_paths, $:].each do |path|
-            path << File.join(dir, 'models')
-            path << File.join(dir, 'lib')
-          end
-
           klass(plugin_name)
         end
       end



>
> Que acham?
>
> abraços,
> bráulio
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listas.softwarelivre.org/pipermail/noosfero-br/attachments/20130510/37ae8bd2/attachment-0001.html>


More information about the Noosfero-br mailing list