mediawiki-testwiki 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,83 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # mediawiki-testwiki -- MediaWiki test wiki based on Docker #
5
+ # #
6
+ # Copyright (C) 2014 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # mediawiki-testwiki is free software; you can redistribute it and/or modify #
12
+ # it under the terms of the GNU Affero General Public License as published by #
13
+ # the Free Software Foundation; either version 3 of the License, or (at your #
14
+ # option) any later version. #
15
+ # #
16
+ # mediawiki-testwiki is distributed in the hope that it will be useful, but #
17
+ # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY #
18
+ # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public #
19
+ # License for more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with mediawiki-testwiki. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ require 'docker_helper'
28
+
29
+ require_relative 'config'
30
+
31
+ module MediaWiki
32
+
33
+ module TestWiki
34
+
35
+ module DockerHelper
36
+
37
+ include ::DockerHelper
38
+
39
+ def self.docker(silent = false, &block)
40
+ ::DockerHelper::Proxy.new.extend(self).tap { |docker|
41
+ docker.extend(SilentDocker) if silent
42
+ Config.enhance(docker, &block)
43
+ }
44
+ end
45
+
46
+ def docker_container_name(setup = false)
47
+ parts = [config.registry_repo, config.version]
48
+ parts << :setup if setup
49
+ parts.join('-')
50
+ end
51
+
52
+ def docker_image_name(setup = false)
53
+ base = "#{config.registry_repo}:#{config.version}"
54
+ setup ? "#{base}-setup" : "#{config.registry_user}/#{base}"
55
+ end
56
+
57
+ def docker_build(image = nil)
58
+ super(config.build_path, image)
59
+ end
60
+
61
+ def docker_volume(name = nil)
62
+ super(config.volume, name)
63
+ end
64
+
65
+ def docker_url(*args)
66
+ args.size > 1 ? super : super(config.port, *args)
67
+ end
68
+
69
+ module SilentDocker
70
+
71
+ def docker_system(*args, &block)
72
+ options = args.last.is_a?(Hash) ? args.pop : {}
73
+ options[:out] = options[:err] = :close
74
+ super(*args << options, &block)
75
+ end
76
+
77
+ end
78
+
79
+ end
80
+
81
+ end
82
+
83
+ end
@@ -0,0 +1,48 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # mediawiki-testwiki -- MediaWiki test wiki based on Docker #
5
+ # #
6
+ # Copyright (C) 2014 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # mediawiki-testwiki is free software; you can redistribute it and/or modify #
12
+ # it under the terms of the GNU Affero General Public License as published by #
13
+ # the Free Software Foundation; either version 3 of the License, or (at your #
14
+ # option) any later version. #
15
+ # #
16
+ # mediawiki-testwiki is distributed in the hope that it will be useful, but #
17
+ # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY #
18
+ # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public #
19
+ # License for more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with mediawiki-testwiki. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ require_relative 'docker_helper'
28
+
29
+ module MediaWiki
30
+
31
+ module TestWiki
32
+
33
+ class DockerPool < ::DockerHelper::Pool
34
+
35
+ DEFAULT_BASENAME = 'mediawiki-testwiki'
36
+
37
+ def initialize(size = nil, basename = nil, silent = false, &block)
38
+ super(size, basename, DockerHelper.docker(silent, &block)) {
39
+ self.image, self.port, self.path =
40
+ docker.image_name, docker.config.port, docker.config.endpoint
41
+ }
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,217 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # mediawiki-testwiki -- MediaWiki test wiki based on Docker #
5
+ # #
6
+ # Copyright (C) 2014 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # mediawiki-testwiki is free software; you can redistribute it and/or modify #
12
+ # it under the terms of the GNU Affero General Public License as published by #
13
+ # the Free Software Foundation; either version 3 of the License, or (at your #
14
+ # option) any later version. #
15
+ # #
16
+ # mediawiki-testwiki is distributed in the hope that it will be useful, but #
17
+ # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY #
18
+ # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public #
19
+ # License for more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with mediawiki-testwiki. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ require_relative 'docker_helper'
28
+
29
+ module MediaWiki
30
+
31
+ module TestWiki
32
+
33
+ module RakeHelper
34
+
35
+ include DockerHelper
36
+
37
+ class << self
38
+
39
+ def extended(base)
40
+ keep = [:noop, :verbose]
41
+
42
+ base.define_singleton_method(:docker_system) { |*args, &block|
43
+ options = !args.last.is_a?(Hash) ? {} :
44
+ args.pop.keep_if { |k,| keep.include?(k) }
45
+
46
+ sh(*args << options, &block)
47
+ }
48
+
49
+ configure(base) unless base.respond_to?(:config)
50
+ end
51
+
52
+ def configure(base, load_tasks = false, &block)
53
+ Config.enhance(base, &block).tap {
54
+ require_relative 'rake_tasks' if load_tasks
55
+ }
56
+ end
57
+
58
+ end
59
+
60
+ def docker_tasks(name, image)
61
+ %w[start stop restart clean clobber].each { |task|
62
+ task(task) { send("docker_#{task}", name, image) }
63
+ }
64
+
65
+ task(:start) { puts "#{name}: #{docker_url(name)}" }
66
+ end
67
+
68
+ def file_size(*args)
69
+ file_create(*args) { |t| File.write(t.name, '') }.instance_eval {
70
+ def needed?; !File.size?(name); end
71
+ yield self if block_given?
72
+ self
73
+ }
74
+ end
75
+
76
+ def fix_config(file, host)
77
+ File.write(file, File.read(file).tap { |content|
78
+ content.sub!(/^\$wgServer\b/, '#\&')
79
+ content.gsub!(host, 'localhost')
80
+ })
81
+ end
82
+
83
+ def setup_broken(arg)
84
+ msg = <<-EOT
85
+
86
+ *** Manual configuration is broken for this MediaWiki version. ***
87
+
88
+ EOT
89
+
90
+ if arg.is_a?(LoadError)
91
+ abort msg << <<-EOT
92
+ However, automatic configuration is not available: #{arg}.
93
+ Please install the `mechanize' gem and try again.
94
+ EOT
95
+ elsif arg
96
+ wait msg << <<-EOT
97
+ Also, automatic configuration is not supported for this version either.
98
+ Please create a valid configuration file and press enter when finished:
99
+ #{arg}
100
+ EOT
101
+ else
102
+ abort msg << <<-EOT
103
+ However, you have requested to skip automatic configuration.
104
+ Please unset `NOMECHANIZE' and try again.
105
+ EOT
106
+ end
107
+ end
108
+
109
+ def setup_manual(url, dir, cfg, err = nil, unk = nil)
110
+ msg = <<-EOT
111
+
112
+ Visit #{url} and configure the wiki:
113
+ EOT
114
+
115
+ msg << <<-EOT if unk
116
+
117
+ NOTE: These configuration instructions have not been verified for
118
+ this version of MediaWiki -- please use your own judgement!
119
+ EOT
120
+
121
+ msg << <<-EOT
122
+
123
+ - Language
124
+ - Continue
125
+
126
+ - Welcome to MediaWiki!
127
+ - Continue
128
+
129
+ - Connect to database
130
+ - Database type: SQLite
131
+ - SQLite data directory: #{dir}
132
+ - Database name: #{config.database_name}
133
+ - Continue
134
+
135
+ - Name
136
+ - Name of wiki: #{config.sitename}
137
+ - Your username: #{config.username}
138
+ - Password: #{config.password}
139
+ - Password again: #{config.password}
140
+ - I'm bored already, just install the wiki.
141
+ - Continue
142
+
143
+ - Install (1)
144
+ - Continue
145
+
146
+ - Install (2)
147
+ - Continue
148
+
149
+ Save #{File.basename(cfg)} (replace existing file if already present):
150
+ #{cfg}
151
+
152
+ Close configuration window and press enter when finished.
153
+ EOT
154
+
155
+ msg << <<-EOT if err
156
+
157
+ NOTE: Install the `mechanize' gem to automate this process. (#{err})
158
+ EOT
159
+
160
+ wait(msg)
161
+ end
162
+
163
+ def setup_mechanize(url, dir, cfg)
164
+ agent = Mechanize.new
165
+ page = agent.get(url)
166
+
167
+ continue = lambda { |&block|
168
+ form = page.forms.first
169
+ block[form] if block
170
+ page = agent.submit(form)
171
+ }
172
+
173
+ 2.times { continue.() }
174
+
175
+ continue.() { |form|
176
+ form.sqlite_wgSQLiteDataDir = dir
177
+ form.sqlite_wgDBname = config.database_name
178
+ form.radiobuttons_with(value: 'sqlite').first.check
179
+ }
180
+
181
+ continue.() { |form|
182
+ form.radiobuttons_with(value: 'skip').first.check
183
+
184
+ form.config_wgSitename = config.sitename
185
+ form.config__AdminName = config.username
186
+
187
+ form.config__AdminPassword = config.password
188
+ form.config__AdminPassword2 = config.password
189
+ }
190
+
191
+ 2.times { continue.() }
192
+
193
+ page.link_with(text: Regexp.new(
194
+ Regexp.escape(File.basename(cfg)))).click.save!(cfg)
195
+ end
196
+
197
+ def verified_version?(strict = false, list = config.verified_versions)
198
+ strict ? list.include?(config.version) :
199
+ list.grep(/\A#{Regexp.escape(config.version[/.*\./])}/).any?
200
+ end
201
+
202
+ def broken_version?(strict = false)
203
+ verified_version?(strict, config.broken_versions)
204
+ end
205
+
206
+ private
207
+
208
+ def wait(msg)
209
+ puts(msg)
210
+ $stdin.gets
211
+ end
212
+
213
+ end
214
+
215
+ end
216
+
217
+ end
@@ -0,0 +1,32 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # mediawiki-testwiki -- MediaWiki test wiki based on Docker #
5
+ # #
6
+ # Copyright (C) 2014 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # mediawiki-testwiki is free software; you can redistribute it and/or modify #
12
+ # it under the terms of the GNU Affero General Public License as published by #
13
+ # the Free Software Foundation; either version 3 of the License, or (at your #
14
+ # option) any later version. #
15
+ # #
16
+ # mediawiki-testwiki is distributed in the hope that it will be useful, but #
17
+ # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY #
18
+ # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public #
19
+ # License for more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with mediawiki-testwiki. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ require_relative 'rake_helper'
28
+
29
+ extend MediaWiki::TestWiki::RakeHelper
30
+
31
+ %w[main files setup docker].each { |task|
32
+ load "media_wiki/test_wiki/tasks/#{task}.rake" }
@@ -0,0 +1,101 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # mediawiki-testwiki -- MediaWiki test wiki based on Docker #
5
+ # #
6
+ # Copyright (C) 2014 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # mediawiki-testwiki is free software; you can redistribute it and/or modify #
12
+ # it under the terms of the GNU Affero General Public License as published by #
13
+ # the Free Software Foundation; either version 3 of the License, or (at your #
14
+ # option) any later version. #
15
+ # #
16
+ # mediawiki-testwiki is distributed in the hope that it will be useful, but #
17
+ # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY #
18
+ # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public #
19
+ # License for more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with mediawiki-testwiki. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ require_relative 'docker_pool'
28
+
29
+ module MediaWiki
30
+
31
+ module TestWiki
32
+
33
+ module RSpecAdapter
34
+
35
+ Proxy = Struct.new(:version, :config, :pool)
36
+
37
+ PROXY_NAME = :live_media_wiki
38
+
39
+ class << self
40
+
41
+ def enhance(config, *args)
42
+ return if config.respond_to?(PROXY_NAME)
43
+ init_config(Proxy.new, config, *args)
44
+ config
45
+ end
46
+
47
+ def extended(base)
48
+ init_proxy(RSpec.configuration.send(PROXY_NAME), base.metadata)
49
+ base
50
+ end
51
+
52
+ private
53
+
54
+ def init_config(mw, config, *args)
55
+ config.add_setting PROXY_NAME, default: mw
56
+
57
+ config.after :context, *args do mw.pool.clean end
58
+ config.extend self, *args
59
+ config.include Helpers, *args
60
+
61
+ config.filter_run_excluding required_version: lambda { |value|
62
+ version = mw.version and not
63
+ Gem::Requirement.new(Array(value)).satisfied_by?(version)
64
+ }
65
+ end
66
+
67
+ def init_proxy(mw, options = {})
68
+ version, size = options.values_at(:version, :pool_size)
69
+
70
+ mw.pool = DockerPool.new(size, nil, true) { |config|
71
+ mw.version = Gem::Version.new(config.version = version) if version
72
+ mw.config = { username: config.username, password: config.password }
73
+ }
74
+ end
75
+
76
+ end
77
+
78
+ module Helpers
79
+
80
+ def live_media_wiki_gateway(*args)
81
+ described_class.new(@live_media_wiki_url, *args).tap { |gateway|
82
+ yield gateway if block_given?
83
+ }
84
+ end
85
+
86
+ def live_media_wiki_reset(*args, &block)
87
+ mw = RSpec.configuration.send(PROXY_NAME)
88
+
89
+ @live_media_wiki_url = mw.pool.fetch_url
90
+
91
+ mw.config.values_at(:username, :password)
92
+ .unshift(live_media_wiki_gateway(*args, &block))
93
+ end
94
+
95
+ end
96
+
97
+ end
98
+
99
+ end
100
+
101
+ end