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 »