elexis-wiki-interface 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/.gitignore +18 -0
  2. data/.travis.yml +24 -0
  3. data/Gemfile +15 -0
  4. data/Gemfile.lock +94 -0
  5. data/LICENSE +674 -0
  6. data/README.textile +104 -0
  7. data/Rakefile +6 -0
  8. data/bin/wiki_pull +6 -0
  9. data/bin/wiki_pull_daily +25 -0
  10. data/bin/wiki_push +5 -0
  11. data/elexis-wiki-interface.gemspec +28 -0
  12. data/lib/elexis/wiki/interface.rb +8 -0
  13. data/lib/elexis/wiki/interface/version.rb +7 -0
  14. data/lib/elexis/wiki/interface/workspace.rb +298 -0
  15. data/spec/data/doc/doc_de/.project +42 -0
  16. data/spec/data/pull/ch.elexis.agenda/.project +36 -0
  17. data/spec/data/pull/ch.elexis.agenda/META-INF/MANIFEST.MF +33 -0
  18. data/spec/data/pull/ch.elexis.agenda/plugin.properties +8 -0
  19. data/spec/data/pull/ch.elexis.agenda/plugin.xml +209 -0
  20. data/spec/data/pull/ch.elexis.agenda/plugin_de.properties +8 -0
  21. data/spec/data/pull/ch.elexis.agenda/plugin_en.properties +8 -0
  22. data/spec/data/pull/ch.elexis.agenda/plugin_fr.properties +7 -0
  23. data/spec/data/pull/ch.elexis.core.application.feature/.project +23 -0
  24. data/spec/data/pull/ch.elexis.core.application.feature/build.properties +1 -0
  25. data/spec/data/pull/ch.elexis.core.application.feature/feature.xml +699 -0
  26. data/spec/data/pull/ch.elexis.core.application.feature/pom.xml +12 -0
  27. data/spec/data/pull/ch.elexis.icpc/.project +28 -0
  28. data/spec/data/pull/ch.elexis.icpc/META-INF/MANIFEST.MF +26 -0
  29. data/spec/data/pull/ch.elexis.icpc/plugin.xml +74 -0
  30. data/spec/data/pull/ch.elexis.notes/.project +34 -0
  31. data/spec/data/pull/ch.elexis.notes/META-INF/MANIFEST.MF +17 -0
  32. data/spec/data/pull/ch.elexis.notes/plugin.properties +1 -0
  33. data/spec/data/pull/ch.elexis.notes/plugin.xml +36 -0
  34. data/spec/data/pull/ch.elexis.notes/plugin_de.properties +3 -0
  35. data/spec/data/pull/ch.elexis.notes/plugin_en.properties +3 -0
  36. data/spec/data/pull/ch.elexis.notes/plugin_fr.properties +3 -0
  37. data/spec/data/pull/doc_de/.project +42 -0
  38. data/spec/data/pull/doc_de/Doc_de_abrechnungssystem1.png +0 -0
  39. data/spec/data/pull/doc_de/doc_de.mediawiki +1842 -0
  40. data/spec/data/push/ch.elexis.icpc/.project +28 -0
  41. data/spec/data/push/ch.elexis.icpc/META-INF/MANIFEST.MF +26 -0
  42. data/spec/data/push/ch.elexis.icpc/doc/favicon_green.png +0 -0
  43. data/spec/data/push/ch.elexis.icpc/doc/test.mediawiki +3 -0
  44. data/spec/data/push/ch.elexis.icpc/plugin.xml +74 -0
  45. data/spec/pull_spec.rb +99 -0
  46. data/spec/push_spec.rb +29 -0
  47. data/spec/spec_helper.rb +18 -0
  48. metadata +258 -0
data/README.textile ADDED
@@ -0,0 +1,104 @@
1
+ h1. Elexis::Wiki::Interface
2
+
3
+ A Ruby Gem to allow pulling and pushing between Elexis source code repositories and the mediawiki installation
4
+
5
+ Use it at your own risk, as it is just a small utility gem to help for some release engineering for the Elexis-RCP. See http://elexis.info.
6
+
7
+ But I have an open ear for suggestions for improvements, especially if they come with a patch including specs.
8
+
9
+ License: GPLv3 or later
10
+
11
+ Copyright: 2014 (c) by Niklaus Giger <niklaus.giger@member.fsf.org>
12
+
13
+ h2. Installation
14
+
15
+ Ensure that you use Ruby 1.9.2 or higher (mediawiki-gateway does not support Ruby 1.8.7).
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ bc. $ gem 'elexis-wiki-interface'
20
+
21
+ And then execute:
22
+
23
+ bc. $ bundle
24
+
25
+ Or install it yourself as:
26
+
27
+ bc. $ gem install elexis-wiki-interface
28
+
29
+ h2. Usage
30
+
31
+ h3. using some built-in helpers (mainly for the jenkins-CI)
32
+
33
+ Each of the helper script below should work if you have a ruby installation >= 1.9.2 and executed @gem install bundler && bundle install@ in directory where
34
+
35
+ bc. wiki_pull
36
+ wiki_pull_daily
37
+ wiki_push
38
+
39
+ h3. in a ruby script
40
+
41
+ bc. require 'elexis/wiki/interface/workspace'
42
+ require 'pp'
43
+ workspace = Elexis::Wiki::Interface::Workspace.new('.')
44
+ workspace.pull # get actual mediawiki content and place it under doc inside the plugin
45
+ workspace.info.show
46
+ pp workspace.views_missing_documentation # returns an array of plugin-ids
47
+ pp workspace.perspectives_missing_documentation # returns an array of plugin-ids
48
+ pp workspace.plugins_missing_documentation # returns an array of plugis
49
+ workspace.push # push doc/*.mediwiki files to the wiki
50
+
51
+ Or you can inspire you from the spec/*_spec.rb files to see tested examples.
52
+
53
+ h3. Username/password to access your wiki
54
+
55
+ The username and password is fetched from a config.yml, which may be either
56
+ * /etc/elexis-wiki-interface/config.yml
57
+ * <current workdir>/config.yml
58
+
59
+ Here is an example:
60
+
61
+ bc. ---
62
+ wiki: http://wiki.elexis.info/api.php
63
+ password: topsecrect
64
+ user: elexis
65
+
66
+ This user must have the privilege to access the wiki via the API interface.
67
+
68
+ h3. Conventions
69
+
70
+ * You must create a directory config with a file hosts.yml containing the mediawiki-gateway configuration (host, username, password)
71
+
72
+ * The push/pull methods use the convention
73
+ ** in page names all '.' are removed
74
+ ** a plugin plugin.name has a page plugin.name
75
+ ** a view view.name with a localized name localized_name has a page <plugin.name>Views<localized_name>
76
+ ** a perspective perspective.name with a localized name localized_name has a page P_<localized_name>
77
+ ** png files should start with their plugin/feature-name followed by '_' by a unique name
78
+ ** png files resides inside the 'doc' sub-directory of each plugin/feature
79
+
80
+ h3. Limitations/TODO
81
+
82
+ * Upload all perspectives/view images from a jubula run
83
+ ** View-images were in doc_de/images/views/Artikelauswahl.png (localized_name) -> http://wiki.elexis.info/Datei:Ch.elexis:Artikelauswahl.png
84
+ ** https://srv.elexis.info/jenkins/view/3.0/job/Elexis-3.0-Jubula/118/artifact/test-results/screenshots/Other/https://srv.elexis.info/jenkins/view/3.0/job/Elexis-3.0-Jubula/118/artifact/test-results/screenshots/Other/Fixmedikation.png
85
+ ** Bug ch.elexis -> ch.elexis.core splitted. now you find it here
86
+ *** ch.elexis.core.application/plugin_de.properties:elexis.articleSelectorView=Artikelauswahl
87
+ *** ch.elexis.core.ui.laboratory/plugin_de.properties:elexis.articleSelectorView = Artikelauswahl
88
+ *** ch.elexis.core.ui/plugin_de.properties:elexis.articleSelectorView = Artikelauswahl
89
+ *** ch.elexis.core.application/plugin.xml: name="%elexis.articleSelectorView">
90
+ ** Missing line [[Datei:Ch.elexis:Artikelauswahl.png]] in http://wiki.elexis.info/ChElexisViewsArtikelArtikelselektor
91
+ * Perspektives: were not uploaded to doc_de
92
+ * No images are pulled/pushed at the moment.
93
+ * Check whether a link to the view exists on the wiki.elexis.info/Hauptseite
94
+ * No support for features at the moment
95
+ * No multilingual support at the moment
96
+
97
+
98
+ h2. Contributing
99
+
100
+ # Fork it ( http://github.com/ngiger/elexis-wiki-interface/fork )
101
+ # Create your feature branch (`git checkout -b my-new-feature`)
102
+ # Commit your changes (`git commit -am 'Add some feature'`)
103
+ # Push to the branch (`git push origin my-new-feature`)
104
+ # Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/wiki_pull ADDED
@@ -0,0 +1,6 @@
1
+ #!/bin/env ruby
2
+ require 'elexis/wiki/interface/workspace'
3
+
4
+ workspace = Elexis::Wiki::Interface::Workspace.new(Dir.pwd)
5
+ workspace.pull
6
+ workspace.show_missing(true)
@@ -0,0 +1,25 @@
1
+ #!/bin/env ruby
2
+
3
+ require 'elexis/wiki/interface/workspace'
4
+
5
+ workspace = Elexis::Wiki::Interface::Workspace.new(Dir.pwd)
6
+ workspace.pull
7
+ workspace.show_missing(true)
8
+ files = Dir.glob('doc_??') +
9
+ Dir.glob('*/doc/*.mediawiki') +
10
+ Dir.glob('*/doc/*.png')
11
+ Dir.glob('*/doc/*.jpg')
12
+ Dir.glob('*/doc/*.gif')
13
+ files.each{
14
+ |file|
15
+ if /:/.match(File.basename(file))
16
+ puts "You may not add a file containg ':' or it will break git for Windows. Remove/rename #{file}"
17
+ exit 2
18
+ end
19
+ }
20
+ system("git add -f #{files.join(' ')}")
21
+ system("git status")
22
+ system("git commit --all -m '#{File.basename(__FILE__)}: Added mediawiki content from #{workspace.wiki}'")
23
+ system("git status")
24
+ system("git log -1")
25
+ # system("git push")
data/bin/wiki_push ADDED
@@ -0,0 +1,5 @@
1
+ #!/bin/env ruby
2
+ require 'elexis/wiki/interface/workspace'
3
+ workspace = Elexis::Wiki::Interface::Workspace.new(Dir.pwd)
4
+ workspace.push
5
+
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'elexis/wiki/interface/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "elexis-wiki-interface"
8
+ spec.version = Elexis::Wiki::Interface::VERSION
9
+ spec.authors = ["Niklaus Giger"]
10
+ spec.email = ["niklaus.giger@member.fsf.org"]
11
+ spec.summary = "Interface between elexis source and wiki"
12
+ spec.description = "Support for pulling/pushing wiki content from source repository to elexis.wiki"
13
+ spec.homepage = "http://wiki.elexis.info"
14
+ spec.license = "GPLv3"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+ spec.add_dependency 'rubyzip', '< 1.0.0'
21
+ spec.add_dependency 'unicode'
22
+ spec.add_dependency 'mediawiki-gateway'
23
+ spec.add_dependency 'eclipse-plugin', '>= 0.1'
24
+ spec.add_development_dependency "bundler", "~> 1.10"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "simplecov"
28
+ end
@@ -0,0 +1,8 @@
1
+ require "elexis/wiki/interface/version"
2
+
3
+ module Elexis
4
+ module Wiki
5
+ module Interface
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module Elexis
2
+ module Wiki
3
+ module Interface
4
+ VERSION = "0.4"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,298 @@
1
+ #encoding: utf-8
2
+
3
+ require 'eclipse/plugin'
4
+ require 'media_wiki' # TODO: port it to require 'mediawiki_api'
5
+ require 'fileutils'
6
+ require 'open-uri'
7
+ require 'time'
8
+ require 'yaml'
9
+
10
+ module Elexis
11
+ module Wiki
12
+ module Interface
13
+ class Workspace
14
+ attr_reader :info, :mw, :wiki, :views_missing_documentation, :perspectives_missing_documentation, :plugins_missing_documentation, :features_missing_documentation,
15
+ :doc_project, :features, :info
16
+ def initialize(dir, wiki = 'http://wiki.elexis.info/api.php')
17
+ @wiki = wiki
18
+ @mw = MediaWiki::Gateway.new(@wiki)
19
+ @info = Eclipse::Workspace.new(dir)
20
+ @doc_projects = Dir.glob(File.join(dir, "doc_??", ".project"))
21
+ @info.parse_sub_dirs
22
+ @info.show if $VERBOSE
23
+ @views_missing_documentation =[]
24
+ @perspectives_missing_documentation =[]
25
+ @plugins_missing_documentation =[]
26
+ @features_missing_documentation =[]
27
+ end
28
+ def show_missing(details = false)
29
+ if views_missing_documentation.size and
30
+ plugins_missing_documentation.size == 0 and
31
+ features_missing_documentation.size == 0 and
32
+ perspectives_missing_documentation.size == 0
33
+ puts "Eclipse-Workspace #{@info.workspace_dir} seems to have documented all views, features, plugins and perspectives"
34
+ else
35
+ puts "Eclipse-Workspace #{@info.workspace_dir} needs documenting "
36
+ if views_missing_documentation.size > 0
37
+ puts " #{views_missing_documentation.size} views"
38
+ puts " #{views_missing_documentation.inspect}" if details
39
+ end
40
+ if plugins_missing_documentation.size > 0
41
+ puts " #{plugins_missing_documentation.size} plugins"
42
+ puts " #{plugins_missing_documentation.inspect}" if details
43
+ end
44
+ if features_missing_documentation.size > 0
45
+ puts " #{features_missing_documentation.size} features"
46
+ puts " #{features_missing_documentation.inspect}" if details
47
+ end
48
+ if perspectives_missing_documentation.size > 0
49
+ puts " #{perspectives_missing_documentation.size} perspectives"
50
+ puts " #{perspectives_missing_documentation.inspect}" if details
51
+ end
52
+ end
53
+ end
54
+ def push
55
+ check_config_file
56
+ raise "must define wiki with user and password in #{@config_yml}" unless @user and @password and @wiki
57
+ @mw.login(@user, @password)
58
+ @doc_projects.each{
59
+ |prj|
60
+ dir = File.dirname(prj)
61
+ }
62
+ @info.plugins.each{
63
+ |id,plugin|
64
+ to_push = Dir.glob("#{plugin.jar_or_src}/doc/*.mediawiki")
65
+ to_push.each{
66
+ |file|
67
+ # verify that locally committed file is newer than the page in the wiki
68
+ # verify that the content after the push matches the local content
69
+ my_new_content = File.new(file).read
70
+ to_verify = my_new_content.gsub(/\n+/,"\n").chomp
71
+ pagename = File.basename(file, '.mediawiki').capitalize
72
+ last_wiki_modification = get_page_modification_time(pagename)
73
+ last_git_modification = get_git_modification(file)
74
+ unless last_wiki_modification
75
+ puts "first upload #{File.basename(file)} last_git_modification is #{last_git_modification}" if $VERBOSE
76
+ @mw.create(pagename, my_new_content,{:overwrite => true, :summary => "pushed by #{File.basename(__FILE__)}" })
77
+ else
78
+ got = @mw.get(pagename).gsub(/\n+/,"\n")
79
+ if got == to_verify
80
+ puts "No changes to push for #{file}"
81
+ next
82
+ end
83
+ @mw.edit(pagename, to_verify,{:overwrite => true, :summary => "pushed by #{File.basename(__FILE__)}" })
84
+ puts "Uploaded #{file} to #{pagename}" if $VERBOSE
85
+ end
86
+ }
87
+ if to_push.size > 0 # then upload also all *.png files
88
+ images_to_push = Dir.glob("#{plugin.jar_or_src}/doc/*.png")
89
+ images_to_push.each{
90
+ |image|
91
+ if /:/.match(File.basename(image))
92
+ puts "You may not add a file containg ':' or it will break git for Windows. Remove/rename #{image}"
93
+ exit
94
+ end
95
+
96
+ git_mod = get_git_modification(image)
97
+ wiki_mod = get_image_modification_name(image)
98
+
99
+ if wiki_mod == nil
100
+ puts "first upload #{File.basename(image)} as last_git_modification is #{git_mod}" if $VERBOSE
101
+ else
102
+ to_verify = File.new(image, 'rb').read
103
+ got = @mw.get(File.basename(image))
104
+ if got == to_verify
105
+ puts "nothing to upload for #{image}" if $VERBOSE
106
+ next
107
+ end
108
+ end
109
+ begin
110
+ res = @mw.upload(image, 'filename' => File.basename(image))
111
+ puts "res für #{image} exists? #{File.exists?(image)} ist #{res.to_s}"
112
+ puts "If you received API error: code 'verification-error', info 'This file did not pass file verification'"
113
+ puts "this means that the file type and content do not match, e.g. you have a *png file but in reality it is a JPEG file."
114
+ puts "In this case convert file.png file.png fixes this problem"
115
+ rescue MediaWiki::APIError => e
116
+ puts "rescue für #{image} #{e}" # if $VERBOSE
117
+ end
118
+ }
119
+ end
120
+ }
121
+ end
122
+
123
+ def get_git_modification(file)
124
+ return nil unless File.exists?(file)
125
+ git_time = `git log -1 --pretty=format:%ai #{file}`
126
+ return nil unless git_time.length > 8
127
+ Time.parse(git_time.chomp).utc
128
+ end
129
+
130
+ def get_page_modification_time(pagename)
131
+ json_url = "#{@wiki}?action=query&format=json&prop=revisions&titles=#{pagename}&rvprop=timestamp"
132
+ json = RestClient.get(json_url)
133
+ wiki_json_timestamp_to_time(json, pagename)
134
+ end
135
+
136
+ def pull
137
+ @doc_projects.each{
138
+ |prj|
139
+ dir = File.dirname(prj)
140
+ get_content_from_wiki(dir, File.basename(dir))
141
+ }
142
+ @info.plugins.each{
143
+ |id, info|
144
+ puts "Pulling for plugin #{id}" if $VERBOSE
145
+ pull_docs_views(info)
146
+ pull_docs_plugins(info)
147
+ pull_docs_perspectives(info)
148
+ }
149
+ @info.features.each{
150
+ |id, info|
151
+ puts "Pulling for feature #{id}" if $VERBOSE
152
+ pull_docs_features(info)
153
+ }
154
+ saved = Dir.pwd
155
+ end
156
+
157
+ def perspectiveToPageName(perspective)
158
+ # http://wiki.elexis.info/P_Abrechnungen
159
+ name = 'P_'+ perspective.id.gsub(' ', '')
160
+ puts "perspectiveToPageName for #{perspective.inspect} is '#{name}'" if $VERBOSE
161
+ name
162
+ end
163
+ def viewToPageName(plugin_id, view)
164
+ # für ch.elexis.agenda.views.TagesView (= view.id)
165
+ # http://wiki.elexis.info/ChElexisAgendaViewsTagesview
166
+ # wurde unter http://wiki.elexis.info/Hauptseite ein Link Agenda (= view.name) angelegt.
167
+ # evtl. sollten wir testen, ob dieser Link vorhanden ist
168
+ # http://wiki.elexis.info/ChElexisIcpcViewsEpisodesview
169
+ comps = view.id.split('.')
170
+ pageName = comps[0..-2].collect{|x| x.capitalize}.join + 'Views'+view.id.split('.').last.capitalize
171
+ puts "viewToPageName for #{plugin_id}/#{view.id} is #{pageName}" if $VERBOSE
172
+ pageName
173
+ end
174
+
175
+ private
176
+ def wiki_json_timestamp_to_time(json, page_or_img)
177
+ return nil unless json
178
+ begin
179
+ m = json.match(/timestamp['"]:['"]([^'"]+)/)
180
+ return Time.parse(m[1]) if m
181
+ end
182
+ nil
183
+ end
184
+
185
+ def check_config_file
186
+ possibleCfgs = ['/etc/elexis-wiki-interface/config.yml', File.join(Dir.pwd, 'config.yml'), ]
187
+ possibleCfgs.each{ |cfg| @config_yml = cfg; break if File.exists?(cfg) }
188
+ raise "need a config file #{possibleCfgs.join(' or ')} for wiki with user/password" unless File.exists?(@config_yml)
189
+ yaml = YAML.load_file(@config_yml)
190
+ @user = yaml['user']
191
+ @password = yaml['password']
192
+ @wiki = yaml['wiki']
193
+ puts "MediWiki #{@wiki} user #{@user} with password #{@password}" if $VERBOSE
194
+ end
195
+
196
+ def shorten_wiki_image(image)
197
+ return File.basename(image) unless File.basename(image).index(':')
198
+ File.basename(image).split(':')[1..-1].join(':').gsub(':', '_')
199
+ end
200
+
201
+ # http://wiki.elexis.info/api.php?action=query&format=json&list=allimages&ailimit=5&aiprop=timestamp&aiprefix=Ch.elexis.notes:config.png&*
202
+ def get_image_modification_name(image)
203
+ json_url = "#{@wiki}?action=query&format=json&list=allimages&ailimit=5&aiprop=timestamp&aiprefix=#{shorten_wiki_image(image)}"
204
+ json = RestClient.get(json_url)
205
+ wiki_json_timestamp_to_time(json, image)
206
+ end
207
+
208
+ # helper function, as mediawiki-gateway does not handle this situation correctly
209
+ def download_image_file(image, downloaded_image)
210
+ short_image = shorten_wiki_image(image)
211
+ unless File.exist? downloaded_image
212
+ json_url = "#{@wiki}?action=query&format=json&list=allimages&ailimit=5&aiprop=url&aiprefix=#{short_image}"
213
+ json = RestClient.get(json_url)
214
+ unless json
215
+ puts "JSON: Could not fetch for image #{image} using #{json_url}"
216
+ return
217
+ end
218
+ begin
219
+ answer = JSON.parse(json)
220
+ image_url = nil
221
+ image_url = answer['query'].first[1].first['url'] if answer['query'] and answer['query'].size >= 1 and answer['query'].first[1].size > 0
222
+ if image_url
223
+ File.open(downloaded_image, 'w') do |file|
224
+ file.write(open(image_url).read)
225
+ end
226
+ else
227
+ puts "skipping image #{image}"
228
+ end
229
+ rescue => e
230
+ puts "JSON: Could not fetch for image #{image} using #{json_url}"
231
+ puts " was '#{json}'"
232
+ puts " error was #{e.inspect}"
233
+ end
234
+ end
235
+ puts "Downloaded image #{downloaded_image} #{File.size(downloaded_image)} bytes" if $VERBOSE
236
+ end
237
+
238
+ def get_content_from_wiki(out_dir, pageName)
239
+ puts "get_content_from_wiki page #{pageName} -> #{out_dir}" if $VERBOSE
240
+ out_name = File.join(out_dir, pageName + '.mediawiki')
241
+ FileUtils.makedirs(out_dir) unless File.directory?(out_dir)
242
+ begin
243
+ content = @mw.get(pageName)
244
+ rescue MediaWiki::Gateway::Exception => e
245
+ puts "Unable to get #{pageName} for #{out_dir} from #{File.dirname(@mw.wiki_url)}"
246
+ return nil
247
+ end
248
+ if content
249
+ ausgabe = File.open(out_name, 'w+') { |f| f.write content.gsub(/(Image:[\w\.]+):(\w+.png)/, '\1_\2') }
250
+ @mw.images(pageName).each{
251
+ |image|
252
+ image = image.gsub(/[^\w\.:]/, '_')
253
+ downloaded_image = File.join(out_dir, shorten_wiki_image(image))
254
+ download_image_file(image, downloaded_image.sub(':', ''))
255
+ break if defined?(RSpec) # speed up rspec
256
+ }
257
+ else
258
+ puts "Could not fetch #{pageName} from #{@mw}" if $VERBOSE
259
+ end
260
+ content
261
+ end
262
+ def pull_docs_views(plugin)
263
+ id = plugin.symbolicName
264
+ plugin.views.each{
265
+ |id, view|
266
+ pageName = viewToPageName(plugin.symbolicName, view)
267
+ content = get_content_from_wiki(File.join(@info.workspace_dir, File.basename(plugin.jar_or_src), 'doc'), pageName)
268
+ @views_missing_documentation << pageName unless content
269
+ }
270
+ end
271
+ def pull_docs_perspectives(plugin)
272
+ id = plugin.symbolicName
273
+ plugin.perspectives.each{
274
+ |id, perspective|
275
+ pageName = perspectiveToPageName(perspective)
276
+ content = get_content_from_wiki(File.join(@info.workspace_dir, File.basename(plugin.jar_or_src), 'doc'), pageName)
277
+ @perspectives_missing_documentation << pageName unless content
278
+ }
279
+ end
280
+ def pull_docs_plugins(plugin)
281
+ id = plugin.symbolicName
282
+ pageName = id.capitalize
283
+ content = get_content_from_wiki(File.join(@info.workspace_dir, File.basename(plugin.jar_or_src), 'doc'), pageName)
284
+ @perspectives_missing_documentation << pageName unless content
285
+ end
286
+ def pull_docs_features(feature)
287
+ id = feature.symbolicName
288
+ pageName = id.capitalize
289
+ content = get_content_from_wiki(File.join(@info.workspace_dir, id, 'doc'), pageName)
290
+ unless content
291
+ content = get_content_from_wiki(File.join(@info.workspace_dir, id, 'doc'), pageName.sub(/feature$/, 'feature.feature.group'))
292
+ puts "pull_docs_features failed #{id} #{pageName}" unless content
293
+ end
294
+ end
295
+ end
296
+ end
297
+ end
298
+ end