typo 4.0.0 → 4.0.1

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 (82) hide show
  1. data/app/controllers/admin/comments_controller.rb +1 -1
  2. data/app/controllers/admin/content_controller.rb +1 -3
  3. data/app/controllers/admin/feedback_controller.rb +36 -31
  4. data/app/controllers/admin/sidebar_controller.rb +13 -2
  5. data/app/controllers/admin/users_controller.rb +2 -1
  6. data/app/controllers/articles_controller.rb +10 -19
  7. data/app/controllers/xml_controller.rb +2 -2
  8. data/app/helpers/admin/base_helper.rb +7 -3
  9. data/app/helpers/application_helper.rb +2 -2
  10. data/app/helpers/articles_helper.rb +5 -4
  11. data/app/models/article.rb +16 -10
  12. data/app/models/blog.rb +4 -10
  13. data/app/models/comment.rb +17 -36
  14. data/app/models/content.rb +31 -53
  15. data/app/models/content_state/base.rb +46 -3
  16. data/app/models/content_state/draft.rb +2 -9
  17. data/app/models/content_state/ham.rb +31 -0
  18. data/app/models/content_state/just_marked_as_ham.rb +10 -0
  19. data/app/models/content_state/just_marked_as_spam.rb +23 -0
  20. data/app/models/content_state/just_presumed_ham.rb +37 -0
  21. data/app/models/content_state/just_published.rb +15 -8
  22. data/app/models/content_state/new.rb +3 -10
  23. data/app/models/content_state/presumed_ham.rb +27 -0
  24. data/app/models/content_state/presumed_spam.rb +31 -0
  25. data/app/models/content_state/publication_pending.rb +7 -9
  26. data/app/models/content_state/published.rb +10 -9
  27. data/app/models/content_state/spam.rb +23 -0
  28. data/app/models/content_state/unclassified.rb +29 -0
  29. data/app/models/content_state/withdrawn.rb +28 -0
  30. data/app/models/email_notifier.rb +0 -1
  31. data/app/models/feedback.rb +151 -0
  32. data/app/models/trackback.rb +22 -29
  33. data/app/views/admin/feedback/_item.rhtml +5 -5
  34. data/app/views/admin/feedback/list.rhtml +13 -11
  35. data/app/views/admin/general/index.rhtml +8 -4
  36. data/app/views/admin/users/show.rhtml +7 -1
  37. data/app/views/articles/read.rhtml +2 -2
  38. data/bin/typo +7 -6
  39. data/components/plugins/sidebars/recent_comments_controller.rb +1 -1
  40. data/config/environment.rb +2 -0
  41. data/db/migrate/046_fixup_forthcoming_publications.rb +1 -1
  42. data/db/migrate/048_remove_count_caching.rb +31 -0
  43. data/db/migrate/049_move_feedback_to_new_state_machine.rb +33 -0
  44. data/db/schema.mysql-v3.sql +3 -4
  45. data/db/schema.mysql.sql +3 -4
  46. data/db/schema.postgresql.sql +3 -4
  47. data/db/schema.rb +12 -17
  48. data/db/schema.sqlite.sql +3 -4
  49. data/db/schema.sqlserver.sql +3 -4
  50. data/db/schema_version +1 -1
  51. data/doc/Installer.txt +4 -0
  52. data/lib/jabber_notify.rb +6 -2
  53. data/lib/sidebars/plugin.rb +2 -1
  54. data/lib/tasks/release.rake +5 -4
  55. data/lib/typo_version.rb +1 -1
  56. data/public/stylesheets/administration.css +22 -2
  57. data/test/fixtures/blogs.yml +2 -0
  58. data/test/fixtures/contents.yml +7 -7
  59. data/test/functional/admin/users_controller_test.rb +3 -0
  60. data/test/functional/articles_controller_test.rb +16 -1
  61. data/test/mocks/test/xmlrpc_mock.rb +5 -4
  62. data/test/unit/article_test.rb +16 -4
  63. data/test/unit/comment_test.rb +57 -35
  64. data/test/unit/content_state/factory_test.rb +7 -6
  65. data/test/unit/ping_test.rb +14 -0
  66. data/test/unit/trackback_test.rb +16 -15
  67. metadata +26 -26
  68. data/config/database.yml-pgsql +0 -17
  69. data/config/database.yml.sqlite +0 -14
  70. data/config/mail.yml +0 -8
  71. data/config/mongrel.conf +0 -2
  72. data/db/converters/mt-import.rb +0 -72
  73. data/db/development_structure.sql +0 -691
  74. data/installer/rails-installer.rb +0 -527
  75. data/installer/rails-installer/commands.rb +0 -118
  76. data/installer/rails-installer/web-servers.rb +0 -110
  77. data/log/development.log-1 +0 -991
  78. data/log/development.log-2 +0 -422
  79. data/log/development.log-3 +0 -429
  80. data/log/development.log-4 +0 -174
  81. data/svk-commitP6cVv.tmp +0 -1
  82. data/vendor/ruby-mp3info/lib/mp3info.rb +0 -720
@@ -1,527 +0,0 @@
1
- require 'fileutils'
2
- require 'readline'
3
- require 'rubygems'
4
- require 'yaml'
5
- require 'digest/sha1'
6
-
7
- require 'installer/rails-installer/web-servers'
8
- require 'installer/rails-installer/commands'
9
-
10
- class RailsInstaller
11
- include FileUtils
12
- attr_accessor :install_directory, :source_directory, :config
13
- attr_accessor :message_proc
14
-
15
- class InstallFailed < StandardError; end
16
-
17
- @@rails_version = nil
18
-
19
- def self.application_name(name)
20
- @@app_name = name
21
- end
22
-
23
- def self.support_location(location)
24
- @@support_location = location
25
- end
26
-
27
- def self.rails_version(svn_tag)
28
- @@rails_version = svn_tag
29
- end
30
-
31
- def app_name
32
- @@app_name
33
- end
34
-
35
- def initialize(install_directory)
36
- # use an absolute path, not a relative path.
37
- if install_directory
38
- @install_directory = File.expand_path(install_directory)
39
- end
40
-
41
- @config = read_yml(config_file) rescue nil
42
- @config ||= Hash.new
43
- end
44
-
45
- # Display a status message
46
- def message(string)
47
- if message_proc
48
- message_proc.call(string)
49
- else
50
- STDERR.puts string
51
- end
52
- end
53
-
54
- # Install Application
55
- def install(version=nil)
56
- @source_directory = find_source_directory(@@app_name,version)
57
-
58
- # Merge default configuration settings
59
- @config = read_yml(backup_config_file).merge(config)
60
-
61
- install_sequence
62
-
63
- message ''
64
- message "#{@@app_name.capitalize} is now running on http://#{`hostname`.chomp}:#{config['port-number']}"
65
- message "Use '#{@@app_name} start #{install_directory}' to restart after boot."
66
- message "Look in installer/*.conf.example to see how to integrate with your web server."
67
- end
68
-
69
- # The default install sequence. Override this if you need to add extra
70
- # steps to the installer.
71
- def install_sequence
72
- stop
73
-
74
- backup_database
75
- install_pre_hook
76
- pre_migrate_database
77
- copy_files
78
- freeze_rails
79
- create_default_config_files
80
- fix_permissions
81
- create_directories
82
- create_initial_database
83
- set_initial_port_number
84
- expand_template_files
85
-
86
- migrate
87
- install_post_hook
88
- save
89
-
90
- run_rails_tests
91
-
92
- start
93
- end
94
-
95
- def install_pre_hook
96
- end
97
-
98
- def install_post_hook
99
- end
100
-
101
- # Start application in the background
102
- def start(foreground = false)
103
- server_class = RailsInstaller::WebServer.servers[config['web-server']]
104
- if not server_class
105
- message "** warning: web-server #{config['web-server']} unknown. Use 'web-server=external' to disable."
106
- end
107
-
108
- server_class.start(self,foreground)
109
- end
110
-
111
- # Stop application
112
- def stop
113
- return unless File.directory?(install_directory)
114
-
115
- server_class = RailsInstaller::WebServer.servers[config['web-server']]
116
- if not server_class
117
- message "** warning: web-server #{config['web-server']} unknown. Use 'web-server=external' to disable."
118
- end
119
-
120
- server_class.stop(self)
121
- end
122
-
123
- # private
124
-
125
- # The name of the sqlite database file
126
- def db_file
127
- File.join(install_directory,'db','database.sqlite')
128
- end
129
-
130
- # Backup the database
131
- def backup_database
132
- return unless File.exists? db_file
133
-
134
- return unless config['database'] == 'sqlite'
135
- new_db_file = db_file+"-#{Time.now.strftime('%Y%m%d-%H%M')}.sql"
136
-
137
- message "Backing up existing SQLite database into #{new_db_file}"
138
- system("sqlite3 #{db_file} .dump > #{new_db_file}")
139
- end
140
-
141
- # Copy files from the source directory to the target directory.
142
- def copy_files
143
- message "Checking for existing #{@@app_name.capitalize} install in #{install_directory}"
144
- files_yml = File.join(install_directory,'installer','files.yml')
145
- old_files = read_yml(files_yml) rescue Hash.new
146
-
147
- message "Reading files from #{source_directory}"
148
- new_files = sha1_hash_directory_tree(source_directory)
149
- new_files.delete('/config/database.yml') # Never copy this.
150
-
151
- # Next, we compare the original install hash to the current hash. For each
152
- # entry:
153
- #
154
- # - in new_file but not in old_files: copy
155
- # - in old files but not in new_files: delete
156
- # - in both, but hash different: copy
157
- # - in both, hash same: don't copy
158
- #
159
- # We really should add a third hash (existing_files) and compare against that
160
- # so we don't overwrite changed files.
161
-
162
- added, changed, deleted, same = hash_diff(old_files, new_files)
163
-
164
- if added.size > 0
165
- message "Copying #{added.size} new files into #{install_directory}"
166
- added.keys.sort.each do |file|
167
- message " copying #{file}"
168
- copy_one_file(file)
169
- end
170
- end
171
-
172
- if changed.size > 0
173
- message "Updating #{changed.size} files in #{install_directory}"
174
- changed.keys.sort.each do |file|
175
- message " updating #{file}"
176
- copy_one_file(file)
177
- end
178
- end
179
-
180
- if deleted.size > 0
181
- message "Deleting #{deleted.size} files from #{install_directory}"
182
-
183
- deleted.keys.sort.each do |file|
184
- message " deleting #{file}"
185
- rm(File.join(install_directory,file))
186
- end
187
- end
188
-
189
- write_yml(files_yml,new_files)
190
- end
191
-
192
- # Copy one file from source_directory to install_directory, creating directories as needed.
193
- def copy_one_file(filename)
194
- source_name = File.join(source_directory,filename)
195
- install_name = File.join(install_directory,filename)
196
- dir_name = File.dirname(install_name)
197
-
198
- mkdir_p(dir_name)
199
- cp(source_name,install_name,:preserve => true)
200
- end
201
-
202
- # Compute the different between two hashes. Returns four hashes,
203
- # one contains the keys that are in 'b' but not in 'a' (added entries),
204
- # the next contains keys that are in 'a' and 'b', but have different values
205
- # (changed). The third contains keys that are in 'b' but not 'a' (added).
206
- # The final hash contains items that are the same in each.
207
- def hash_diff(a, b)
208
- added = {}
209
- changed = {}
210
- deleted = {}
211
- same = {}
212
-
213
- seen = {}
214
-
215
- a.each_key do |k|
216
- seen[k] = true
217
-
218
- if b.has_key? k
219
- if b[k] == a[k]
220
- same[k] = true
221
- else
222
- changed[k] = true
223
- end
224
- else
225
- deleted[k] = true
226
- end
227
- end
228
-
229
- b.each_key do |k|
230
- unless seen[k]
231
- added[k] = true
232
- end
233
- end
234
-
235
- [added, changed, deleted, same]
236
- end
237
-
238
- # Freeze to a specific version of Rails
239
- def freeze_rails
240
- return unless @@rails_version
241
- version_file = File.join(install_directory,'vendor','rails-version')
242
- vendor_rails = File.join(install_directory,'vendor','rails')
243
-
244
- old_version = File.read(version_file).chomp rescue nil
245
-
246
- if @@rails_version == old_version
247
- return
248
- elsif old_version != nil
249
- rm_rf(vendor_rails)
250
- end
251
-
252
- mkdir_p(vendor_rails)
253
-
254
- package_map = {
255
- 'rails' => File.join(vendor_rails,'railties'),
256
- 'actionmailer' => File.join(vendor_rails,'actionmailer'),
257
- 'actionpack' => File.join(vendor_rails,'actionpack'),
258
- 'actionwebservice' => File.join(vendor_rails,'actionwebservice'),
259
- 'activerecord' => File.join(vendor_rails,'activerecord'),
260
- 'activesupport' => File.join(vendor_rails,'activesupport'),
261
- }
262
-
263
- specs = Gem.source_index.find_name('rails',["= #{@@rails_version}"])
264
-
265
- unless specs.to_a.size > 0
266
- raise InstallFailed, "Can't locate Rails #{@@rails_version}!"
267
- end
268
-
269
- copy_gem(specs.first, package_map[specs.first.name])
270
-
271
- specs.first.dependencies.each do |dep|
272
- next unless package_map[dep.name]
273
-
274
- dep_spec = Gem.source_index.find_name(dep.name,[dep.version_requirements.to_s])
275
- if dep_spec.size == 0
276
- raise InstallFailed, "Can't locate dependency #{dep.name} #{dep.version_requirements.to_s}"
277
- end
278
-
279
- copy_gem(dep_spec.first, package_map[dep.name])
280
- end
281
-
282
- File.open(version_file,'w') do |f|
283
- f.puts @@rails_version
284
- end
285
- end
286
-
287
- def copy_gem(spec, destination)
288
- message("copying #{spec.name} #{spec.version} to #{destination}")
289
- cp_r("#{spec.full_gem_path}/.",destination)
290
- end
291
-
292
- # Create all default config files
293
- def create_default_config_files
294
- create_default_database_yml
295
- end
296
-
297
- # Create the default database.yml
298
- def create_default_database_yml
299
- database_yml = File.join(install_directory,'config','database.yml')
300
-
301
- if File.exist?(database_yml)
302
- message "Preserving database.yml"
303
- return
304
- end
305
-
306
- message "Creating default database configuration file"
307
- cp("#{database_yml}.#{config['database']}",database_yml)
308
- end
309
-
310
- def fix_permissions
311
- unless RUBY_PLATFORM =~ /mswin32/
312
- message "Making scripts executable"
313
- chmod 0555, File.join(install_directory,'public','dispatch.fcgi')
314
- chmod 0555, File.join(install_directory,'public','dispatch.cgi')
315
- chmod 0555, Dir[File.join(install_directory,'script','*')]
316
- end
317
- end
318
-
319
- # Create required directories, like tmp
320
- def create_directories
321
- mkdir_p(File.join(install_directory,'tmp','cache'))
322
- chmod(755, File.join(install_directory,'tmp','cache'))
323
- mkdir_p(File.join(install_directory,'tmp','session'))
324
- mkdir_p(File.join(install_directory,'tmp','sockets'))
325
- mkdir_p(File.join(install_directory,'log'))
326
- File.open(File.join(install_directory,'log','development.log'),'w')
327
- File.open(File.join(install_directory,'log','production.log'),'w')
328
- File.open(File.join(install_directory,'log','testing.log'),'w')
329
- end
330
-
331
- # Create the initial SQLite database
332
- def create_initial_database
333
- return if File.exists? db_file
334
- return unless config['database'] == 'sqlite'
335
-
336
- message "Creating initial #{@@app_name.capitalize} SQLite database"
337
- schema_file = File.join(install_directory,'db','schema.sqlite.sql')
338
- system("sqlite3 #{db_file} < #{schema_file}")
339
- end
340
-
341
- # Get the current schema version
342
- def get_schema_version
343
- File.read(File.join(install_directory,'db','schema_version')).to_i rescue 0
344
- end
345
-
346
- # The path to the installed config file
347
- def config_file
348
- File.join(install_directory,'installer','rails_installer.yml')
349
- end
350
-
351
- # The path to the config file that comes with the GEM
352
- def backup_config_file
353
- File.join(source_directory,'installer','rails_installer_defaults.yml')
354
- end
355
-
356
- # Pick a default port number
357
- def set_initial_port_number
358
- config['port-number'] ||= (rand(1000)+4000)
359
- end
360
-
361
- def pre_migrate_database
362
- old_schema_version = get_schema_version
363
- new_schema_version = File.read(File.join(source_directory,'db','schema_version')).to_i
364
-
365
- return unless old_schema_version > 0
366
-
367
-
368
- # Are we downgrading?
369
- if old_schema_version > new_schema_version
370
- message "Downgrading schema from #{old_schema_version} to #{new_schema_version}"
371
-
372
- in_directory install_directory do
373
- unless system("rake -s migrate VERSION=#{new_schema_version}")
374
- raise InstallFailed, "Downgrade migrating from #{old_schema_version} to #{new_schema_version} failed."
375
- end
376
- end
377
- end
378
- end
379
-
380
- # Migrate the database
381
- def migrate
382
- message "Migrating #{@@app_name.capitalize}'s database to newest release"
383
-
384
- in_directory install_directory do
385
- unless system("rake -s migrate")
386
- raise InstallFailed, "Migration failed"
387
- end
388
- end
389
- end
390
-
391
- # Sweep the cache
392
- def run_rails_tests
393
- message "Running tests. This may take a minute or two"
394
-
395
- in_directory install_directory do
396
- if system_silently("rake -s test")
397
- message "All tests pass. Congratulations."
398
- else
399
- message "***** Tests failed *****"
400
- message "** Please run 'rake test' by hand in your install directory."
401
- message "** Report problems to #{@@support_location}."
402
- message "***** Tests failed *****"
403
- end
404
- end
405
- end
406
-
407
- def sha1_hash_directory_tree(directory, prefix='', hash={})
408
- Dir.entries(directory).each do |file|
409
- next if file =~ /^\./
410
- pathname = File.join(directory,file)
411
- if File.directory?(pathname)
412
- sha1_hash_directory_tree(pathname, File.join(prefix,file), hash)
413
- else
414
- hash[File.join(prefix,file)] = Digest::SHA1.hexdigest(File.read(pathname))
415
- end
416
- end
417
-
418
- hash
419
- end
420
-
421
- def save
422
- write_yml(config_file,@config)
423
- end
424
-
425
- def read_yml(filename)
426
- YAML.load(File.read(filename))
427
- end
428
-
429
- def write_yml(filename,object)
430
- File.open(filename,'w') do |f|
431
- f.write(YAML.dump(object))
432
- end
433
- end
434
-
435
- # Locate the source directory for a specific Version
436
- def find_source_directory(gem_name, version)
437
- if version == 'cwd'
438
- return Dir.pwd
439
- elsif version
440
- version_array = ["= #{version}"]
441
- else
442
- version_array = ["> 0.0.0"]
443
- end
444
-
445
- specs = Gem.source_index.find_name(gem_name,version_array)
446
- unless specs.to_a.size > 0
447
- raise InstallFailed, "Can't locate version #{version}!"
448
- end
449
-
450
- specs.last.full_gem_path
451
- end
452
-
453
- def system_silently(command)
454
- if RUBY_PLATFORM =~ /mswin32/
455
- null = 'NUL:'
456
- else
457
- null = '/dev/null'
458
- end
459
-
460
- system("#{command} > #{null} 2> #{null}")
461
- end
462
-
463
- def expand_template_files
464
- rails_host = config['bind-address'] || `hostname`.chomp
465
- rails_port = config['port-number'].to_s
466
- rails_url = "http://#{rails_host}:#{rails_port}"
467
- Dir[File.join(install_directory,'installer','*.template')].each do |template_file|
468
- output_file = template_file.gsub(/\.template/,'')
469
- next if File.exists?(output_file) # don't overwrite files
470
-
471
- message "expanding #{File.basename(output_file)} template"
472
-
473
- text = File.read(template_file).gsub(/\$RAILS_URL/,rails_url).gsub(/\$RAILS_HOST/,rails_host).gsub(/\$RAILS_PORT/,rails_port)
474
-
475
- File.open(output_file,'w') do |f|
476
- f.write text
477
- end
478
- end
479
- end
480
-
481
- # Execute a command-line command
482
- def execute_command(*args)
483
- if args.size < 2
484
- display_help
485
- exit(1)
486
- end
487
-
488
- command_class = Command.commands[args.first]
489
-
490
- if command_class
491
- command_class.command(self,*(args[2..-1]))
492
- else
493
- display_help
494
- exit(1)
495
- end
496
- end
497
-
498
- def display_help(error=nil)
499
- STDERR.puts error if error
500
-
501
- commands = Command.commands.keys.sort
502
- commands.each do |cmd|
503
- cmd_class = Command.commands[cmd]
504
- flag_help = cmd_class.flag_help_text.gsub(/APPNAME/,app_name)
505
- help = cmd_class.help_text.gsub(/APPNAME/,app_name)
506
-
507
- STDERR.puts " #{app_name} #{cmd} DIRECTORY #{flag_help}"
508
- STDERR.puts " #{help}"
509
- end
510
- end
511
- end
512
-
513
- # Run a block inside of a specific directory. Chdir into the directory
514
- # before executing the block, then chdir back to the original directory
515
- # when the block exits.
516
- def in_directory(directory)
517
- begin
518
- old_dir = Dir.pwd
519
- Dir.chdir(directory)
520
- value = yield
521
- ensure
522
- Dir.chdir(old_dir)
523
- end
524
-
525
- return value
526
- end
527
-