formol 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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