cortex-reaver 0.0.9 → 0.1.0

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 (77) hide show
  1. data/bin/cortex_reaver +7 -2
  2. data/lib/cortex_reaver.rb +51 -71
  3. data/lib/cortex_reaver/config.rb +23 -7
  4. data/lib/cortex_reaver/controller/admin.rb +6 -8
  5. data/lib/cortex_reaver/controller/comment.rb +17 -17
  6. data/lib/cortex_reaver/controller/config.rb +3 -2
  7. data/lib/cortex_reaver/controller/controller.rb +22 -0
  8. data/lib/cortex_reaver/controller/documentation.rb +1 -3
  9. data/lib/cortex_reaver/controller/journal.rb +13 -12
  10. data/lib/cortex_reaver/controller/main.rb +36 -29
  11. data/lib/cortex_reaver/controller/page.rb +15 -11
  12. data/lib/cortex_reaver/controller/photograph.rb +21 -15
  13. data/lib/cortex_reaver/controller/project.rb +16 -13
  14. data/lib/cortex_reaver/controller/tag.rb +16 -14
  15. data/lib/cortex_reaver/controller/user.rb +11 -13
  16. data/lib/cortex_reaver/helper/attachments.rb +18 -12
  17. data/lib/cortex_reaver/helper/auth.rb +2 -2
  18. data/lib/cortex_reaver/helper/canonical.rb +2 -2
  19. data/lib/cortex_reaver/helper/crud.rb +78 -38
  20. data/lib/cortex_reaver/helper/feeds.rb +2 -5
  21. data/lib/cortex_reaver/helper/form.rb +1 -1
  22. data/lib/cortex_reaver/helper/navigation.rb +1 -1
  23. data/lib/cortex_reaver/helper/photographs.rb +12 -3
  24. data/lib/cortex_reaver/helper/template.rb +37 -0
  25. data/lib/cortex_reaver/{view/blank_layout.rhtml → layout/blank.rhtml} +1 -1
  26. data/lib/cortex_reaver/{view/text_layout.rhtml → layout/text.rhtml} +1 -1
  27. data/lib/cortex_reaver/migrations/013_draft.rb +17 -0
  28. data/lib/cortex_reaver/model/comment.rb +64 -53
  29. data/lib/cortex_reaver/model/journal.rb +23 -21
  30. data/lib/cortex_reaver/model/model.rb +9 -0
  31. data/lib/cortex_reaver/model/page.rb +24 -42
  32. data/lib/cortex_reaver/model/photograph.rb +17 -17
  33. data/lib/cortex_reaver/model/project.rb +21 -18
  34. data/lib/cortex_reaver/model/tag.rb +12 -8
  35. data/lib/cortex_reaver/model/user.rb +79 -41
  36. data/lib/cortex_reaver/public/css/main.css +4 -0
  37. data/lib/cortex_reaver/snippets/numeric.rb +15 -0
  38. data/lib/cortex_reaver/snippets/ramaze/cache/memcached.rb +14 -0
  39. data/lib/cortex_reaver/support/attachments.rb +113 -105
  40. data/lib/cortex_reaver/support/cached_rendering.rb +65 -62
  41. data/lib/cortex_reaver/support/canonical.rb +82 -85
  42. data/lib/cortex_reaver/support/comments.rb +57 -51
  43. data/lib/cortex_reaver/support/cortex_reaver_validation_helpers.rb +13 -0
  44. data/lib/cortex_reaver/support/sequenceable.rb +202 -203
  45. data/lib/cortex_reaver/support/tags.rb +103 -94
  46. data/lib/cortex_reaver/support/timestamps.rb +27 -21
  47. data/lib/cortex_reaver/support/viewable.rb +17 -0
  48. data/lib/cortex_reaver/version.rb +3 -3
  49. data/lib/cortex_reaver/view/admin/index.rhtml +2 -2
  50. data/lib/cortex_reaver/view/comments/comment.rhtml +4 -1
  51. data/lib/cortex_reaver/view/comments/list.rhtml +1 -1
  52. data/lib/cortex_reaver/view/comments/post_form.rhtml +1 -1
  53. data/lib/cortex_reaver/view/journals/form.rhtml +3 -1
  54. data/lib/cortex_reaver/view/journals/journal.rhtml +6 -4
  55. data/lib/cortex_reaver/view/journals/list.rhtml +2 -2
  56. data/lib/cortex_reaver/view/journals/show.rhtml +1 -1
  57. data/lib/cortex_reaver/view/pages/form.rhtml +2 -1
  58. data/lib/cortex_reaver/view/pages/list.rhtml +2 -2
  59. data/lib/cortex_reaver/view/pages/show.rhtml +1 -1
  60. data/lib/cortex_reaver/view/photographs/form.rhtml +7 -3
  61. data/lib/cortex_reaver/view/photographs/list.rhtml +1 -1
  62. data/lib/cortex_reaver/view/photographs/show.rhtml +7 -7
  63. data/lib/cortex_reaver/view/projects/form.rhtml +1 -0
  64. data/lib/cortex_reaver/view/projects/list.rhtml +3 -3
  65. data/lib/cortex_reaver/view/projects/show.rhtml +5 -2
  66. data/lib/cortex_reaver/view/tags/list.rhtml +6 -2
  67. data/lib/cortex_reaver/view/tags/show.rhtml +10 -5
  68. data/lib/cortex_reaver/view/users/form.rhtml +1 -1
  69. data/lib/cortex_reaver/view/users/list.rhtml +5 -2
  70. data/lib/cortex_reaver/view/users/login.rhtml +1 -1
  71. data/lib/cortex_reaver/view/users/show.rhtml +5 -1
  72. metadata +159 -149
  73. data/lib/cortex_reaver/public/dispatch.fcgi +0 -11
  74. data/lib/cortex_reaver/snippets/ramaze/dispatcher/file.rb +0 -37
  75. data/lib/cortex_reaver/support/pagination.rb +0 -38
  76. data/lib/cortex_reaver/view/error.rhtml +0 -72
  77. data/lib/cortex_reaver/view/photographs/short.rhtml +0 -3
data/bin/cortex_reaver CHANGED
@@ -95,6 +95,7 @@ module CortexReaver
95
95
  # Connect to current DB
96
96
  reload_config
97
97
  setup_db false
98
+ require 'sequel/extensions/migration'
98
99
  current_version = Sequel::Migrator.get_current_migration_version(db)
99
100
 
100
101
  puts "Using database #{config[:database][:host]}/#{config[:database][:database]}."
@@ -108,7 +109,7 @@ module CortexReaver
108
109
 
109
110
  # Connect to dump DB
110
111
  dump = Sequel.connect "sqlite:////#{File.expand_path(file)}"
111
- Sequel::Migrator.apply dump, LIB_DIR/:migrations, current_version
112
+ Sequel::Migrator.apply dump, File.join(LIB_DIR,:migrations), current_version
112
113
 
113
114
  # Copy tables
114
115
  db.tables.each do |table|
@@ -127,6 +128,7 @@ module CortexReaver
127
128
  # Connect to dump DB
128
129
  file = @values[:load_file]
129
130
  dump = Sequel.connect "sqlite:////#{File.expand_path(file)}"
131
+ require 'sequel/extensions/migration'
130
132
  current_version = Sequel::Migrator.get_current_migration_version(dump)
131
133
 
132
134
  # Connect to current DB
@@ -159,16 +161,19 @@ module CortexReaver
159
161
  reload_config
160
162
  response = open("http://#{config[:host] || 'localhost'}:#{config[:port]}/")
161
163
  puts response.status.join(' ');
164
+
162
165
  when :migrate
163
166
  version = @values[:schema_version]
164
167
 
165
168
  # Get ready
166
169
  reload_config
167
170
  setup_db false
171
+ self.load
168
172
  init
169
173
 
170
174
  puts "Using database #{config[:database][:host]}/#{config[:database][:database]}."
171
175
 
176
+ require 'sequel/extensions/migration'
172
177
  current_version = Sequel::Migrator.get_current_migration_version(db)
173
178
  latest_version = Sequel::Migrator.latest_migration_version(File.join(LIB_DIR, 'migrations'))
174
179
 
@@ -212,7 +217,6 @@ module CortexReaver
212
217
  # Start an IRB session
213
218
  reload_config
214
219
  setup
215
- Ramaze::Global.console = true
216
220
 
217
221
  # Don't let IRB try to interpret our command line
218
222
  ARGV.clear
@@ -233,6 +237,7 @@ module CortexReaver
233
237
 
234
238
  when :test
235
239
  require File.join(DIR, '..', 'spec', 'main.rb')
240
+
236
241
  else
237
242
  abort("Unknown action: #{@action}")
238
243
  end
data/lib/cortex_reaver.rb CHANGED
@@ -7,6 +7,10 @@ begin
7
7
  require 'sequel'
8
8
  require 'yaml'
9
9
  require 'socket'
10
+
11
+ require 'sequel/extensions/migration'
12
+ require 'sequel/extensions/inflector'
13
+ require 'sequel/extensions/blank'
10
14
  rescue LoadError => e
11
15
  puts e
12
16
  puts "You probably need to install some packages Cortex Reaver needs. Try:
@@ -18,8 +22,8 @@ end
18
22
  module CortexReaver
19
23
  # Paths
20
24
  ROOT = File.expand_path(File.join(__DIR__, '..'))
21
- LIB_DIR = File.join(ROOT, 'lib', 'cortex_reaver')
22
- HOME_DIR = Dir.pwd
25
+ LIB_DIR = File.expand_path(File.join(ROOT, 'lib', 'cortex_reaver'))
26
+ HOME_DIR = File.expand_path(Dir.pwd)
23
27
 
24
28
  # Some basic initial requirements
25
29
  require File.join(LIB_DIR, 'version')
@@ -44,18 +48,27 @@ module CortexReaver
44
48
 
45
49
  # Prepare Ramaze, create directories, etc.
46
50
  def self.init
47
- # Tell Ramaze where to find public files and views
48
- Ramaze::Global.public_root = File.join(LIB_DIR, 'public')
49
- Ramaze::Global.view_root = config[:view_root] || File.join(CortexReaver::LIB_DIR, 'view')
50
- Ramaze::Global.compile = config[:compile_views]
51
+ # App
52
+ Ramaze.options.app.name = :cortex_reaver
53
+
54
+ # Root directory
55
+ Ramaze::App[:cortex_reaver].options.roots = [LIB_DIR]
56
+ if config[:root]
57
+ Ramaze::App[:cortex_reaver].options.roots.unshift(config[:root])
58
+ end
59
+
60
+ # Server options
61
+ Ramaze.options.adapter.handler = config[:adapter]
62
+ Ramaze.options.adapter.host = config[:host]
63
+ Ramaze.options.adapter.port = config[:port]
51
64
 
52
65
  # Check directories
53
- if config[:public_root] and not File.directory? config[:public_root]
66
+ if config[:root] and not File.directory? config.public_root
54
67
  # Try to create a public directory
55
68
  begin
56
69
  FileUtils.mkdir_p config[:public_root]
57
70
  rescue => e
58
- Ramaze::Log.warn "Unable to create a public directory at #{config[:public_root]}: #{e}."
71
+ Ramaze::Log.warn "Unable to create a public directory at #{config.public_root}: #{e}."
59
72
  end
60
73
  end
61
74
  if config[:log_root] and not File.directory? config[:log_root]
@@ -75,36 +88,37 @@ module CortexReaver
75
88
 
76
89
  unless config[:daemon]
77
90
  # Log to console
78
- Ramaze::Log.loggers << Ramaze::Logger::Informer.new
91
+ Ramaze::Log.loggers << Logger.new(STDOUT)
79
92
  end
80
93
 
81
94
  case config[:mode]
82
95
  when :production
96
+ Ramaze.options.mode = :live
97
+
98
+ # Set up cache
99
+ case config[:cache]
100
+ when :memcache
101
+ Ramaze::Cache.options.default = Ramaze::Cache::MemCache
102
+ end
103
+
83
104
  if config[:log_root]
84
105
  # Log to file
85
- Ramaze::Log.loggers << Ramaze::Logger::Informer.new(
86
- File.join(config[:log_root], 'production.log'),
87
- [:error, :info, :notice]
106
+ Ramaze::Log.loggers << Logger.new(
107
+ File.join(config[:log_root], 'production.log')
88
108
  )
109
+ Ramaze::Log.level = Logger::Severity::INFO
89
110
  end
90
-
91
- # Don't reload source code
92
- Ramaze::Global.sourcereload = false
93
-
94
- # Don't expose errors
95
- Ramaze::Dispatcher::Error::HANDLE_ERROR.update({
96
- ArgumentError => [404, 'error_404'],
97
- Exception => [500, 'error_500']
98
- })
99
111
  when :development
112
+ Ramaze.options.mode = :dev
113
+
100
114
  if config[:log_root]
101
115
  # Log to file
102
- Ramaze::Log.loggers << Ramaze::Logger::Informer.new(
116
+ Ramaze::Log.loggers << Logger.new(
103
117
  File.join(config[:log_root], 'development.log')
104
118
  )
119
+ Ramaze::Log.level = Logger::Severity::DEBUG
105
120
 
106
121
  # Also use SQL log
107
- require 'logger'
108
122
  db.logger = Logger.new(
109
123
  File.join(config[:log_root], 'sql.log')
110
124
  )
@@ -114,31 +128,15 @@ module CortexReaver
114
128
  end
115
129
 
116
130
  # Prepare view directory
117
- if config[:view_root]
118
- if not File.directory? config[:view_root]
131
+ if config.view_root
132
+ if not File.directory? config.view_root
119
133
  # Try to create a view directory
120
134
  begin
121
- FileUtils.mkdir_p config[:view_root]
135
+ FileUtils.mkdir_p config.view_root
122
136
  rescue => e
123
137
  Ramaze::Log.warn "Unable to create a view directory at #{config[:view_root]}: #{e}."
124
138
  end
125
139
  end
126
-
127
- if File.directory? config[:view_root]
128
- # Link in default views
129
- source = File.join(LIB_DIR, 'view')
130
- dest = config[:view_root].sub(/\/$/, '')
131
- Find.find(source) do |path|
132
- dest_path = path.sub(source, dest)
133
- if File.directory? path and not File.exists? dest_path
134
- # Link this directory
135
- FileUtils.ln_s path, dest_path
136
- Find.prune
137
- elsif File.file? path and not File.exists? dest_path
138
- FileUtils.ln_s path, dest_path
139
- end
140
- end
141
- end
142
140
  end
143
141
 
144
142
  # Load plugins
@@ -151,12 +149,14 @@ module CortexReaver
151
149
  # Load libraries
152
150
  def self.load
153
151
  # Load controllers and models
152
+ require File.join(LIB_DIR, 'config')
153
+ require File.join(LIB_DIR, 'plugin')
154
+ require File.join(LIB_DIR, 'version')
154
155
  Ramaze::acquire File.join(LIB_DIR, 'snippets', '**', '*')
155
156
  Ramaze::acquire File.join(LIB_DIR, 'support', '*')
156
- Ramaze::acquire File.join(LIB_DIR, 'model', '*')
157
+ require File.join(LIB_DIR, 'model', 'model')
157
158
  Ramaze::acquire File.join(LIB_DIR, 'helper', '*')
158
- Ramaze::acquire File.join(LIB_DIR, 'controller', '*')
159
- Ramaze::acquire File.join(LIB_DIR, '**', '*')
159
+ require File.join(LIB_DIR, 'controller', 'controller')
160
160
  end
161
161
 
162
162
  # Reloads the site configuration
@@ -179,23 +179,6 @@ module CortexReaver
179
179
  def self.run
180
180
  # Shutdown callback
181
181
  at_exit do
182
- # Unlink templates
183
- begin
184
- if config[:view_root]
185
- Find.find(config[:view_root]) do |path|
186
- if File.symlink? path # TODO: identify link target
187
- begin
188
- File.delete path
189
- rescue => e
190
- Ramaze::Log.error "Unable to unlink symlinked view #{path}: #{e}"
191
- end
192
- end
193
- end
194
- end
195
- rescue => e2
196
- Ramaze::Log.error "Unable to unlink symlinked views in #{config[:view_root]}: #{e}"
197
- end
198
-
199
182
  # Remove pidfile
200
183
  FileUtils.rm(config[:pidfile]) if File.exist? config[:pidfile]
201
184
  end
@@ -203,12 +186,8 @@ module CortexReaver
203
186
  Ramaze::Log.info "Cortex Reaver #{Process.pid} stalking victims."
204
187
 
205
188
  # Run Ramaze
206
- Ramaze.startup(
207
- :force => true,
208
- :adapter => config[:adapter],
209
- :host => config[:host],
210
- :port => config[:port]
211
- )
189
+ # Ramaze.start :root => [config[:root], LIB_DIR]
190
+ Ramaze.start :root => LIB_DIR
212
191
 
213
192
  puts "Cortex Reaver finished."
214
193
  end
@@ -218,11 +197,11 @@ module CortexReaver
218
197
  # Connect to DB
219
198
  setup_db
220
199
 
221
- # Prepare Ramaze, check directories, etc.
222
- init
223
-
224
200
  # Load library
225
201
  self.load
202
+
203
+ # Prepare Ramaze, check directories, etc.
204
+ init
226
205
  end
227
206
 
228
207
  # Connect to DB. If check_schema is false, doesn't check to see that the schema
@@ -238,6 +217,7 @@ module CortexReaver
238
217
  string = "#{d[:driver]}://#{d[:user]}:#{d[:password]}@#{d[:host]}/#{d[:database]}"
239
218
  end
240
219
 
220
+ # Connect
241
221
  begin
242
222
  @db = Sequel.connect(string)
243
223
  rescue => e
@@ -4,11 +4,8 @@ module CortexReaver
4
4
  # Pass a YAML file with configuration options. At a minimum, it should specify
5
5
  # :database = {:proto, :username, :pasword, :host, :database}
6
6
  # or :database = "sequel_connect_string"
7
- #
8
- # :public_root - The directory public files are hosted from. Defaults to
9
- # HOME_DIR/public.
10
- # :view_root - The directory containing erubis view templates. Defaults to
11
- # Cortex Reaver's builtin templates.
7
+ # :root - The directory containing public/, layout/, and view/.
8
+ # Defaults to HOME_DIR.
12
9
  # :log_root - The directory that Cortex Reaver should log to. Defaults to
13
10
  # HOME_DIR/log. If nil, file logging disabled.
14
11
  # :plugin_root - The directory that Cortex Reaver plugins live in. Defaults
@@ -17,6 +14,7 @@ module CortexReaver
17
14
  # :daemon - Whether to daemonize or not. Defaults to :true if :mode
18
15
  # is :production, otherwise nil.
19
16
  # :adapter - The Ramaze adapter name (default 'thin')
17
+ # :cache - The Ramaze cache to use (default: :memory)
20
18
  # :host - Host to bind to
21
19
  # :port - Port to bind to (default 7000)
22
20
  # :pidfile - Process ID file for this server. Defaults to
@@ -38,12 +36,12 @@ module CortexReaver
38
36
  File.expand_path(CortexReaver::HOME_DIR),
39
37
  'cortex_reaver.db'
40
38
  )
41
- self[:public_root] = File.join(CortexReaver::HOME_DIR, 'public')
42
- self[:view_root] = nil
39
+ self[:root] = CortexReaver::HOME_DIR
43
40
  self[:log_root] = File.join(CortexReaver::HOME_DIR, 'log')
44
41
  self[:plugin_root] = File.join(CortexReaver::HOME_DIR, 'plugins')
45
42
  self[:mode] = :production
46
43
  self[:adapter] = 'thin'
44
+ self[:cache] = :memory
47
45
  self[:host] = nil
48
46
  self[:port] = 7000
49
47
  self[:plugins] = []
@@ -73,5 +71,23 @@ module CortexReaver
73
71
  # Compile views
74
72
  self[:compile_views] ||= true if self[:mode] == :production
75
73
  end
74
+
75
+ def public_root
76
+ if self[:root]
77
+ File.join(self[:root], 'public')
78
+ end
79
+ end
80
+
81
+ def view_root
82
+ if self[:root]
83
+ File.join(self[:root], 'view')
84
+ end
85
+ end
86
+
87
+ def layout_root
88
+ if self[:root]
89
+ File.join(self[:root], 'layout')
90
+ end
91
+ end
76
92
  end
77
93
  end
@@ -1,15 +1,13 @@
1
1
  module CortexReaver
2
- class AdminController < Ramaze::Controller
2
+ class AdminController < Controller
3
3
 
4
4
  map '/admin'
5
- layout '/text_layout'
6
- engine :Erubis
7
5
 
8
- helper :error,
9
- :auth,
10
- :form,
11
- :workflow,
12
- :aspect
6
+ layout(:text) do
7
+ not request.xhr?
8
+ end
9
+
10
+ helper :aspect
13
11
 
14
12
  before_all do
15
13
  require_roles :admin
@@ -1,25 +1,27 @@
1
1
  module CortexReaver
2
- class CommentController < Ramaze::Controller
2
+ class CommentController < Controller
3
3
  MODEL = Comment
4
4
 
5
5
  map '/comments'
6
- layout '/text_layout'
7
- template :edit, :form
8
- template :new, :form
9
- engine :Erubis
6
+
7
+ layout(:text) do |name, wish|
8
+ not request.xhr? and name != 'atom'
9
+ end
10
+
11
+ alias_view :edit, :form
12
+ alias_view :new, :form
13
+ alias_view :page, :list
14
+ alias_view :index, :list
10
15
 
11
16
  helper :cache,
12
- :error,
13
- :auth,
14
- :form,
15
- :workflow,
16
- :navigation,
17
17
  :date,
18
18
  :canonical,
19
19
  :crud,
20
20
  :feeds
21
21
 
22
- cache :index, :ttl => 60
22
+ cache_action(:method => :index, :ttl => 120) do
23
+ user.id.to_i.to_s + flash.inspect
24
+ end
23
25
 
24
26
  on_save do |comment, request|
25
27
  comment.title = request[:title]
@@ -55,15 +57,13 @@ module CortexReaver
55
57
  def page(page)
56
58
  @title = "Recent Comments"
57
59
  @comments = Comment.order(:created_on).reverse.limit(16)
58
-
59
- render_template :list
60
60
  end
61
61
 
62
62
  # This action is referenced by public comment-posting forms.
63
63
  def post
64
64
  unless request.post?
65
65
  flash[:error] = "No comment to post!"
66
- redirect_to R(:/)
66
+ redirect_to MainController.r
67
67
  end
68
68
 
69
69
  # Check for robots
@@ -71,7 +71,7 @@ module CortexReaver
71
71
  request[:comment].blank?
72
72
  # Robot!?
73
73
  flash[:error] = "Cortex Reaver is immune to your drivel, spambot."
74
- redirect R(:/)
74
+ redirect MainController.r
75
75
  end
76
76
 
77
77
  begin
@@ -110,7 +110,7 @@ module CortexReaver
110
110
  raise unless @comment.save
111
111
 
112
112
  # Clear action cache
113
- action_cache.delete '/index'
113
+ Ramaze::Cache.action.clear
114
114
 
115
115
  flash[:notice] = "Your comment (<a href=\"##{@comment.url.gsub(/.*#/, '')}\">#{h @comment.title}</a>) has been posted."
116
116
  redirect @comment.parent.url
@@ -124,7 +124,7 @@ module CortexReaver
124
124
  session[:pending_comment] = @comment
125
125
  redirect @comment.parent.url + '#post-comment'
126
126
  else
127
- redirect R(:/)
127
+ redirect MainController.r
128
128
  end
129
129
  end
130
130
  end
@@ -1,8 +1,9 @@
1
1
  module CortexReaver
2
2
  class ConfigController < Ramaze::Controller
3
3
  map '/config'
4
- layout '/text_layout'
5
- template :edit, :form
4
+ layout(:text_layout)
5
+
6
+ alias_view :edit, :form
6
7
  engine :Erubis
7
8
 
8
9
  helper :error,