formol 0.0.4

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 (226) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +147 -0
  3. data/Rakefile +29 -0
  4. data/app/assets/images/formol/read.png +0 -0
  5. data/app/assets/images/formol/unread.png +0 -0
  6. data/app/assets/javascripts/formol/admin/categories.js.coffee +55 -0
  7. data/app/assets/javascripts/formol/admin/forums.js +2 -0
  8. data/app/assets/javascripts/formol/application.js +9 -0
  9. data/app/assets/javascripts/formol/categories.js +2 -0
  10. data/app/assets/javascripts/formol/forums.js +2 -0
  11. data/app/assets/javascripts/formol/poll_votes.js +2 -0
  12. data/app/assets/javascripts/formol/posts.js.coffee +9 -0
  13. data/app/assets/javascripts/formol/preferences.js +2 -0
  14. data/app/assets/javascripts/formol/subscriptions.js.coffee +13 -0
  15. data/app/assets/javascripts/formol/topics.js.coffee +54 -0
  16. data/app/assets/javascripts/lib/jquery.prevent_double_submit.js.coffee +11 -0
  17. data/app/assets/javascripts/markitup/jquery.markitup.js +593 -0
  18. data/app/assets/javascripts/markitup/sets/markdown/set.js +53 -0
  19. data/app/assets/stylesheets/form_struct.css.scss +39 -0
  20. data/app/assets/stylesheets/formol/admin/categories.css.scss +30 -0
  21. data/app/assets/stylesheets/formol/admin/forums.css +4 -0
  22. data/app/assets/stylesheets/formol/categories.css.scss +3 -0
  23. data/app/assets/stylesheets/formol/development.css +4 -0
  24. data/app/assets/stylesheets/formol/forums.css.scss +3 -0
  25. data/app/assets/stylesheets/formol/mixins/after_clear.css.scss +7 -0
  26. data/app/assets/stylesheets/formol/partials/breadcrumb.css.scss +9 -0
  27. data/app/assets/stylesheets/formol/partials/categories/list.css.scss +101 -0
  28. data/app/assets/stylesheets/formol/partials/formol_lists.css.scss +6 -0
  29. data/app/assets/stylesheets/formol/partials/forums/list.css.scss +97 -0
  30. data/app/assets/stylesheets/formol/partials/polls/poll.css.scss +9 -0
  31. data/app/assets/stylesheets/formol/partials/posts/post.css.scss +116 -0
  32. data/app/assets/stylesheets/formol/posts.css.scss +8 -0
  33. data/app/assets/stylesheets/formol/topics.css.scss +42 -0
  34. data/app/assets/stylesheets/markitup/sets/markdown/images/block_code.png +0 -0
  35. data/app/assets/stylesheets/markitup/sets/markdown/images/bold.png +0 -0
  36. data/app/assets/stylesheets/markitup/sets/markdown/images/code.png +0 -0
  37. data/app/assets/stylesheets/markitup/sets/markdown/images/h1.png +0 -0
  38. data/app/assets/stylesheets/markitup/sets/markdown/images/h2.png +0 -0
  39. data/app/assets/stylesheets/markitup/sets/markdown/images/h3.png +0 -0
  40. data/app/assets/stylesheets/markitup/sets/markdown/images/h4.png +0 -0
  41. data/app/assets/stylesheets/markitup/sets/markdown/images/h5.png +0 -0
  42. data/app/assets/stylesheets/markitup/sets/markdown/images/h6.png +0 -0
  43. data/app/assets/stylesheets/markitup/sets/markdown/images/italic.png +0 -0
  44. data/app/assets/stylesheets/markitup/sets/markdown/images/link.png +0 -0
  45. data/app/assets/stylesheets/markitup/sets/markdown/images/list-bullet.png +0 -0
  46. data/app/assets/stylesheets/markitup/sets/markdown/images/list-numeric.png +0 -0
  47. data/app/assets/stylesheets/markitup/sets/markdown/images/picture.png +0 -0
  48. data/app/assets/stylesheets/markitup/sets/markdown/images/preview.png +0 -0
  49. data/app/assets/stylesheets/markitup/sets/markdown/images/quotes.png +0 -0
  50. data/app/assets/stylesheets/markitup/sets/markdown/style.css +57 -0
  51. data/app/assets/stylesheets/markitup/skins/markitup/images/bg-container.png +0 -0
  52. data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-bbcode.png +0 -0
  53. data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-dotclear.png +0 -0
  54. data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-html.png +0 -0
  55. data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-json.png +0 -0
  56. data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-markdown.png +0 -0
  57. data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-textile.png +0 -0
  58. data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-wiki.png +0 -0
  59. data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-xml.png +0 -0
  60. data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor.png +0 -0
  61. data/app/assets/stylesheets/markitup/skins/markitup/images/handle.png +0 -0
  62. data/app/assets/stylesheets/markitup/skins/markitup/images/menu.png +0 -0
  63. data/app/assets/stylesheets/markitup/skins/markitup/images/submenu.png +0 -0
  64. data/app/assets/stylesheets/markitup/skins/markitup/style.css +147 -0
  65. data/app/assets/stylesheets/markitup/skins/simple/images/handle.png +0 -0
  66. data/app/assets/stylesheets/markitup/skins/simple/images/menu.png +0 -0
  67. data/app/assets/stylesheets/markitup/skins/simple/images/submenu.png +0 -0
  68. data/app/assets/stylesheets/markitup/skins/simple/style.css +118 -0
  69. data/app/assets/stylesheets/pygments/autumn.css +58 -0
  70. data/app/assets/stylesheets/pygments/borland.css +46 -0
  71. data/app/assets/stylesheets/pygments/bw.css +34 -0
  72. data/app/assets/stylesheets/pygments/colorful.css +61 -0
  73. data/app/assets/stylesheets/pygments/default.css +62 -0
  74. data/app/assets/stylesheets/pygments/emacs.css +61 -0
  75. data/app/assets/stylesheets/pygments/friendly.css +61 -0
  76. data/app/assets/stylesheets/pygments/fruity.css +70 -0
  77. data/app/assets/stylesheets/pygments/manni.css +61 -0
  78. data/app/assets/stylesheets/pygments/murphy.css +61 -0
  79. data/app/assets/stylesheets/pygments/native.css +70 -0
  80. data/app/assets/stylesheets/pygments/pastie.css +60 -0
  81. data/app/assets/stylesheets/pygments/perldoc.css +58 -0
  82. data/app/assets/stylesheets/pygments/tango.css +69 -0
  83. data/app/assets/stylesheets/pygments/trac.css +59 -0
  84. data/app/assets/stylesheets/pygments/vim.css +70 -0
  85. data/app/assets/stylesheets/pygments/vs.css +33 -0
  86. data/app/controllers/formol/admin/admin_controller.rb +11 -0
  87. data/app/controllers/formol/admin/categories_controller.rb +60 -0
  88. data/app/controllers/formol/admin/forums_controller.rb +56 -0
  89. data/app/controllers/formol/application_controller.rb +47 -0
  90. data/app/controllers/formol/categories_controller.rb +21 -0
  91. data/app/controllers/formol/forums_controller.rb +19 -0
  92. data/app/controllers/formol/poll_votes_controller.rb +23 -0
  93. data/app/controllers/formol/posts_controller.rb +71 -0
  94. data/app/controllers/formol/preferences_controller.rb +32 -0
  95. data/app/controllers/formol/subscriptions_controller.rb +29 -0
  96. data/app/controllers/formol/topics_controller.rb +91 -0
  97. data/app/helpers/formol/admin/categories_helper.rb +4 -0
  98. data/app/helpers/formol/admin/forums_helper.rb +4 -0
  99. data/app/helpers/formol/application_helper.rb +35 -0
  100. data/app/helpers/formol/categories_helper.rb +15 -0
  101. data/app/helpers/formol/forums_helper.rb +19 -0
  102. data/app/helpers/formol/poll_votes_helper.rb +4 -0
  103. data/app/helpers/formol/posts_helper.rb +27 -0
  104. data/app/helpers/formol/preferences_helper.rb +4 -0
  105. data/app/helpers/formol/subscriptions_helper.rb +4 -0
  106. data/app/helpers/formol/topics_helper.rb +27 -0
  107. data/app/mailers/formol/subscription_mailer.rb +13 -0
  108. data/app/models/formol/category.rb +42 -0
  109. data/app/models/formol/forum.rb +77 -0
  110. data/app/models/formol/poll/option.rb +20 -0
  111. data/app/models/formol/poll/vote.rb +32 -0
  112. data/app/models/formol/poll.rb +107 -0
  113. data/app/models/formol/post.rb +162 -0
  114. data/app/models/formol/post_observer.rb +9 -0
  115. data/app/models/formol/topic/subscription.rb +16 -0
  116. data/app/models/formol/topic/track.rb +57 -0
  117. data/app/models/formol/topic.rb +185 -0
  118. data/app/models/formol/tracking.rb +45 -0
  119. data/app/models/formol/user_preference.rb +18 -0
  120. data/app/views/formol/admin/categories/_category.html.erb +9 -0
  121. data/app/views/formol/admin/categories/_form.html.erb +8 -0
  122. data/app/views/formol/admin/categories/edit.html.erb +3 -0
  123. data/app/views/formol/admin/categories/index.html.erb +3 -0
  124. data/app/views/formol/admin/categories/new.html.erb +3 -0
  125. data/app/views/formol/admin/forums/_form.html.erb +9 -0
  126. data/app/views/formol/admin/forums/_forum.html.erb +12 -0
  127. data/app/views/formol/admin/forums/edit.html.erb +3 -0
  128. data/app/views/formol/admin/forums/new.html.erb +3 -0
  129. data/app/views/formol/categories/_category.html.erb +5 -0
  130. data/app/views/formol/categories/index.html.erb +5 -0
  131. data/app/views/formol/categories/show.html.erb +3 -0
  132. data/app/views/formol/forums/_forum.html.erb +13 -0
  133. data/app/views/formol/forums/_list.html.erb +16 -0
  134. data/app/views/formol/forums/show.html.erb +18 -0
  135. data/app/views/formol/poll/options/_form.html.erb +1 -0
  136. data/app/views/formol/poll_votes/_form.html.erb +8 -0
  137. data/app/views/formol/polls/_form.html.erb +14 -0
  138. data/app/views/formol/polls/_poll.html.erb +24 -0
  139. data/app/views/formol/posts/_form.html.erb +7 -0
  140. data/app/views/formol/posts/_last_post.html.erb +9 -0
  141. data/app/views/formol/posts/_list.html.erb +3 -0
  142. data/app/views/formol/posts/_post.html.erb +47 -0
  143. data/app/views/formol/posts/edit.html.erb +10 -0
  144. data/app/views/formol/posts/new.html.erb +14 -0
  145. data/app/views/formol/preferences/show.html.erb +11 -0
  146. data/app/views/formol/subscription_mailer/topic_reply.en.html.erb +8 -0
  147. data/app/views/formol/subscription_mailer/topic_reply.fr.html.erb +8 -0
  148. data/app/views/formol/topics/_form.html.erb +20 -0
  149. data/app/views/formol/topics/_list.html.erb +16 -0
  150. data/app/views/formol/topics/_topic.html.erb +13 -0
  151. data/app/views/formol/topics/edit.html.erb +5 -0
  152. data/app/views/formol/topics/new.html.erb +5 -0
  153. data/app/views/formol/topics/show.html.erb +25 -0
  154. data/app/views/layouts/formol/mail.html.erb +9 -0
  155. data/config/locales/en.yml +3 -0
  156. data/config/locales/formol/views/forums/en.yml +13 -0
  157. data/config/locales/formol/views/forums/fr.yml +13 -0
  158. data/config/locales/formol/views/poll_votes/en.yml +5 -0
  159. data/config/locales/formol/views/polls/en.yml.yml +5 -0
  160. data/config/locales/formol/views/posts/en.yml +23 -0
  161. data/config/locales/formol/views/posts/fr.yml +20 -0
  162. data/config/locales/formol/views/topics/en.yml +23 -0
  163. data/config/locales/formol/views/topics/fr.yml +20 -0
  164. data/config/routes.rb +31 -0
  165. data/db/migrate/20111221101158_create_formol_categories.rb +7 -0
  166. data/db/migrate/20111221111417_create_formol_forums.rb +10 -0
  167. data/db/migrate/20111221121010_create_formol_topics.rb +9 -0
  168. data/db/migrate/20111221123515_create_formol_posts.rb +9 -0
  169. data/db/migrate/20111221151653_add_index_on_tables.rb +15 -0
  170. data/db/migrate/20120103163438_add_user_to_models.rb +13 -0
  171. data/db/migrate/20120104132631_add_counter_cache_to_models.rb +12 -0
  172. data/db/migrate/20120104163741_add_pinned_to_topics.rb +7 -0
  173. data/db/migrate/20120105133522_add_position_to_categories.rb +7 -0
  174. data/db/migrate/20120105190708_add_position_to_forums.rb +7 -0
  175. data/db/migrate/20120105212559_add_lock_to_topics.rb +7 -0
  176. data/db/migrate/20120106130944_add_first_post_and_last_post_to_topics.rb +8 -0
  177. data/db/migrate/20120106192951_change_forum_description_to_string.rb +9 -0
  178. data/db/migrate/20120107012517_add_last_post_to_forum.rb +7 -0
  179. data/db/migrate/20120107122921_add_missing_indexes.rb +12 -0
  180. data/db/migrate/20120107123654_add_default_on_forum_counters.rb +10 -0
  181. data/db/migrate/20120108114030_add_views_to_topics.rb +7 -0
  182. data/db/migrate/20120108131533_create_formol_topic_tracks.rb +13 -0
  183. data/db/migrate/20120109115141_create_formol_topic_subscriptions.rb +10 -0
  184. data/db/migrate/20120109220633_create_formol_user_preferences.rb +11 -0
  185. data/db/migrate/20120109223624_add_display_signature_to_posts.rb +7 -0
  186. data/db/migrate/20120109233054_add_display_signatures_and_avatars_to_user_preferences.rb +8 -0
  187. data/db/migrate/20120110152548_create_formol_polls.rb +14 -0
  188. data/db/migrate/20120110152618_create_formol_poll_options.rb +11 -0
  189. data/db/migrate/20120110152632_create_formol_poll_votes.rb +12 -0
  190. data/lib/formol/config.rb +12 -0
  191. data/lib/formol/controllers/auth.rb +9 -0
  192. data/lib/formol/controllers/nested/has_parent_category.rb +11 -0
  193. data/lib/formol/controllers/nested/has_parent_forum.rb +11 -0
  194. data/lib/formol/controllers/nested/has_parent_topic.rb +11 -0
  195. data/lib/formol/controllers.rb +5 -0
  196. data/lib/formol/engine.rb +18 -0
  197. data/lib/formol/formatters/redcarpet/formatter.rb +36 -0
  198. data/lib/formol/formatters/redcarpet/syntax_highlighter.rb +23 -0
  199. data/lib/formol/formatters.rb +2 -0
  200. data/lib/formol/generators/install/install_generator.rb +94 -0
  201. data/lib/formol/generators/install/templates/config/formol.yml +29 -0
  202. data/lib/formol/generators/install/templates/initializer/formol.rb.erb +21 -0
  203. data/lib/formol/generators/install/templates/lib/permissions/special_rights.rb +24 -0
  204. data/lib/formol/generators/install/templates/migrations/add_formol_profile_to_users.rb.erb +7 -0
  205. data/lib/formol/generators/install/templates/migrations/add_posts_count_to_user.rb.erb +7 -0
  206. data/lib/formol/generators.rb +1 -0
  207. data/lib/formol/integration/user.rb +76 -0
  208. data/lib/formol/integration.rb +1 -0
  209. data/lib/formol/permissions/controllers.rb +30 -0
  210. data/lib/formol/permissions/manager.rb +29 -0
  211. data/lib/formol/permissions/profile.rb +24 -0
  212. data/lib/formol/permissions/profiles.rb +44 -0
  213. data/lib/formol/permissions/user.rb +29 -0
  214. data/lib/formol/permissions.rb +5 -0
  215. data/lib/formol/rails/engine.rb +81 -0
  216. data/lib/formol/rails.rb +1 -0
  217. data/lib/formol/version.rb +10 -0
  218. data/lib/formol/view_helpers/assets_helper.rb +11 -0
  219. data/lib/formol/view_helpers/format_helper.rb +12 -0
  220. data/lib/formol/view_helpers.rb +2 -0
  221. data/lib/formol/will_paginate/list_link_renderer.rb +29 -0
  222. data/lib/formol/will_paginate.rb +1 -0
  223. data/lib/formol.rb +61 -0
  224. data/lib/formol_.rb +13 -0
  225. data/lib/tasks/formol_tasks.rake +0 -0
  226. metadata +348 -0
@@ -0,0 +1,76 @@
1
+ module Formol
2
+ module Integration
3
+ module User
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ #Modules
8
+ include Formol::Permissions::User
9
+
10
+ #Associations
11
+ has_many :topics, :class_name => 'Formol::Topic'
12
+ has_many :posts, :class_name => 'Formol::Post'
13
+ has_many :subscriptions, :class_name => 'Formol::Topic::Subscription',
14
+ :foreign_key => 'subscriber_id',
15
+ :dependent => :destroy
16
+ has_many :subscribed_topics, :through => :subscriptions,
17
+ :source => :topic,
18
+ :class_name => 'Formol::Topic'
19
+ has_one :preference, :class_name => 'Formol::UserPreference'
20
+
21
+ #Aliasing
22
+ alias_method_chain :preference, :auto_allocate
23
+
24
+ #Privacy
25
+ private :subscribed_topic_ids
26
+ private :unread_forums
27
+ private :unread_topics
28
+ end
29
+
30
+ module InstanceMethods
31
+ # always return a preference object to avoid nil
32
+ # preference has all values defaulted for fallback behavior
33
+ def preference_with_auto_allocate
34
+ p = preference_without_auto_allocate
35
+
36
+ if p.nil?
37
+ p = build_preference
38
+ p.save
39
+ end
40
+
41
+ p
42
+ end
43
+
44
+ def has_read_topic?(topic)
45
+ !unread_topics(topic.forum_id).include?(topic.id)
46
+ end
47
+
48
+ def has_read_forum?(forum)
49
+ !unread_forums.include?(forum.id)
50
+ end
51
+
52
+ def has_subscribed_to?(topic)
53
+ subscribed_topic_ids.include?(topic.id)
54
+ end
55
+
56
+ private
57
+
58
+ def subscribed_topic_ids
59
+ # we can load all subscribed topics instead of acting 'by forum'
60
+ # a user won't have 1 billion of subscriptions and we just collect ids
61
+ @subscribed_topic_ids ||= subscribed_topics.select('formol_topics.id').collect(&:id)
62
+ end
63
+
64
+ def unread_forums
65
+ @read_forum_ids ||= Formol::Forum.unread(self).collect(&:id)
66
+ end
67
+
68
+ def unread_topics(forum_id)
69
+ @unread_topic_ids ||= {}
70
+
71
+ @unread_topic_ids[forum_id] ||= Formol::Topic.unread(self, :forum_id => forum_id).collect(&:id)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1 @@
1
+ require 'formol/integration/user'
@@ -0,0 +1,30 @@
1
+ module Formol
2
+ module Permissions
3
+ class NotAuthorizedError < Exception; end
4
+
5
+ module Controllers
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ helper_method :formol_authorized?
10
+ end
11
+
12
+ module InstanceMethods
13
+ def formol_authorized?(user, rights, obj = nil)
14
+ user = Formol.config.user.new(:formol_profile => :default) if user.nil?
15
+
16
+ rights = [rights]
17
+ rights.flatten!
18
+
19
+ rights.any?{ |r| user.formol_allowed_to?(r, obj) }
20
+ end
21
+
22
+ def formol_authorize!(user, rights, obj = nil)
23
+ unless formol_authorized?(user, rights, obj)
24
+ raise Formol::Permissions::NotAuthorizedError.new
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ module Formol
2
+ module Permissions
3
+ class Manager
4
+ attr_accessor :user
5
+ cattr_accessor :profiles
6
+
7
+ def initialize(user)
8
+ self.user = user
9
+ @profile_name = (user && user.persisted? ? user.formol_profile : :default).to_sym
10
+ end
11
+
12
+ def able_to?(right, obj = nil)
13
+ return true if has_right?(:administrate)
14
+
15
+ respond_to?(m = :"able_to_#{right}?") ? send(m, obj) : has_right?(right)
16
+ end
17
+
18
+ protected
19
+
20
+ def profile
21
+ self.class.profiles[@profile_name]
22
+ end
23
+
24
+ def has_right?(right)
25
+ profile.has_right?(right.to_sym)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ module Formol
2
+ module Permissions
3
+ class Profile
4
+ attr_reader :rights
5
+
6
+ def initialize(name, rights = [])
7
+ @name = name.to_sym
8
+ @rights = rights.collect(&:to_sym)
9
+ end
10
+
11
+ def has_right?(right)
12
+ @rights.include?(right.to_sym)
13
+ end
14
+
15
+ def <<(right)
16
+ @rights << right.to_sym
17
+ end
18
+
19
+ def delete(right)
20
+ @rights.delete(right.to_sym)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,44 @@
1
+ module Formol
2
+ module Permissions
3
+ class Profiles
4
+ def initialize
5
+ @profiles = {}
6
+ end
7
+
8
+ def self.from_hash(hash)
9
+ p = Profiles.new
10
+
11
+ hash.each do |name, opts|
12
+ p.add_profile(name, opts)
13
+ end
14
+
15
+ p
16
+ end
17
+
18
+ def add_right_to_profile(name, right)
19
+ @profiles[name.to_sym] << right.to_sym
20
+ end
21
+
22
+ def delete_right_from_profile(name, right)
23
+ @profiles[name.to_sym].delete(right)
24
+ end
25
+
26
+ def profiles
27
+ @profiles.keys
28
+ end
29
+
30
+ def add_profile(name, opts = {})
31
+ r = []
32
+
33
+ r += self[opts[:extends]].rights if opts[:extends]
34
+ r += opts[:rights] if opts[:rights]
35
+
36
+ @profiles[name.to_sym] = Profile.new(name, r.uniq)
37
+ end
38
+
39
+ def [](name)
40
+ @profiles[name.to_sym]
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,29 @@
1
+ module Formol
2
+ module Permissions
3
+ module User
4
+ extend ActiveSupport::Concern
5
+
6
+ PROFILES = Proc.new{ Formol::Permissions::Manager.profiles.profiles }
7
+
8
+ included do
9
+ #Security
10
+ attr_accessible :formol_profile
11
+
12
+ #Default values
13
+ default_value_for :formol_profile, :registered
14
+
15
+ #Validations
16
+ validates :formol_profile, :presence => true,
17
+ :inclusion => { :in => PROFILES,
18
+ :allow_blank => true }
19
+ end
20
+
21
+ module InstanceMethods
22
+ def formol_allowed_to?(right, obj = nil)
23
+ @allower ||= Formol::Permissions::Manager.new(self)
24
+ @allower.able_to?(right, obj)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,5 @@
1
+ require "formol/permissions/profile"
2
+ require "formol/permissions/profiles"
3
+ require "formol/permissions/manager"
4
+ require "formol/permissions/controllers"
5
+ require "formol/permissions/user"
@@ -0,0 +1,81 @@
1
+ module Magic
2
+ module Rails
3
+ module Engine
4
+ ##
5
+ # Automatically append all of the current engine's routes to the main
6
+ # application's route set. This needs to be done for ALL functional tests that
7
+ # use engine routes, since the mounted routes don't work during tests.
8
+ #
9
+ # @param [Symbol] engine_symbol Optional; if provided, uses this symbol to
10
+ # locate the engine class by name, otherwise uses the module of the calling
11
+ # test case as the presumed name of the engine.
12
+ #
13
+ # @author Jason Hamilton (jhamilton@greatherorift.com)
14
+ # @author Matthew Ratzloff (matt@urbaninfluence.com)
15
+ def load_engine_routes(engine_symbol = nil)
16
+ if engine_symbol
17
+ engine_name = engine_symbol.to_s.camelize
18
+ #else
19
+ # No engine provided, so presume the current engine is the one to load
20
+ #engine_name = self.class.name.split("::").first.split("(").last
21
+ end
22
+ engine = ("#{engine_name}::Engine").constantize
23
+
24
+ # Append the routes for this module to the existing routes
25
+ ::Rails.application.routes.disable_clear_and_finalize = true
26
+ ::Rails.application.routes.clear!
27
+ ::Rails.application.routes_reloader.paths.each { |path| load(path) }
28
+ ::Rails.application.routes.draw do
29
+ resourced_routes = []
30
+
31
+ named_routes = engine.routes.named_routes.routes
32
+ unnamed_routes = engine.routes.routes - named_routes.values
33
+
34
+ engine.routes.routes.each do |route|
35
+ # Call the method by hand based on the symbol
36
+ path = "/#{engine_name.underscore}#{route.path}"
37
+ verb = route.verb.to_s.downcase.to_sym
38
+ requirements = route.requirements
39
+ if path_helper = named_routes.key(route)
40
+ requirements[:as] = path_helper
41
+ elsif route.requirements[:controller].present?
42
+ # Presume that all controllers referenced in routes should also be
43
+ # resources and append that routing on the end so that *_path helpers
44
+ # will still work
45
+ resourced_routes << route.requirements[:controller].gsub("#{engine_name.downcase}/", "").to_sym
46
+ end
47
+ send(verb, path, requirements) if respond_to?(verb)
48
+ end
49
+
50
+ def namespace!(sp_r, &block)
51
+ r = sp_r.shift
52
+
53
+ if sp_r.empty?
54
+ resources r.to_sym
55
+ else
56
+ namespace r.to_sym do
57
+ namespace!(sp_r)
58
+ end
59
+ end
60
+ end
61
+
62
+ # Add each route, once, to the end under a scope to trick path helpers.
63
+ # This will probably break as soon as there is route name overlap, but
64
+ # we'll cross that bridge when we get to it.
65
+ resourced_routes.uniq!
66
+ scope engine_name.downcase do
67
+ resourced_routes.each do |resource|
68
+ namespace!(resource.to_s.split('/'))
69
+ end
70
+ end
71
+ end
72
+
73
+ # Finalize the routes
74
+ ::Rails.application.routes.finalize!
75
+ ::Rails.application.routes.disable_clear_and_finalize = false
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ Rails::Engine.send(:include, Magic::Rails::Engine)
@@ -0,0 +1 @@
1
+ require 'formol/rails/engine'
@@ -0,0 +1,10 @@
1
+ module Formol
2
+ module VERSION
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 4
6
+ PRE = nil
7
+
8
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module Formol
2
+ module ViewHelpers
3
+ module AssetsHelper
4
+ def include_formol_javascripts
5
+ path = controller.controller_path
6
+
7
+ javascript_include_tag path if path.start_with?('formol')
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module Formol
2
+ module ViewHelpers
3
+ module FormatHelper
4
+ def formol_format(text)
5
+ formatter = Formol.config.formatter.new
6
+
7
+ # no need to sanitize or strip_tags, formatter has to handle it!
8
+ formatter.to_html(text)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,2 @@
1
+ require 'formol/view_helpers/assets_helper'
2
+ require 'formol/view_helpers/format_helper'
@@ -0,0 +1,29 @@
1
+ require 'will_paginate/view_helpers/action_view'
2
+
3
+ module Formol
4
+ module WillPaginate
5
+ class ListLinkRenderer < ::WillPaginate::ActionView::LinkRenderer
6
+ protected
7
+
8
+ def page_number(page)
9
+ unless page == current_page
10
+ tag(:li, link(page, page, :rel => rel_value(page)))
11
+ else
12
+ tag(:li, page, :class => "current")
13
+ end
14
+ end
15
+
16
+ def previous_or_next_page(page, text, classname)
17
+ if page
18
+ tag(:li, link(text, page), :class => classname)
19
+ else
20
+ tag(:li, text, :class => classname + ' disabled')
21
+ end
22
+ end
23
+
24
+ def html_container(html)
25
+ tag(:ul, html, container_attributes)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1 @@
1
+ require 'formol/will_paginate/list_link_renderer'
data/lib/formol.rb ADDED
@@ -0,0 +1,61 @@
1
+ #gems
2
+ require 'formol_'
3
+
4
+ module Formol
5
+ mattr_reader :config
6
+
7
+ class << self
8
+ def configure(&block)
9
+ @@config = Config.new
10
+
11
+ class_eval &block
12
+
13
+ load_config_from_file
14
+ set_formatter
15
+
16
+ load_formol_libs
17
+ end
18
+
19
+ private
20
+
21
+ # load formol libs located inside main app
22
+ def load_formol_libs
23
+ Dir[Rails.root.join('lib', 'formol', '**', '*.rb')].each do |f|
24
+ require f
25
+ end
26
+
27
+ Formol::Permissions::Manager.send(:include, Formol::Permissions::SpecialRights)
28
+ end
29
+
30
+ # set formatter
31
+ def set_formatter
32
+ config.formatter = Formol::Formatters::Redcarpet::Formatter
33
+ end
34
+
35
+ # load config.yml located inside main app
36
+ def load_config_from_file
37
+ file_path = Rails.root.join('config/formol.yml')
38
+
39
+ return unless File.exists?(file_path)
40
+
41
+ h = HashWithIndifferentAccess.new(YAML::load(File.open(file_path)))
42
+
43
+ return unless h[:formol]
44
+
45
+ h = h[:formol]
46
+
47
+ if h[:profiles]
48
+ profiles = Formol::Permissions::Profiles.from_hash(h[:profiles])
49
+ Formol::Permissions::Manager.profiles = profiles
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ require 'formol/engine'
56
+
57
+ ActionController::Base.send(:include, Formol::Controllers::Auth)
58
+ ActionController::Base.send(:include, Formol::Permissions::Controllers)
59
+
60
+ ActionView::Base.send(:include, Formol::ViewHelpers::FormatHelper)
61
+ ActionView::Base.send(:include, Formol::ViewHelpers::AssetsHelper)
data/lib/formol_.rb ADDED
@@ -0,0 +1,13 @@
1
+ #gems (needed when packaged as a gem)
2
+ require 'formtastic'
3
+ require 'attribute_normalizer'
4
+ require 'will_paginate'
5
+ require 'ranked-model'
6
+ require 'default_value_for'
7
+ require 'pygments.rb'
8
+ require 'redcarpet'
9
+
10
+ #libs
11
+ %w(config controllers formatters generators integration permissions rails view_helpers will_paginate).each do |lib|
12
+ require "formol/#{lib}"
13
+ end
File without changes