badger-rails 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. data/BadgerGit.png +0 -0
  2. data/COPYING +674 -0
  3. data/LICENSING +30 -0
  4. data/Manifest +112 -0
  5. data/README.md +80 -0
  6. data/Rakefile +36 -0
  7. data/badger-rails.gemspec +34 -0
  8. data/bin/badger +486 -0
  9. data/lib/badger/Capfile +1 -0
  10. data/lib/badger/config/deploy.rb +211 -0
  11. data/lib/badger/config/rails-app.yml +6 -0
  12. data/lib/badger/config/rails-app.yml.bk +6 -0
  13. data/lib/badger/core/claws/app.claw +112 -0
  14. data/lib/badger/core/claws/db-app.claw +59 -0
  15. data/lib/badger/core/claws/rails-app.claw +125 -0
  16. data/lib/badger/core/files/badger/info +0 -0
  17. data/lib/badger/core/files/cap/Capfile +4 -0
  18. data/lib/badger/core/files/cap/deploy/production-app.rb +139 -0
  19. data/lib/badger/core/files/cap/deploy/production.rb +136 -0
  20. data/lib/badger/core/files/cap/deploy/staging-app.rb +139 -0
  21. data/lib/badger/core/files/cap/deploy/staging.rb +134 -0
  22. data/lib/badger/core/files/cap/deploy.rb +6 -0
  23. data/lib/badger/core/files/git/git +0 -0
  24. data/lib/badger/core/files/god/angel/resque-dev.god +54 -0
  25. data/lib/badger/core/files/god/angel/resque-stg.god +54 -0
  26. data/lib/badger/core/files/god/angel/resque.god +55 -0
  27. data/lib/badger/core/files/god/angel/unicorn-stg.god +62 -0
  28. data/lib/badger/core/files/god/angel/unicorn.god +62 -0
  29. data/lib/badger/core/files/god/god +108 -0
  30. data/lib/badger/core/files/god/unicorn-stg.rb +70 -0
  31. data/lib/badger/core/files/god/unicorn.rb +70 -0
  32. data/lib/badger/core/files/logrotate/logrotate.conf +23 -0
  33. data/lib/badger/core/files/logrotate/logrotate.cron +8 -0
  34. data/lib/badger/core/files/mysql/database.yml.bk +18 -0
  35. data/lib/badger/core/files/mysql/db_stats +0 -0
  36. data/lib/badger/core/files/mysql/my.cnf +11 -0
  37. data/lib/badger/core/files/nginx/nginx +106 -0
  38. data/lib/badger/core/files/nginx/nginx.conf +30 -0
  39. data/lib/badger/core/files/nginx/sites/port443.btl +42 -0
  40. data/lib/badger/core/files/nginx/sites/port80.btl +39 -0
  41. data/lib/badger/core/files/nginx/sites/production-web +117 -0
  42. data/lib/badger/core/files/nginx/sites/staging-web +41 -0
  43. data/lib/badger/core/files/postfix/main.cf +678 -0
  44. data/lib/badger/core/files/postfix/master.cf +81 -0
  45. data/lib/badger/core/files/redis/redis-server +59 -0
  46. data/lib/badger/core/files/redis/redis.conf +444 -0
  47. data/lib/badger/core/files/resque/resque.rb +5 -0
  48. data/lib/badger/core/files/resque/resque.yml +19 -0
  49. data/lib/badger/core/files/resque/resque_web.rb +2 -0
  50. data/lib/badger/core/files/ssh/authorized_keys +0 -0
  51. data/lib/badger/core/functions +174 -0
  52. data/lib/badger/core/scripts/app_info +40 -0
  53. data/lib/badger/core/scripts/app_scale +15 -0
  54. data/lib/badger/core/scripts/remove_app +25 -0
  55. data/lib/badger/core/scripts/remove_app_db +30 -0
  56. data/lib/badger/core/scripts/remove_gems +2 -0
  57. data/lib/badger/core/teeth/automake.th +9 -0
  58. data/lib/badger/core/teeth/badger.th +27 -0
  59. data/lib/badger/core/teeth/bison.th +20 -0
  60. data/lib/badger/core/teeth/bundler.th +4 -0
  61. data/lib/badger/core/teeth/capistrano-ext.th +37 -0
  62. data/lib/badger/core/teeth/chkconfig.th +4 -0
  63. data/lib/badger/core/teeth/curl.th +24 -0
  64. data/lib/badger/core/teeth/faac.th +11 -0
  65. data/lib/badger/core/teeth/ffmpeg.th +28 -0
  66. data/lib/badger/core/teeth/firewall.th +70 -0
  67. data/lib/badger/core/teeth/gcc-c++.th +9 -0
  68. data/lib/badger/core/teeth/gcc.th +9 -0
  69. data/lib/badger/core/teeth/git.th +23 -0
  70. data/lib/badger/core/teeth/god.th +17 -0
  71. data/lib/badger/core/teeth/lame.th +9 -0
  72. data/lib/badger/core/teeth/libffi.th +4 -0
  73. data/lib/badger/core/teeth/libid3tag.th +10 -0
  74. data/lib/badger/core/teeth/libmad.th +11 -0
  75. data/lib/badger/core/teeth/libogg.th +9 -0
  76. data/lib/badger/core/teeth/libtool.th +9 -0
  77. data/lib/badger/core/teeth/libxml2.th +19 -0
  78. data/lib/badger/core/teeth/libxslt.th +19 -0
  79. data/lib/badger/core/teeth/libyaml.th +19 -0
  80. data/lib/badger/core/teeth/logrotate.th +19 -0
  81. data/lib/badger/core/teeth/madplay.th +10 -0
  82. data/lib/badger/core/teeth/make.th +9 -0
  83. data/lib/badger/core/teeth/mysql-config.th +40 -0
  84. data/lib/badger/core/teeth/mysql-server.th +16 -0
  85. data/lib/badger/core/teeth/mysql.th +14 -0
  86. data/lib/badger/core/teeth/nginx.th +56 -0
  87. data/lib/badger/core/teeth/ntp.th +15 -0
  88. data/lib/badger/core/teeth/openssl.th +19 -0
  89. data/lib/badger/core/teeth/pcre.th +9 -0
  90. data/lib/badger/core/teeth/plugins.th +14 -0
  91. data/lib/badger/core/teeth/postfix.th +11 -0
  92. data/lib/badger/core/teeth/pwgen.th +9 -0
  93. data/lib/badger/core/teeth/rake.th +12 -0
  94. data/lib/badger/core/teeth/readline.th +19 -0
  95. data/lib/badger/core/teeth/redis.th +18 -0
  96. data/lib/badger/core/teeth/resque.th +12 -0
  97. data/lib/badger/core/teeth/ruby.th +52 -0
  98. data/lib/badger/core/teeth/rubygems.th +17 -0
  99. data/lib/badger/core/teeth/san_juan.th +4 -0
  100. data/lib/badger/core/teeth/sox.th +12 -0
  101. data/lib/badger/core/teeth/speex.th +12 -0
  102. data/lib/badger/core/teeth/sqlite3.th +14 -0
  103. data/lib/badger/core/teeth/ssh_keys.th +10 -0
  104. data/lib/badger/core/teeth/sshpass.th +9 -0
  105. data/lib/badger/core/teeth/sudo.th +9 -0
  106. data/lib/badger/core/teeth/syslog-ng.th +16 -0
  107. data/lib/badger/core/teeth/sysv-rc-conf.th +4 -0
  108. data/lib/badger/core/teeth/x264.th +11 -0
  109. data/lib/badger/core/teeth/xvid.th +11 -0
  110. data/lib/badger/core/teeth/yasm.th +11 -0
  111. data/lib/badger/core/teeth/zlib.th +9 -0
  112. data/lib/core.rb +313 -0
  113. data/lib/errors.rb +202 -0
  114. metadata +297 -0
data/lib/core.rb ADDED
@@ -0,0 +1,313 @@
1
+ module Methods
2
+ attr_accessor :yml
3
+
4
+ def initialize
5
+ @errors = Errors.new
6
+ spec = Gem::Specification.find_by_name("badger-rails")
7
+ @badger_root = spec.gem_dir + "/lib/"
8
+ end
9
+
10
+ def badger_logs
11
+ gem_setup
12
+ Dir.chdir(@badger_root + "badger/")
13
+ if ARGV[1] == "tail"
14
+ trap("INT") do
15
+ puts
16
+ puts "Killing tail signal.."
17
+ puts
18
+ end
19
+ `cap rails-app logs -s brat=tail`
20
+ else
21
+ `cap rails-app logs -s brat=nil`
22
+ end
23
+ end
24
+
25
+ def database_server(app_claw)
26
+ command = "#{app_claw}db-app.claw > #{app_claw}app.tmp; mv #{app_claw}app.tmp #{app_claw}db-app.claw"
27
+ case @yml['db']['redis']
28
+ when true
29
+ `sed 's/.*install_source_redis.*/install_source_redis/g' #{command}`
30
+ when false
31
+ `sed 's/.*install_source_redis.*/#install_source_redis/g' #{command}`
32
+ else
33
+ `sed 's/.*install_source_redis.*/#install_source_redis/g' #{command}`
34
+ end
35
+ `cap db-app db_setup;
36
+ cap db-app db_sync;
37
+ cap db-app db_deploy`
38
+ puts <<EOF
39
+
40
+ Database server deployed.
41
+
42
+ If you do not have a web project built.
43
+ Run: badger create < name >
44
+
45
+ Or if a project already exists.
46
+ Run: git commit -m "database config"
47
+ Run: git push badger master
48
+ Run: badger deploy
49
+
50
+ EOF
51
+ end
52
+
53
+ def db
54
+ gem_setup('db')
55
+ Dir.chdir(@badger_root + "badger/")
56
+ app_claw = @badger_root + "badger/core/claws/"
57
+ ensure_ssh
58
+ database_server(app_claw)
59
+ #TODO write to info file.
60
+ end
61
+
62
+ def create(app = nil)
63
+ gem_setup
64
+ Dir.chdir(@badger_root + "badger/")
65
+ app_claw = @badger_root + "badger/core/claws/"
66
+ ensure_ssh
67
+ if app.nil?
68
+ rails_server(app_claw)
69
+ else
70
+ worker_server(app_claw, app)
71
+ end
72
+ end
73
+
74
+ def ensure_badger_yml
75
+ if not File.exists?("badger.yml")
76
+ @errors.errors('yaml exists')
77
+ exit
78
+ end
79
+ end
80
+
81
+ def ensure_external_db
82
+ @yml = YAML.load_file(@rails_root + "/config/badger.yml")
83
+ if @yml['local_db'].nil? or @yml['local_db'] == true
84
+ @errors.errors('local db')
85
+ exit
86
+ end
87
+ end
88
+
89
+ def ensure_rails_root
90
+ config_dir = Dir.exists?("config/")
91
+ if config_dir
92
+ @rails_root = Dir.pwd
93
+ Dir.chdir("config/")
94
+ else
95
+ while not Dir.pwd == "/"
96
+ if Dir.exists?("config/")
97
+ break
98
+ else
99
+ Dir.chdir("..")
100
+ end
101
+ end
102
+ if Dir.pwd == "/"
103
+ @errors.errors('rails root')
104
+ exit
105
+ else
106
+ @rails_root = Dir.pwd
107
+ Dir.chdir("config/")
108
+ end
109
+ end
110
+ end
111
+
112
+ def ensure_ssh
113
+ if not File.exists?("#{Dir.home}/.ssh/id_rsa.pub")
114
+ @errors.errors('ssh')
115
+ exit
116
+ end
117
+ end
118
+
119
+ def exists_error
120
+ @errors.errors('rails project')
121
+ exit
122
+ end
123
+
124
+ def gem_setup(db = nil)
125
+ ensure_badger_yml
126
+ @yml = YAML.load_file(@rails_root + "/config/badger.yml")
127
+ `echo git@#{@yml['domain']}:/opt/git/#{ARGV[1]}.git > #{@badger_root}badger/core/files/git/git`
128
+ `echo #{ARGV[1]} > #{@badger_root}badger/core/files/badger/info`
129
+ FileUtils.cp(Dir.pwd + "/badger.yml", @badger_root + "badger/config/rails-app.yml")
130
+ unless db.nil?
131
+ db_yml = YAML.load_file(Dir.pwd + "/database_example.yml")
132
+ if @yml['db']['connection_internal'] == true
133
+ connection = '10%'
134
+ else
135
+ connection = '%'
136
+ end
137
+
138
+ db_settings = <<-eos
139
+ #{db_yml['staging']['username']}
140
+ #{db_yml['staging']['password']}
141
+ #{db_yml['staging']['database']}
142
+ #{db_yml['production']['username']}
143
+ #{db_yml['production']['password']}
144
+ #{db_yml['production']['database']}
145
+ #{connection}
146
+ eos
147
+
148
+ File.open(@badger_root + "badger/core/files/mysql/db_stats", 'w') {|f| f.write(db_settings)}
149
+ end
150
+ end
151
+
152
+ def git_msg
153
+ puts <<EOF
154
+
155
+ Badger is now setup.
156
+ A remote has been added for git@#{@yml['domain']}:/opt/git/#{ARGV[1]}.git
157
+
158
+ Usage:
159
+ git add .
160
+ git commit -m "first badger commit"
161
+ git push badger master
162
+ badger deploy
163
+
164
+ EOF
165
+ end
166
+
167
+ def info
168
+ gem_setup
169
+ Dir.chdir(@badger_root + "badger/")
170
+ app_claw = @badger_root + "badger/core/claws/"
171
+ ensure_ssh
172
+ exists = `cap #{ARGV[1]} createExists`
173
+ info_error if exists.chomp == "false"
174
+ `cap rails-app info`
175
+ end
176
+
177
+ def info_error
178
+ @errors.errors('info error')
179
+ exit
180
+ end
181
+
182
+ def rails_server(app_claw)
183
+ command = "#{app_claw}rails-app.claw > #{app_claw}app.tmp; mv #{app_claw}app.tmp #{app_claw}rails-app.claw"
184
+ case @yml['redis']
185
+ when true
186
+ `sed 's/.*install_source_redis.*/install_source_redis/g' #{command}`
187
+ when false
188
+ `sed 's/.*install_source_redis.*/#install_source_redis/g' #{command}`
189
+ else
190
+ `sed 's/.*install_source_redis.*/#install_source_redis/g' #{command}`
191
+ end
192
+
193
+ if @yml['environment'] == "production"
194
+ `sed 's/.*config_capistrano.*/config_capistrano production/g' #{command}`
195
+ elsif @yml['environment'] == "staging"
196
+ `sed 's/.*config_capistrano.*/config_capistrano staging/g' #{command}`
197
+ else
198
+ @errors.errors('environment')
199
+ exit
200
+ end
201
+ exists = `cap #{ARGV[1]} createExists`
202
+ exists_error if exists.chomp == "true"
203
+ `cap #{ARGV[1]} setup`
204
+ `cap #{ARGV[1]} sync`
205
+ `cap #{ARGV[1]} git`
206
+ Dir.chdir(@rails_root)
207
+ `git init`
208
+ `git remote add badger git@#{@yml['domain']}:/opt/git/#{ARGV[1]}.git`
209
+ git_msg
210
+ end
211
+
212
+ def rake_tasks
213
+ gem_setup
214
+ arguments = ""
215
+ ARGV[1..-1].each do |a|
216
+ arguments << a << " "
217
+ end
218
+ Dir.chdir(@badger_root + "badger/")
219
+ `cap rails-app rake -s brat=#{arguments.gsub!(" ", "^")}`
220
+ end
221
+
222
+ def scale(workers, app)
223
+ gem_setup
224
+ Dir.chdir(@badger_root + "badger/")
225
+ app_claw = @badger_root + "badger/core/claws/"
226
+ ensure_ssh
227
+ `cap #{app} scale -s workers=#{workers}`
228
+ end
229
+
230
+ def update
231
+ gem_setup
232
+ Dir.chdir(@badger_root + "badger/")
233
+ app_claw = @badger_root + "badger/core/claws/"
234
+ ensure_ssh
235
+ command = "#{app_claw}rails-app.claw > #{app_claw}app.tmp; mv #{app_claw}app.tmp #{app_claw}rails-app.claw"
236
+ case @yml['redis']
237
+ when true
238
+ `sed 's/.*install_source_redis.*/install_source_redis/g' #{command}`
239
+ when false
240
+ `sed 's/.*install_source_redis.*/#install_source_redis/g' #{command}`
241
+ else
242
+ `sed 's/.*install_source_redis.*/#install_source_redis/g' #{command}`
243
+ end
244
+
245
+ if @yml['environment'] == "production"
246
+ `sed 's/.*config_capistrano.*/config_capistrano production/g' #{command}`
247
+ elsif @yml['environment'] == "staging"
248
+ `sed 's/.*config_capistrano.*/config_capistrano staging/g' #{command}`
249
+ else
250
+ @errors.errors('environment')
251
+ exit
252
+ end
253
+ exists = `cap #{ARGV[1]} exists`
254
+ update_error if not exists.chomp == "true"
255
+ `cap #{ARGV[1]} sync`
256
+ end
257
+
258
+ def update_error
259
+ @errors.errors('update error')
260
+ exit
261
+ end
262
+
263
+ def worker_server(app_claw, app)
264
+ command = "#{app_claw}app.claw > #{app_claw}app.tmp; mv #{app_claw}app.tmp #{app_claw}app.claw"
265
+ if @yml['environment'] == "production"
266
+ `sed 's/.*config_capistrano.*/config_capistrano production-app #{app}/g' #{command}`
267
+ elsif @yml['environment'] == "staging"
268
+ `sed 's/.*config_capistrano.*/config_capistrano staging-app #{app}/g' #{command}`
269
+ else
270
+ @errors.errors('environment')
271
+ exit
272
+ end
273
+ case @yml[app]['media']
274
+ when true
275
+ while true
276
+ puts <<EOF
277
+
278
+ Badger-Rails does not provide licensing for the following installations. You will need to check your use case and compare to the following GPL licenses.
279
+ FFMPEG, X264, LAME, LIBMAD, LIBID3TAG, MADPLAY, SOX, FAAC, XVID
280
+
281
+ Do you wish to continue with ffmpeg installation? [ y/n ]
282
+
283
+ EOF
284
+ response = STDIN.gets.chomp
285
+ if response == "y"
286
+ `sed 's/.*install_media_group.*/install_media_group/g' #{command}`
287
+ break
288
+ elsif response == "n"
289
+ `sed 's/.*install_media_group.*/#install_media_group/g' #{command}`
290
+ break
291
+ end
292
+ end
293
+ when false
294
+ `sed 's/.*install_media_group.*/#install_media_group/g' #{command}`
295
+ else
296
+ `sed 's/.*install_media_group.*/#install_media_group/g' #{command}`
297
+ end
298
+ `echo #{@yml['password']} > #{@badger_root}badger/core/files/ssh/app;
299
+ echo #{@yml['domain']} >> #{@badger_root}badger/core/files/ssh/app;
300
+ cap #{app} app_setup;
301
+ cap #{app} app_sync;
302
+ cap #{app} app_deploy`
303
+
304
+ puts
305
+ puts "Worker server deployed."
306
+ puts
307
+ end
308
+
309
+ end
310
+
311
+ class Core
312
+ include Methods
313
+ end
data/lib/errors.rb ADDED
@@ -0,0 +1,202 @@
1
+ module ErrorList
2
+
3
+ def errors(error)
4
+ case error
5
+ when 'rails' #----------------
6
+ puts <<EOF
7
+
8
+ There is no Rails project on this server.
9
+
10
+ EOF
11
+ when 'scale int' #----------------
12
+ puts <<EOF
13
+
14
+ Error: scale requiers an Integer value.
15
+ Usage: < badger [app#] scale [number_of_workers] >
16
+
17
+ EOF
18
+ when 'scale' #----------------
19
+ puts <<EOF
20
+
21
+ Error: did you mean scale?
22
+ Usage: < badger [app#] scale [#] >
23
+
24
+ EOF
25
+ when 'app build' #----------------
26
+ puts <<EOF
27
+
28
+ Error: did you mean build?
29
+ Usage: < badger [app#] build >
30
+
31
+ EOF
32
+ when 'app usage' #----------------
33
+ puts <<EOF
34
+
35
+ Usage:
36
+ < badger [app#] scale [#} >
37
+ < badger [app#] build >
38
+
39
+ EOF
40
+ when 'name' #----------------
41
+ puts <<EOF
42
+
43
+ Error: name of rails app is required.
44
+ Usage: badger create < name_of_rails_app >
45
+
46
+ EOF
47
+ when 'specific name' #----------------
48
+ puts <<EOF
49
+
50
+ Error: name of project cannot be < db > or start with < app >.
51
+
52
+ EOF
53
+ when 'db build' #----------------
54
+ puts <<EOF
55
+
56
+ Error: did you mean build?
57
+ Usage: badger db build
58
+
59
+ EOF
60
+ when 'plugins' #----------------
61
+ puts <<EOF
62
+
63
+ Error: Plugin already exists.
64
+
65
+ EOF
66
+ when 'rails root' #----------------
67
+ puts <<EOF
68
+
69
+ Error: could not locate rails application.
70
+ Enter the root of your rails application and try again.
71
+
72
+ EOF
73
+ when 'badger yaml' #----------------
74
+ puts <<EOF
75
+
76
+ Error: badger.yml already exists.
77
+
78
+ EOF
79
+ when 'yaml exists' #----------------
80
+ puts <<EOF
81
+
82
+ Error: could not locate badger.yml file.
83
+ A config/badger.yml file is required for server configuration.
84
+
85
+ EOF
86
+ when 'environment' #----------------
87
+ puts <<EOF
88
+
89
+ Error: no envirionment specified.
90
+ Please add an either staging or production to the config/badger.yml file.
91
+
92
+ EOF
93
+ when 'generate plugins' #----------------
94
+ puts <<EOF
95
+
96
+ Error: no generate specified.
97
+ Badger does not know what to generate. Did you mean plugins?
98
+
99
+ EOF
100
+ when 'generate yaml' #----------------
101
+ puts <<EOF
102
+
103
+ Error: no generate specified.
104
+ Badger does not know what to generate. Did you mean yml?
105
+
106
+ EOF
107
+ when 'generate' #----------------
108
+ puts <<EOF
109
+
110
+ Error: no gererate specified.
111
+ < badger generate yml >
112
+ < badger generate plugins >
113
+
114
+ EOF
115
+ when 'gemset clear' #----------------
116
+ puts <<EOF
117
+
118
+ Command not understood did you mean badger gemset clear?
119
+
120
+ EOF
121
+ when 'usage' #----------------
122
+ puts <<EOF
123
+
124
+ Usage:
125
+ < badger create [project-name] >
126
+ < badger remove [project-name] >
127
+ < badger update [project-name] >
128
+ < badger deploy >
129
+ < badger deploy --with-workers >
130
+ < badger gemset clear >
131
+ < badger generate [generator] >
132
+ < badger rake [rake command] >
133
+ < badger db build >
134
+ < badger app[number] build >
135
+ < badger info >
136
+ < badger logs >
137
+ < badger logs tail >
138
+ g, gen, generate - yml, plugins
139
+
140
+ EOF
141
+ when 'rubyracer' #----------------
142
+ puts <<EOF
143
+
144
+ Error: Gemfile is missing therubyracer.
145
+ Add therubyracter, :platform => :ruby to your Gemfile
146
+ and run bundle update.
147
+
148
+ EOF
149
+ when 'mysql2' #----------------
150
+ puts <<EOF
151
+
152
+ Error: Gemfile is missing mysql2 adapter.
153
+ Add mysql2 to your Gemfile and run bundle update.
154
+
155
+ EOF
156
+ when 'unicorn' #----------------
157
+ puts <<EOF
158
+
159
+ Error: Gemfile is missing unicorn.
160
+ Add unicorn to your Gemfile and run bundle update.
161
+
162
+ EOF
163
+ when 'ssh' #----------------
164
+ puts <<EOF
165
+
166
+ Error: no ssh key found.
167
+ Generate a ssh key via < ssh-keygen -t rsa >.
168
+
169
+ EOF
170
+ when 'rails project' #----------------
171
+ puts <<EOF
172
+
173
+ Rails project already exists.
174
+
175
+ EOF
176
+ when 'info error' #----------------
177
+ puts <<EOF
178
+
179
+ No Rails project found.
180
+
181
+ EOF
182
+ when 'update error' #----------------
183
+ puts <<EOF
184
+
185
+ Rails project #{ARGV[1]} was not found.
186
+
187
+ EOF
188
+ when 'local db'
189
+ puts <<EOF
190
+
191
+ Error: cannot deploy app withou local_db set to false.
192
+ Place local_db: false in your config/badger.yml
193
+
194
+ EOF
195
+ end
196
+ end
197
+
198
+ end
199
+
200
+ class Errors
201
+ include ErrorList
202
+ end