Defect #6324 » 0001-Defer-plugin-requirements-evaluation.patch
| lib/redmine/plugin.rb | ||
|---|---|---|
| 78 | 78 | 
    end  | 
| 79 | 79 | 
    end  | 
| 80 | 80 | 
    def_field :name, :description, :url, :author, :author_url, :version, :settings, :directory  | 
| 81 | 
    attr_reader :id  | 
|
| 81 | 
        attr_reader :id, :requirements
   | 
|
| 82 | 82 | |
| 83 | 83 | 
    # Plugin constructor: instanciates a new Redmine::Plugin with given +id+  | 
| 84 | 84 | 
    # and make it evaluate the given +block+  | 
| ... | ... | |
| 169 | 169 | 
    registered_plugins[id.to_sym].present?  | 
| 170 | 170 | 
    end  | 
| 171 | 171 | |
| 172 | 
    def self.validate  | 
|
| 173 | 
    registered_plugins.each_value(&:validate)  | 
|
| 174 | 
    end  | 
|
| 175 | ||
| 172 | 176 | 
    def initialize(id)  | 
| 173 | 177 | 
    @id = id.to_sym  | 
| 178 | 
          @requirements = {}
   | 
|
| 174 | 179 | 
    end  | 
| 175 | 180 | |
| 176 | 181 | 
    def public_directory  | 
| ... | ... | |
| 269 | 274 | 
    # requires_redmine_plugin :foo, :version => '0.7.3' # 0.7.3 only  | 
| 270 | 275 | 
    # requires_redmine_plugin :foo, :version => ['0.7.3', '0.8.0'] # 0.7.3 or 0.8.0  | 
| 271 | 276 | 
    def requires_redmine_plugin(plugin_name, arg)  | 
| 277 | 
          @requirements[plugin_name] = ->{ validate_plugin_requirement(plugin_name, arg) }
   | 
|
| 278 | 
    end  | 
|
| 279 | ||
| 280 | 
    def validate_plugin_requirement(plugin_name, arg)  | 
|
| 272 | 281 | 
          arg = {:version_or_higher => arg} unless arg.is_a?(Hash)
   | 
| 273 | 282 | 
    arg.assert_valid_keys(:version, :version_or_higher)  | 
| 274 | 283 | |
| ... | ... | |
| 305 | 314 | 
    end  | 
| 306 | 315 | 
    true  | 
| 307 | 316 | 
    end  | 
| 317 | 
    private :validate_plugin_requirement  | 
|
| 318 | ||
| 319 | 
    def validate  | 
|
| 320 | 
    requirements.each_value(&:call)  | 
|
| 321 | 
    end  | 
|
| 308 | 322 | |
| 309 | 323 | 
    # Adds an item to the given +menu+.  | 
| 310 | 324 | 
    # The +id+ parameter (equals to the project id) is automatically added to the url.  | 
| lib/redmine/plugin_loader.rb | ||
|---|---|---|
| 105 | 105 | 
    add_autoload_paths  | 
| 106 | 106 | |
| 107 | 107 | 
    Rails.application.config.to_prepare do  | 
| 108 | 
    PluginLoader.directories.each(&:run_initializer)  | 
|
| 108 | 
    Redmine::PluginLoader.run_initializer  | 
|
| 109 | 
    Redmine::Plugin.validate  | 
|
| 109 | 110 | |
| 110 | 111 | 
    Redmine::Hook.call_hook :after_plugins_loaded  | 
| 111 | 112 | 
    end  | 
| 112 | 113 | 
    end  | 
| 113 | 114 | |
| 115 | 
    def self.run_initializer  | 
|
| 116 | 
    directories.each(&:run_initializer)  | 
|
| 117 | 
    end  | 
|
| 118 | ||
| 114 | 119 | 
    def self.setup  | 
| 115 | 120 | 
    @plugin_directories = []  | 
| 116 | 121 | |
| test/fixtures/plugin_dependencies/a_plugin/init.rb | ||
|---|---|---|
| 1 | 
    # frozen_string_literal: true  | 
|
| 2 | ||
| 3 | 
    Redmine::Plugin.register :a_plugin do  | 
|
| 4 | 
    requires_redmine_plugin :d_plugin, '0.1.0'  | 
|
| 5 | 
    version '0.1.0'  | 
|
| 6 | 
    end  | 
|
| test/fixtures/plugin_dependencies/b_plugin/init.rb | ||
|---|---|---|
| 1 | 
    # frozen_string_literal: true  | 
|
| 2 | ||
| 3 | 
    Redmine::Plugin.register :b_plugin do  | 
|
| 4 | 
    requires_redmine_plugin :d_plugin, '0.1.0'  | 
|
| 5 | 
    version '0.1.0'  | 
|
| 6 | 
    end  | 
|
| test/fixtures/plugin_dependencies/c_plugin/init.rb | ||
|---|---|---|
| 1 | 
    # frozen_string_literal: true  | 
|
| 2 | ||
| 3 | 
    Redmine::Plugin.register :c_plugin do  | 
|
| 4 | 
    requires_redmine_plugin :a_plugin, '0.1.0'  | 
|
| 5 | 
    requires_redmine_plugin :b_plugin, '0.1.0'  | 
|
| 6 | 
    end  | 
|
| test/fixtures/plugin_dependencies/d_plugin/init.rb | ||
|---|---|---|
| 1 | 
    # frozen_string_literal: true  | 
|
| 2 | ||
| 3 | 
    Redmine::Plugin.register :d_plugin do  | 
|
| 4 | 
    version '0.1.0'  | 
|
| 5 | 
    end  | 
|
| test/unit/lib/redmine/plugin_test.rb | ||
|---|---|---|
| 174 | 174 | 
    test.assert requires_redmine_plugin(:other_plugin, other_version)  | 
| 175 | 175 | 
    test.assert_raise Redmine::PluginRequirementError do  | 
| 176 | 176 | 
    requires_redmine_plugin(:other_plugin, :version_or_higher => '99.0.0')  | 
| 177 | 
    validate  | 
|
| 177 | 178 | 
    end  | 
| 178 | 179 | 
    test.assert requires_redmine_plugin(:other_plugin, :version => other_version)  | 
| 179 | 180 | 
    test.assert requires_redmine_plugin(:other_plugin, :version => [other_version, '99.0.0'])  | 
| 180 | 181 | 
    test.assert_raise Redmine::PluginRequirementError do  | 
| 181 | 182 | 
    requires_redmine_plugin(:other_plugin, :version => '99.0.0')  | 
| 183 | 
    validate  | 
|
| 182 | 184 | 
    end  | 
| 183 | 185 | 
    test.assert_raise Redmine::PluginRequirementError do  | 
| 184 | 186 | 
    requires_redmine_plugin(:other_plugin, :version => ['98.0.0', '99.0.0'])  | 
| 187 | 
    validate  | 
|
| 185 | 188 | 
    end  | 
| 186 | 189 | 
    # Missing plugin  | 
| 187 | 190 | 
    test.assert_raise Redmine::PluginRequirementError do  | 
| 188 | 191 | 
    requires_redmine_plugin(:missing, :version_or_higher => '0.1.0')  | 
| 192 | 
    validate  | 
|
| 189 | 193 | 
    end  | 
| 190 | 194 | 
    test.assert_raise Redmine::PluginRequirementError do  | 
| 191 | 195 | 
    requires_redmine_plugin(:missing, '0.1.0')  | 
| 196 | 
    validate  | 
|
| 192 | 197 | 
    end  | 
| 193 | 198 | 
    test.assert_raise Redmine::PluginRequirementError do  | 
| 194 | 199 | 
    requires_redmine_plugin(:missing, :version => '0.1.0')  | 
| 200 | 
    validate  | 
|
| 195 | 201 | 
    end  | 
| 196 | 202 | 
    end  | 
| 197 | 203 | 
    end  | 
| 198 | 204 | |
| 205 | 
    def test_requires_redmine_plugin_dependencies  | 
|
| 206 | 
    @klass.clear  | 
|
| 207 | 
        @klass.directory = Rails.root.join('test/fixtures/plugin_dependencies')
   | 
|
| 208 | 
    Redmine::PluginLoader.directory = @klass.directory  | 
|
| 209 | 
    Redmine::PluginLoader.setup  | 
|
| 210 | 
    Redmine::PluginLoader.run_initializer  | 
|
| 211 | 
    Redmine::Plugin.validate  | 
|
| 212 | 
    assert_equal 4, Redmine::Plugin.registered_plugins.keys.size  | 
|
| 213 | 
    end  | 
|
| 214 | ||
| 199 | 215 | 
    def test_default_settings  | 
| 200 | 216 | 
        @klass.register(:foo_plugin) {settings :default => {'key1' => 'abc', :key2 => 123}}
   | 
| 201 | 217 | 
    h = Setting.plugin_foo_plugin  | 
- « Previous
 - 1
 - …
 - 6
 - 7
 - 8
 - Next »