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
@@ -1,78 +1,58 @@
1
1
  module CortexReaver
2
2
  class Comment < Sequel::Model(:comments)
3
- include CortexReaver::Model::Timestamps
4
- include CortexReaver::Model::CachedRendering
3
+ plugin :timestamps
4
+ plugin :cached_rendering
5
+ plugin :comments
6
+ plugin :sequenceable
7
+
5
8
  include CortexReaver::Model::Renderer
6
- include CortexReaver::Model::Comments
7
- include CortexReaver::Model::Sequenceable
8
9
 
9
- belongs_to :creator, :class => 'CortexReaver::User', :key => 'created_by'
10
- belongs_to :updater, :class => 'CortexReaver::User', :key => 'updated_by'
11
- belongs_to :journal, :class => 'CortexReaver::Journal'
12
- belongs_to :project, :class => 'CortexReaver::Project'
13
- belongs_to :photograph, :class => 'CortexReaver::Photograph'
14
- belongs_to :page, :class => 'CortexReaver::Page'
15
- belongs_to :comment, :class => 'CortexReaver::Comment'
16
- has_many :comments, :class => 'CortexReaver::Comment'
17
-
18
- validates do
19
- presence_of :body
20
- length_of :title, :maximum => 255, :allow_nil => true
21
- length_of :name, :maximum => 255, :allow_nil => true
22
- length_of :http, :maximum => 255, :allow_nil => true
23
- length_of :email, :maximum => 255, :allow_nil => true
24
- format_of :email,
25
- :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/, :allow_nil => true
26
- end
27
-
28
- # Ensure comments with an email specified do *not* conflict with another user.
29
- validates_each :email do |object, attribute, value|
30
- if (not value.blank?) and User.filter(:email => value).count > 0
31
- object.errors[attribute] << 'conflicts with a registered user'
32
- end
33
- end
34
-
35
- # Ensures comments belong to exactly one parent.
36
- validates_each :page_id do |object, attribute, value|
37
- count = 0
38
- [:page_id, :project_id, :journal_id, :comment_id, :photograph_id].each do |field|
39
- unless object[field].blank?
40
- count += 1
41
- if count > 1
42
- object.errors[attribute] << 'has too many kinds of parents'
43
- break
44
- end
45
- end
46
- end
47
-
48
- if count == 0
49
- object.errors[attribute] << "doesn't have a parent"
50
- end
51
- end
10
+ many_to_one :creator, :class => 'CortexReaver::User', :key => 'created_by'
11
+ many_to_one :updater, :class => 'CortexReaver::User', :key => 'updated_by'
12
+ many_to_one :journal, :class => 'CortexReaver::Journal'
13
+ many_to_one :project, :class => 'CortexReaver::Project'
14
+ many_to_one :photograph, :class => 'CortexReaver::Photograph'
15
+ many_to_one :page, :class => 'CortexReaver::Page'
16
+ many_to_one :comment, :class => 'CortexReaver::Comment'
17
+ one_to_many :comments, :class => 'CortexReaver::Comment'
52
18
 
53
19
  # Infer blank titles
54
- before_save(:infer_title) do
20
+ def before_save
21
+ return false unless super
22
+
55
23
  if title.blank?
56
24
  title = 'Re: ' + parent.title.to_s
57
25
  title.gsub!(/^(Re: )+/, 'Re: ')
58
26
  self.title = title
59
27
  end
28
+
29
+ true
60
30
  end
61
31
 
62
32
  # Update parent comment counts
63
- before_destroy(:decrement_parent_comment_count) do
33
+ def before_destroy
34
+ return false unless super
35
+
64
36
  parent = self.parent
65
37
  parent.comment_count -= 1
66
38
  parent.skip_timestamp_update = true
67
39
  parent.save
40
+
41
+ true
68
42
  end
69
43
 
70
- after_create(:increment_parent_comment_count) do
71
- # WARNING: If we *reparent* comments as opposed to just posting, this will break.
44
+ # Increment parent comment count
45
+ # WARNING: If we *reparent* comments as opposed to just posting, this will
46
+ # break.
47
+ def after_create
48
+ super
49
+
72
50
  parent = self.parent
73
51
  parent.comment_count += 1
74
52
  parent.skip_timestamp_update = true
75
53
  parent.save
54
+
55
+ true
76
56
  end
77
57
 
78
58
  render :body, :with => :render_comment
@@ -100,12 +80,43 @@ module CortexReaver
100
80
  end
101
81
  end
102
82
 
83
+ def to_s
84
+ title || 'comment ' + id.to_s
85
+ end
86
+
103
87
  def url
104
88
  root_parent.url + '#comment_' + id.to_s
105
89
  end
106
90
 
107
- def to_s
108
- title || 'comment ' + id.to_s
91
+ def validate
92
+ validates_presence :body
93
+ validates_max_length 255, :title
94
+ validates_max_length 255, :name
95
+ validates_max_length 255, :http
96
+ validates_max_length 255, :email
97
+ validates_format(/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/, :email)
98
+
99
+ # Ensure comments with an email specified do *not* conflict with another
100
+ # user.
101
+ if (not email.blank?) and User.filter(:email => value).count > 0
102
+ self.errors[:email] << 'conflicts with a registered user'
103
+ end
104
+
105
+ # Ensures comments belong to exactly one parent.
106
+ count = 0
107
+ [:page_id, :project_id, :journal_id, :comment_id, :photograph_id].each do |field|
108
+ unless self[field].blank?
109
+ count += 1
110
+ if count > 1
111
+ self.errors[attribute] << 'has too many kinds of parents'
112
+ break
113
+ end
114
+ end
115
+ end
116
+
117
+ if count == 0
118
+ self.errors[attribute] << "doesn't have a parent"
119
+ end
109
120
  end
110
121
  end
111
122
  end
@@ -1,28 +1,26 @@
1
1
  module CortexReaver
2
2
  class Journal < Sequel::Model(:journals)
3
- include CortexReaver::Model::Timestamps
4
- include CortexReaver::Model::CachedRendering
3
+ plugin :timestamps
4
+ plugin :cached_rendering
5
+ plugin :canonical
6
+ plugin :attachments
7
+ plugin :comments
8
+ plugin :tags
9
+ plugin :sequenceable
10
+ plugin :viewable
5
11
  include CortexReaver::Model::Renderer
6
- include CortexReaver::Model::Canonical
7
- include CortexReaver::Model::Attachments
8
- include CortexReaver::Model::Comments
9
- include CortexReaver::Model::Tags
10
- include CortexReaver::Model::Sequenceable
11
12
 
12
13
  many_to_many :tags, :class => 'CortexReaver::Tag'
13
- belongs_to :creator, :class => 'CortexReaver::User', :key => 'created_by'
14
- belongs_to :updater, :class => 'CortexReaver::User', :key => 'updated_by'
15
- has_many :comments, :class => 'CortexReaver::Comment'
16
-
17
- validates do
18
- uniqueness_of :name
19
- presence_of :name
20
- length_of :name, :maximum => 255
21
- presence_of :title
22
- end
14
+ many_to_one :creator, :class => 'CortexReaver::User', :key => 'created_by'
15
+ many_to_one :updater, :class => 'CortexReaver::User', :key => 'updated_by'
16
+ one_to_many :comments, :class => 'CortexReaver::Comment'
23
17
 
24
18
  render :body
25
19
 
20
+ def self.atom_url
21
+ '/journals/atom'
22
+ end
23
+
26
24
  def self.get(id)
27
25
  self[:name => id] || self[id]
28
26
  end
@@ -35,10 +33,6 @@ module CortexReaver
35
33
  '/journals'
36
34
  end
37
35
 
38
- def self.atom_url
39
- '/journals/atom'
40
- end
41
-
42
36
  def atom_url
43
37
  '/journals/atom/' + name
44
38
  end
@@ -50,5 +44,13 @@ module CortexReaver
50
44
  def to_s
51
45
  title || name
52
46
  end
47
+
48
+ def validate
49
+ validates_unique :name
50
+ validates_presence :name
51
+ validates_max_length 255, :name
52
+ validates_presence :title
53
+ end
54
+
53
55
  end
54
56
  end
@@ -0,0 +1,9 @@
1
+ module Sequel
2
+ class Model
3
+ plugin :validation_helpers
4
+ plugin :cortex_reaver_validation_helpers
5
+ end
6
+ end
7
+
8
+ # Require models
9
+ Ramaze::acquire File.join(CortexReaver::LIB_DIR, 'model', '*')
@@ -1,50 +1,25 @@
1
1
  module CortexReaver
2
2
  class Page < Sequel::Model(:pages)
3
- include CortexReaver::Model::Timestamps
4
- include CortexReaver::Model::CachedRendering
3
+ plugin :timestamps
4
+ plugin :cached_rendering
5
+ plugin :canonical
6
+ plugin :attachments
7
+ plugin :comments
8
+ plugin :tags
9
+ plugin :sequenceable
10
+ plugin :viewable
5
11
  include CortexReaver::Model::Renderer
6
- include CortexReaver::Model::Canonical
7
- include CortexReaver::Model::Attachments
8
- include CortexReaver::Model::Comments
9
- include CortexReaver::Model::Tags
10
- include CortexReaver::Model::Sequenceable
11
12
 
12
- belongs_to :page, :class => 'CortexReaver::Page'
13
- has_many :pages, :class => 'CortexReaver::Page'
14
- belongs_to :creator, :class => 'CortexReaver::User', :key => 'created_by'
15
- belongs_to :updater, :class => 'CortexReaver::User', :key => 'updated_by'
16
- has_many :comments, :class => 'CortexReaver::Comment'
13
+ many_to_one :page, :class => 'CortexReaver::Page'
14
+ one_to_many :pages, :class => 'CortexReaver::Page'
15
+ many_to_one :creator, :class => 'CortexReaver::User', :key => 'created_by'
16
+ many_to_one :updater, :class => 'CortexReaver::User', :key => 'updated_by'
17
+ one_to_many :comments, :class => 'CortexReaver::Comment'
17
18
  many_to_many :tags, :class => 'CortexReaver::Tag'
18
19
 
19
20
  # Top-level pages.
20
21
  subset :top, :page_id => nil
21
22
 
22
- validates do
23
- uniqueness_of :name
24
- presence_of :name
25
- length_of :name, :maximum => 255
26
- presence_of :title
27
- length_of :title, :maximum => 255
28
-
29
- each(:name, :tag => :url_conflict) do |object, attributes, value|
30
- if controller = Ramaze::Controller.at(object.url)
31
- object.errors['name'] << "conflicts with the #{controller}"
32
- end
33
- end
34
- end
35
-
36
- # Reserve names of controllers so we don't conflict.
37
- Ramaze::Global.mapping.keys.each do |path|
38
- path =~ /\/(.+)(\/|$)/
39
- self.reserved_canonical_names << $1 if $1
40
- end
41
-
42
- # Also reserve everything in the public directory, as a courtesy.
43
- #
44
- # I can't stop you from shooting yourself in the foot, but this will help
45
- # you aim higher. :)
46
- self.reserved_canonical_names += Dir.entries(CortexReaver.config[:public_root]) - ['..', '.']
47
-
48
23
  # Use standard cached renderer
49
24
  render :body
50
25
 
@@ -88,7 +63,6 @@ module CortexReaver
88
63
 
89
64
  # Look up ids by nested names.
90
65
  ids.inject(nil) do |page, name|
91
- puts "Searching for #{name} in #{page.inspect}"
92
66
  parent_id = page ? page.id : nil
93
67
  self[:page_id => parent_id, :name => name]
94
68
  end
@@ -106,6 +80,10 @@ module CortexReaver
106
80
  '/pages/atom/' + id.to_s
107
81
  end
108
82
 
83
+ def to_s
84
+ title || name
85
+ end
86
+
109
87
  def url
110
88
  if page
111
89
  page.url + '/' + name
@@ -114,8 +92,12 @@ module CortexReaver
114
92
  end
115
93
  end
116
94
 
117
- def to_s
118
- title || name
95
+ def validate
96
+ validates_unique :name
97
+ validates_presence :name
98
+ validates_max_length 255, :name
99
+ validates_presence :title
100
+ validates_max_length 255, :title
119
101
  end
120
102
 
121
103
  # Returns true if this page is located underneath another page.
@@ -129,7 +111,7 @@ module CortexReaver
129
111
  end
130
112
 
131
113
  # Create a default page if none exists.
132
- if table_exists? and Page.count == 0
114
+ if dataset.table_exists? and Page.count == 0
133
115
  Page.new(
134
116
  :name => 'about',
135
117
  :title => 'About Cortex Reaver',
@@ -1,12 +1,12 @@
1
1
  module CortexReaver
2
2
  class Photograph < Sequel::Model(:photographs)
3
-
4
- include CortexReaver::Model::Timestamps
5
- include CortexReaver::Model::Canonical
6
- include CortexReaver::Model::Attachments
7
- include CortexReaver::Model::Comments
8
- include CortexReaver::Model::Tags
9
- include CortexReaver::Model::Sequenceable
3
+ plugin :timestamps
4
+ plugin :canonical
5
+ plugin :attachments
6
+ plugin :comments
7
+ plugin :tags
8
+ plugin :sequenceable
9
+ plugin :viewable
10
10
 
11
11
  # Target image sizes
12
12
  SIZES = {
@@ -18,16 +18,9 @@ module CortexReaver
18
18
  }
19
19
 
20
20
  many_to_many :tags, :class => 'CortexReaver::Tag'
21
- belongs_to :creator, :class => 'CortexReaver::User', :key => 'created_by'
22
- belongs_to :updater, :class => 'CortexReaver::User', :key => 'updated_by'
23
- has_many :comments, :class => 'CortexReaver::Comment'
24
-
25
- validates do
26
- uniqueness_of :name
27
- presence_of :name
28
- length_of :name, :maximum => 255
29
- presence_of :title
30
- end
21
+ many_to_one :creator, :class => 'CortexReaver::User', :key => 'created_by'
22
+ many_to_one :updater, :class => 'CortexReaver::User', :key => 'updated_by'
23
+ one_to_many :comments, :class => 'CortexReaver::Comment'
31
24
 
32
25
  def self.atom_url
33
26
  '/photographs/atom'
@@ -135,5 +128,12 @@ module CortexReaver
135
128
  def url
136
129
  '/photographs/show/' + name
137
130
  end
131
+
132
+ def validate
133
+ validates_unique :name
134
+ validates_presence :name
135
+ validates_max_length 255, :name
136
+ validates_presence :title
137
+ end
138
138
  end
139
139
  end
@@ -1,25 +1,20 @@
1
1
  module CortexReaver
2
2
  class Project < Sequel::Model(:projects)
3
- include CortexReaver::Model::Timestamps
4
- include CortexReaver::Model::CachedRendering
3
+ plugin :timestamps
4
+ plugin :cached_rendering
5
+ plugin :canonical
6
+ plugin :attachments
7
+ plugin :comments
8
+ plugin :tags
9
+ plugin :sequenceable
10
+ plugin :viewable
5
11
  include CortexReaver::Model::Renderer
6
- include CortexReaver::Model::Canonical
7
- include CortexReaver::Model::Attachments
8
- include CortexReaver::Model::Comments
9
- include CortexReaver::Model::Tags
10
- include CortexReaver::Model::Sequenceable
11
12
 
12
13
  many_to_many :tags, :class => 'CortexReaver::Tag'
13
- belongs_to :creator, :class => 'CortexReaver::User', :key => 'created_by'
14
- belongs_to :updater, :class => 'CortexReaver::User', :key => 'updated_by'
15
- has_many :comments, :class => 'CortexReaver::Comment'
14
+ many_to_one :creator, :class => 'CortexReaver::User', :key => 'created_by'
15
+ many_to_one :updater, :class => 'CortexReaver::User', :key => 'updated_by'
16
+ one_to_many :comments, :class => 'CortexReaver::Comment'
16
17
 
17
- validates do
18
- uniqueness_of :name
19
- presence_of :name
20
- length_of :name, :maximum => 255
21
- presence_of :title
22
- end
23
18
 
24
19
  render :body
25
20
 
@@ -43,12 +38,20 @@ module CortexReaver
43
38
  '/projects/atom/' + name
44
39
  end
45
40
 
41
+ def to_s
42
+ title || name
43
+ end
44
+
46
45
  def url
47
46
  '/projects/show/' + name
48
47
  end
49
48
 
50
- def to_s
51
- title || name
49
+ def validate
50
+ validates_unique :name
51
+ validates_presence :name
52
+ validates_max_length 255, :name
53
+ validates_presence :title
52
54
  end
55
+
53
56
  end
54
57
  end