pages_core 3.4.3 → 3.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +81 -15
  3. data/Rakefile +1 -1
  4. data/app/assets/javascripts/pages/admin.es6.jsx +19 -0
  5. data/app/assets/javascripts/pages/admin/components.es6.jsx +1 -0
  6. data/app/assets/javascripts/pages/admin/components/page_tree.es6.jsx +330 -0
  7. data/app/assets/javascripts/pages/admin/components/page_tree_actions.es6.jsx +8 -0
  8. data/app/assets/javascripts/pages/admin/components/page_tree_node.es6.jsx +374 -0
  9. data/app/assets/javascripts/pages/admin/components/page_tree_store.es6.jsx +161 -0
  10. data/app/assets/javascripts/pages/admin/features/content_tabs.es6.jsx +63 -0
  11. data/app/assets/javascripts/pages/admin/features/edit_page.es6.jsx +141 -0
  12. data/app/assets/javascripts/pages/admin/features/editable_image.es6.jsx +145 -0
  13. data/app/assets/javascripts/pages/admin/features/modal.es6.jsx +90 -0
  14. data/app/assets/javascripts/pages/admin/features/page_images.es6.jsx +338 -0
  15. data/app/assets/javascripts/pages/admin/features/rich_text.es6.jsx +124 -0
  16. data/app/assets/javascripts/pages/admin/features/tag_editor.es6.jsx +160 -0
  17. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.es6.jsx +21 -0
  18. data/app/assets/javascripts/pages/admin/lib/center_on_screen.es6.jsx +22 -0
  19. data/app/assets/javascripts/pages/admin/lib/tree.es6.jsx +294 -0
  20. data/app/assets/javascripts/pages/login_form.es6.jsx +21 -0
  21. data/app/assets/stylesheets/pages/admin.scss +148 -0
  22. data/app/assets/stylesheets/pages/admin/components/buttons.scss +5 -0
  23. data/app/assets/stylesheets/pages/admin/{editable_image.css.erb → components/editable_image.scss} +7 -8
  24. data/app/assets/stylesheets/pages/admin/components/forms.scss +71 -0
  25. data/app/assets/stylesheets/pages/admin/components/header.scss +169 -0
  26. data/app/assets/stylesheets/pages/admin/{images.css.scss.erb → components/images.scss} +6 -11
  27. data/app/assets/stylesheets/pages/admin/components/layout.scss +44 -0
  28. data/app/assets/stylesheets/pages/admin/components/links.scss +43 -0
  29. data/app/assets/stylesheets/pages/admin/components/list_table.scss +58 -0
  30. data/app/assets/stylesheets/pages/admin/{login.css.scss.erb → components/login.scss} +1 -1
  31. data/app/assets/stylesheets/pages/admin/{modal.css.erb → components/modal.scss} +3 -2
  32. data/app/assets/stylesheets/pages/admin/components/page_tree.scss +173 -0
  33. data/app/assets/stylesheets/pages/admin/{pagination.css.scss → components/pagination.scss} +13 -4
  34. data/app/assets/stylesheets/pages/admin/components/sidebar.scss +25 -0
  35. data/app/assets/stylesheets/pages/admin/{tag_editor.css.scss.erb → components/tag_editor.scss} +6 -0
  36. data/app/assets/stylesheets/pages/admin/components/textarea.scss +76 -0
  37. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +196 -0
  38. data/app/assets/stylesheets/pages/admin/controllers/{users.css.erb → users.scss} +0 -0
  39. data/app/assets/stylesheets/pages/admin/mixins/breakpoints.scss +21 -0
  40. data/app/assets/stylesheets/pages/admin/mixins/clearfix.scss +7 -0
  41. data/app/assets/stylesheets/pages/admin/mixins/gradients.scss +7 -0
  42. data/app/assets/stylesheets/pages/admin/{print.css.erb → print.scss} +0 -0
  43. data/app/assets/stylesheets/pages/admin/vars.scss +8 -0
  44. data/app/controllers/admin/invites_controller.rb +10 -6
  45. data/app/controllers/admin/page_files_controller.rb +6 -8
  46. data/app/controllers/admin/page_images_controller.rb +14 -19
  47. data/app/controllers/admin/pages_controller.rb +44 -97
  48. data/app/controllers/admin/password_resets_controller.rb +7 -2
  49. data/app/controllers/concerns/pages_core/add_comments_controller.rb +67 -0
  50. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +58 -0
  51. data/app/controllers/concerns/pages_core/authentication.rb +1 -1
  52. data/app/controllers/concerns/pages_core/exception_handler.rb +44 -21
  53. data/app/controllers/concerns/pages_core/policies_helper.rb +10 -6
  54. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +43 -0
  55. data/app/controllers/concerns/pages_core/process_titler.rb +2 -2
  56. data/app/controllers/concerns/pages_core/rss_controller.rb +25 -0
  57. data/app/controllers/concerns/pages_core/search_pages_controller.rb +40 -0
  58. data/app/controllers/errors_controller.rb +14 -2
  59. data/app/controllers/pages_core/admin_controller.rb +7 -5
  60. data/app/controllers/pages_core/frontend/page_files_controller.rb +5 -7
  61. data/app/controllers/pages_core/frontend/pages_controller.rb +41 -219
  62. data/app/controllers/pages_core/frontend_controller.rb +8 -2
  63. data/app/controllers/pages_core/sitemaps_controller.rb +5 -4
  64. data/app/formatters/pages_core/html_formatter.rb +33 -23
  65. data/app/helpers/admin/menu_helper.rb +12 -9
  66. data/app/helpers/admin/pages_helper.rb +40 -28
  67. data/app/helpers/pages_core/admin/admin_helper.rb +58 -56
  68. data/app/helpers/pages_core/admin/labelled_field_helper.rb +6 -7
  69. data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
  70. data/app/helpers/pages_core/application_helper.rb +13 -26
  71. data/app/helpers/pages_core/form_builder.rb +71 -134
  72. data/app/helpers/pages_core/head_tags_helper.rb +26 -168
  73. data/app/helpers/pages_core/images_helper.rb +3 -3
  74. data/app/helpers/pages_core/meta_tags_helper.rb +96 -0
  75. data/app/helpers/pages_core/open_graph_tags_helper.rb +51 -0
  76. data/app/helpers/pages_core/page_path_helper.rb +40 -0
  77. data/app/mailers/admin_mailer.rb +14 -14
  78. data/app/models/autopublisher.rb +2 -2
  79. data/app/models/category.rb +8 -8
  80. data/app/models/concerns/pages_core/has_roles.rb +2 -2
  81. data/app/models/concerns/pages_core/humanizable_param.rb +5 -5
  82. data/app/models/concerns/pages_core/page_model/autopublishable.rb +25 -0
  83. data/app/models/concerns/pages_core/page_model/commentable.rb +29 -0
  84. data/app/models/concerns/pages_core/page_model/images.rb +50 -0
  85. data/app/models/concerns/pages_core/page_model/localizable.rb +29 -0
  86. data/app/models/concerns/pages_core/page_model/pathable.rb +115 -0
  87. data/app/models/concerns/pages_core/page_model/redirectable.rb +36 -0
  88. data/app/models/concerns/pages_core/page_model/searchable.rb +41 -0
  89. data/app/models/concerns/pages_core/page_model/sortable.rb +54 -0
  90. data/app/models/concerns/pages_core/page_model/status.rb +50 -0
  91. data/app/models/concerns/pages_core/page_model/templateable.rb +82 -0
  92. data/app/models/concerns/pages_core/page_model/tree.rb +108 -0
  93. data/app/models/page.rb +30 -212
  94. data/app/models/page_builder.rb +4 -6
  95. data/app/models/page_category.rb +7 -0
  96. data/app/models/page_comment.rb +1 -1
  97. data/app/models/page_file.rb +4 -6
  98. data/app/models/page_image.rb +6 -7
  99. data/app/models/page_path.rb +46 -0
  100. data/app/models/password_reset_token.rb +5 -5
  101. data/app/models/role.rb +1 -1
  102. data/app/models/tag.rb +14 -16
  103. data/app/models/tagging.rb +2 -1
  104. data/app/models/user.rb +6 -7
  105. data/app/policies/page_policy.rb +8 -4
  106. data/app/policies/user_policy.rb +1 -1
  107. data/app/serializers/page_tree_serializer.rb +15 -0
  108. data/app/views/admin/invites/new.html.erb +2 -1
  109. data/app/views/admin/invites/show.html.erb +3 -4
  110. data/app/views/admin/pages/_edit_comments.html.erb +22 -6
  111. data/app/views/admin/pages/_edit_content.html.erb +4 -2
  112. data/app/views/admin/pages/_edit_images.html.erb +86 -75
  113. data/app/views/admin/pages/_edit_metadata.html.erb +22 -0
  114. data/app/views/admin/pages/_edit_options.html.erb +23 -15
  115. data/app/views/admin/pages/_pagelisting.html.erb +6 -6
  116. data/app/views/admin/pages/edit.html.erb +11 -6
  117. data/app/views/admin/pages/index.html.erb +12 -53
  118. data/app/views/admin/pages/new.html.erb +3 -3
  119. data/app/views/admin/pages/news.html.erb +1 -1
  120. data/app/views/admin_mailer/invite.text.erb +1 -1
  121. data/app/views/admin_mailer/password_reset.text.erb +1 -1
  122. data/app/views/errors/422.html.erb +7 -0
  123. data/app/views/errors/500_critical.html.erb +1 -1
  124. data/app/views/layouts/admin.html.erb +36 -32
  125. data/app/views/layouts/admin/_header.html.erb +2 -2
  126. data/config/locales/en.yml +38 -1
  127. data/config/routes.rb +40 -23
  128. data/db/migrate/20111219033112_create_pages_tables.rb +25 -29
  129. data/db/migrate/20121010055412_drop_removed_tables.rb +3 -3
  130. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -13
  131. data/db/migrate/20140203183900_create_roles.rb +5 -2
  132. data/db/migrate/20140920231700_convert_images_to_dis.rb +4 -2
  133. data/db/migrate/20150401131300_localize_images.rb +7 -8
  134. data/db/migrate/20151002174800_create_page_paths.rb +10 -0
  135. data/db/migrate/20151021103400_drop_binaries_table.rb +7 -0
  136. data/db/migrate/20151204151000_remove_page_content_order.rb +5 -0
  137. data/db/migrate/20160330220900_rename_pages_categories.rb +6 -0
  138. data/db/migrate/20160405202700_change_localization_limit.rb +9 -0
  139. data/lib/pages_core.rb +22 -27
  140. data/lib/pages_core/admin_menu_item.rb +16 -3
  141. data/lib/pages_core/archive_finder.rb +40 -13
  142. data/lib/pages_core/cache_sweeper.rb +72 -45
  143. data/lib/pages_core/configuration.rb +2 -2
  144. data/lib/pages_core/configuration/base.rb +4 -8
  145. data/lib/pages_core/configuration/pages.rb +6 -3
  146. data/lib/pages_core/engine.rb +23 -1
  147. data/lib/pages_core/extensions.rb +2 -2
  148. data/lib/pages_core/file_embedder.rb +40 -0
  149. data/lib/pages_core/page_path_constraint.rb +23 -0
  150. data/lib/pages_core/pages_plugin.rb +11 -0
  151. data/lib/pages_core/paginates.rb +3 -3
  152. data/lib/pages_core/plugin.rb +14 -8
  153. data/lib/pages_core/templates.rb +6 -6
  154. data/lib/pages_core/templates/block_configuration.rb +1 -1
  155. data/lib/pages_core/templates/configuration.rb +23 -24
  156. data/lib/pages_core/templates/configuration_handler.rb +1 -1
  157. data/lib/pages_core/templates/configuration_proxy.rb +7 -11
  158. data/lib/pages_core/templates/template_configuration.rb +55 -61
  159. data/lib/pages_core/version.rb +1 -1
  160. data/lib/rails/generators/pages_core/install/install_generator.rb +22 -48
  161. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +1 -1
  162. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +6 -3
  163. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +4 -1
  164. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +1 -1
  165. data/lib/tasks/pages.rake +4 -4
  166. data/lib/tasks/pages/page_paths.rake +12 -0
  167. data/template.rb +2 -2
  168. data/vendor/assets/javascripts/reflux.min.js +1 -0
  169. metadata +173 -85
  170. data/app/assets/images/pages/admin/description-bg.gif +0 -0
  171. data/app/assets/images/pages/admin/drag-handle.gif +0 -0
  172. data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
  173. data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
  174. data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
  175. data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
  176. data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
  177. data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
  178. data/app/assets/javascripts/pages/admin.js.coffee +0 -54
  179. data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +0 -4
  180. data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +0 -139
  181. data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +0 -9
  182. data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +0 -47
  183. data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +0 -122
  184. data/app/assets/javascripts/pages/admin/features/modal.js.coffee +0 -66
  185. data/app/assets/javascripts/pages/admin/features/page_images.js +0 -329
  186. data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +0 -40
  187. data/app/assets/javascripts/pages/admin/features/tag_editor.js +0 -159
  188. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +0 -17
  189. data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +0 -21
  190. data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +0 -57
  191. data/app/assets/javascripts/pages/login_form.js.coffee +0 -17
  192. data/app/assets/stylesheets/pages/admin.css.erb +0 -404
  193. data/app/assets/stylesheets/pages/admin/buttons.css.erb +0 -5
  194. data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +0 -94
  195. data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +0 -58
  196. data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +0 -178
  197. data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +0 -73
  198. data/app/assets/stylesheets/pages/admin/header.css.erb +0 -129
  199. data/app/assets/stylesheets/pages/admin/links.css.erb +0 -34
  200. data/app/assets/stylesheets/pages/admin/list_table.css.erb +0 -56
  201. data/app/assets/stylesheets/pages/admin/sidebar.css.erb +0 -39
  202. data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +0 -18
  203. data/app/assets/stylesheets/pages/admin/textarea.css.erb +0 -55
  204. data/app/models/concerns/pages_core/page_tree.rb +0 -85
  205. data/app/models/concerns/pages_core/searchable_page.rb +0 -33
  206. data/app/models/concerns/pages_core/templateable.rb +0 -85
  207. data/app/models/localization.rb +0 -27
  208. data/db/migrate/20140515130100_remove_sphinx_deltas.rb +0 -15
  209. data/lib/pages_core/localizable.rb +0 -49
  210. data/lib/pages_core/localizable/active_record_extension.rb +0 -41
  211. data/lib/pages_core/localizable/class_methods.rb +0 -51
  212. data/lib/pages_core/localizable/configuration.rb +0 -50
  213. data/lib/pages_core/localizable/instance_methods.rb +0 -130
  214. data/lib/pages_core/localizable/localizer.rb +0 -72
  215. data/lib/pages_core/localizable/scope_extension.rb +0 -22
@@ -6,17 +6,30 @@ module PagesCore
6
6
 
7
7
  class << self
8
8
  def items
9
- @items ||= []
9
+ return [] unless @menu_items
10
+ @menu_items.map { |_, v| v }
10
11
  end
11
12
 
12
13
  def register(label, path, group = :custom, options = {})
13
14
  entry = new(label, path, group, options)
14
- items << entry unless items.include?(entry)
15
+ @menu_items ||= {}
16
+ @menu_items[[group, label]] = entry
15
17
  end
16
18
  end
17
19
 
18
20
  def initialize(label, path, group = :custom, options = {})
19
- @label, @path, @group, @options = label, path, group, options
21
+ @label = label
22
+ @path = path
23
+ @group = group
24
+ @options = options
25
+ end
26
+
27
+ def ==(other)
28
+ other &&
29
+ other.label == label &&
30
+ other.path == path &&
31
+ other.group == group &&
32
+ other.options == options
20
33
  end
21
34
  end
22
35
  end
@@ -3,7 +3,8 @@
3
3
  module PagesCore
4
4
  class ArchiveFinder
5
5
  def initialize(relation, options = {})
6
- @relation, @options = relation, options
6
+ @relation = relation
7
+ @options = options
7
8
  end
8
9
 
9
10
  def by_year(year)
@@ -24,17 +25,14 @@ module PagesCore
24
25
  end
25
26
 
26
27
  def months_in_year(year)
27
- by_year(year)
28
- .reorder("#{timestamp_attribute} ASC")
29
- .group("MONTH(#{timestamp_attribute})")
30
- .map { |record| record[timestamp_attribute].month }
28
+ select_months(by_year(year)).map(&:to_i).sort
31
29
  end
32
30
 
33
31
  def months_in_year_with_count(year)
34
- by_year(year)
35
- .group("MONTH(#{timestamp_attribute})")
32
+ group_by_month(by_year(year))
36
33
  .count
37
34
  .to_a
35
+ .sort { |a, b| a.first <=> b.first }
38
36
  end
39
37
 
40
38
  def timestamp_attribute
@@ -42,14 +40,15 @@ module PagesCore
42
40
  end
43
41
 
44
42
  def years
45
- @relation
46
- .reorder("#{timestamp_attribute} ASC")
47
- .group("YEAR(#{timestamp_attribute})")
48
- .map { |record| record[timestamp_attribute].year }
43
+ select_years(@relation).map(&:to_i).sort
49
44
  end
50
45
 
51
46
  private
52
47
 
48
+ def group_by_month(relation)
49
+ relation.reorder("").group(month_part)
50
+ end
51
+
53
52
  def filter_by_time(range)
54
53
  @relation.where(
55
54
  "#{timestamp_attribute} >= ? AND #{timestamp_attribute} <= ?",
@@ -58,18 +57,46 @@ module PagesCore
58
57
  )
59
58
  end
60
59
 
60
+ def month_part
61
+ if mysql?
62
+ "MONTH(#{timestamp_attribute})"
63
+ else
64
+ "date_part('month', #{timestamp_attribute})"
65
+ end
66
+ end
67
+
68
+ def mysql?
69
+ ActiveRecord::Base.connection.adapter_name.downcase.starts_with?("mysql")
70
+ end
71
+
61
72
  def range_for_year(year)
62
- date_time = DateTime.new(year.to_i, 1, 1)
73
+ date_time = DateTime.new(year.to_i, 1, 1).utc
63
74
  date_time..date_time.end_of_year
64
75
  end
65
76
 
66
77
  def range_for_year_and_month(year, month)
67
- date_time = DateTime.new(year.to_i, month.to_i, 1)
78
+ date_time = DateTime.new(year.to_i, month.to_i, 1).utc
68
79
  date_time..date_time.end_of_month
69
80
  end
70
81
 
82
+ def select_months(relation)
83
+ relation.reorder("").pluck("DISTINCT #{month_part}")
84
+ end
85
+
86
+ def select_years(relation)
87
+ relation.reorder("").pluck("DISTINCT #{year_part}")
88
+ end
89
+
71
90
  def ordered_relation
72
91
  @relation.reorder("#{timestamp_attribute} DESC")
73
92
  end
93
+
94
+ def year_part
95
+ if mysql?
96
+ "YEAR(#{timestamp_attribute})"
97
+ else
98
+ "date_part('year', #{timestamp_attribute})"
99
+ end
100
+ end
74
101
  end
75
102
  end
@@ -17,20 +17,6 @@ module PagesCore
17
17
  PagesCore::SweepCacheJob.perform_later
18
18
  end
19
19
 
20
- # Returns the default configuration.
21
- def default_config
22
- OpenStruct.new(
23
- cache_path: ActionController::Base.page_cache_directory,
24
- observe: [Page, PageComment, Image],
25
- patterns: [
26
- /^\/index\.[\w]+$/,
27
- /^\/sitemap\.[\w]+$/,
28
- %r{^/pages/[\w]{2,3}[/\.](.*)$},
29
- %r{^/[\w]{2,3}/(.*)$}
30
- ]
31
- )
32
- end
33
-
34
20
  # Returns the configuration. Accepts a block, ie:
35
21
  #
36
22
  # PagesCore::CacheSweeper.config do |c|
@@ -46,27 +32,16 @@ module PagesCore
46
32
  @configuration
47
33
  end
48
34
 
49
- def extend_observed_models!
50
- config.observe.each do |klass|
51
- if klass.is_a?(Symbol) || klass.is_a?(String)
52
- klass = klass.to_s.camelize.constantize
53
- end
54
- unless klass.include?(PagesCore::Sweepable)
55
- klass.send(:include, PagesCore::Sweepable)
56
- end
57
- end
58
- end
59
-
60
35
  # Purge the entire pages cache
61
36
  def purge!
62
37
  cache_dir = config.cache_path
63
- `rm -rf "#{cache_dir}/*"` if File.exist?(cache_dir)
38
+ FileUtils.rm_rf(Dir.glob("#{cache_dir}/*")) if File.exist?(cache_dir)
64
39
  end
65
40
 
66
41
  # Sweep all cached pages
67
42
  def sweep!
68
43
  return [] unless enabled
69
- cache_dirs.flat_map { |d| sweep_dir(d) }
44
+ cache_dirs.flat_map { |d| sweep_dir(d) }
70
45
  end
71
46
 
72
47
  private
@@ -74,39 +49,91 @@ module PagesCore
74
49
  def cache_dirs
75
50
  if PagesCore.config(:domain_based_cache)
76
51
  Dir.entries(config.cache_path)
77
- .select { |d| visible_dir?(d) }
78
- .map { |d| File.join(config.cache_path, d) }
79
- .map(&:to_s)
52
+ .select { |d| visible_dir?(d) }
53
+ .map { |d| File.join(config.cache_path, d).to_s }
80
54
  else
81
55
  [config.cache_path.to_s]
82
56
  end
83
57
  end
84
58
 
59
+ # Returns the default configuration.
60
+ def default_config
61
+ OpenStruct.new(cache_path: ActionController::Base.page_cache_directory,
62
+ observe: [Page, PageComment, Image],
63
+ patterns: [%r{^/index\.[\w]+$},
64
+ %r{^/sitemap\.[\w]+$},
65
+ %r{^/pages/[\w]{2,3}[/\.](.*)$},
66
+ %r{^/[\w]{2,3}/(.*)$}])
67
+ end
68
+
69
+ def extend_observed_models!
70
+ config.observe.each do |klass|
71
+ if klass.is_a?(Symbol) || klass.is_a?(String)
72
+ klass = klass.to_s.camelize.constantize
73
+ end
74
+ klass.send(:include, PagesCore::Sweepable)
75
+ end
76
+ end
77
+
85
78
  def visible_dir?(dir)
86
79
  !(dir =~ /^\./) && File.directory?(File.join(config.cache_path, dir))
87
80
  end
88
81
 
89
82
  def sweep_dir(cache_dir)
90
- return [] unless File.exist?(cache_dir)
91
- swept_files = []
92
- Find.find(cache_dir + "/") do |path|
93
- Find.prune if skip_path?(cache_dir, path)
94
- file = path.gsub(Regexp.new("^#{cache_dir}"), "")
95
- config.patterns.each do |p|
96
- if file =~ p && File.exist?(path)
97
- swept_files << path
98
- FileUtils.rm_rf(path)
99
- end
100
- end
83
+ PagesCore::CacheSweeper.new(cache_dir).sweep!
84
+ end
85
+ end
86
+
87
+ attr_reader :cache_dir
88
+
89
+ self.enabled ||= true
90
+
91
+ def initialize(cache_dir)
92
+ @cache_dir = cache_dir
93
+ end
94
+
95
+ def sweep!
96
+ return [] unless File.exist?(cache_dir)
97
+ swept_files = []
98
+
99
+ Find.find(cache_dir + "/") do |path|
100
+ Find.prune if skip_path?(path) || !File.exist?(path)
101
+
102
+ if sweep_file?(path)
103
+ swept_files << path
104
+ FileUtils.rm_rf(path)
101
105
  end
102
- swept_files
103
106
  end
107
+ swept_files
108
+ end
109
+
110
+ private
111
+
112
+ def locales
113
+ return [I18n.default_locale.to_s] unless PagesCore.config.locales
104
114
 
105
- def skip_path?(cache_dir, path)
106
- path =~ Regexp.new("^#{cache_dir}/dynamic_image[s]?")
115
+ ([I18n.default_locale.to_s] +
116
+ PagesCore.config.locales.keys.map(&:to_s)).uniq
117
+ end
118
+
119
+ def page_path_files
120
+ @page_path_files ||= PagePath.all.flat_map do |p|
121
+ ["/#{p.path}.html"] +
122
+ locales.map { |l| "/#{l}/#{p.path}.html" }
107
123
  end
108
124
  end
109
125
 
110
- self.enabled ||= true
126
+ def pattern_match?(path)
127
+ PagesCore::CacheSweeper.config.patterns.select { |p| p =~ path }.any?
128
+ end
129
+
130
+ def skip_path?(path)
131
+ path =~ Regexp.new("^#{cache_dir}/dynamic_image[s]?")
132
+ end
133
+
134
+ def sweep_file?(path)
135
+ relative = path.gsub(Regexp.new("^#{cache_dir}"), "")
136
+ pattern_match?(relative) || page_path_files.include?(relative)
137
+ end
111
138
  end
112
139
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
- load "pages_core/configuration/base.rb"
4
- load "pages_core/configuration/pages.rb"
3
+ require "pages_core/configuration/base"
4
+ require "pages_core/configuration/pages"
5
5
 
6
6
  module PagesCore
7
7
  module Configuration
@@ -13,11 +13,7 @@ module PagesCore
13
13
  settings[key] = OpenStruct.new(type: type, default: default)
14
14
 
15
15
  define_method key do |*args|
16
- if args.length > 0
17
- set(key, *args)
18
- else
19
- get(key)
20
- end
16
+ args.any? ? set(key, *args) : get(key)
21
17
  end
22
18
 
23
19
  define_method "#{key}=" do |value|
@@ -30,7 +26,7 @@ module PagesCore
30
26
  end
31
27
 
32
28
  def get(key)
33
- fail InvalidConfigurationKey unless setting?(key)
29
+ raise InvalidConfigurationKey unless setting?(key)
34
30
  if configuration.key?(key)
35
31
  configuration[key]
36
32
  else
@@ -39,10 +35,10 @@ module PagesCore
39
35
  end
40
36
 
41
37
  def set(key, value)
42
- fail InvalidConfigurationKey unless setting?(key)
38
+ raise InvalidConfigurationKey unless setting?(key)
43
39
  value = parse_value(key, value)
44
40
  unless valid_type?(key, value)
45
- fail(
41
+ raise(
46
42
  ArgumentError,
47
43
  "expected #{self.class.settings[key].type}, got #{value.class}"
48
44
  )
@@ -1,9 +1,11 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require "pages_core/file_embedder"
4
+
3
5
  module PagesCore
4
6
  module Configuration
5
7
  class Pages < Base
6
- setting :site_name, :string, "Pages Site"
8
+ setting :site_name, :string, "Pages Site"
7
9
  setting :default_sender, :string
8
10
  setting :localizations, :boolean, false
9
11
  setting :locales, :hash
@@ -13,11 +15,12 @@ module PagesCore
13
15
  setting :rss_fulltext, :boolean, true
14
16
  setting :image_fallback_url, :string
15
17
  setting :default_author, :string
16
- setting :comment_notifications, :array, []
18
+ setting :comment_notifications, :array, []
17
19
  setting :close_comments_after, :integer
18
20
  setting :comment_honeypot, :boolean, false
19
21
  setting :recaptcha, :boolean, false
20
- setting :pages_path_scope, :string
22
+ setting :error_404_layout, :string
23
+ setting :file_embedder, :object, PagesCore::FileEmbedder
21
24
  end
22
25
  end
23
26
  end
@@ -2,8 +2,16 @@
2
2
 
3
3
  module PagesCore
4
4
  class Engine < Rails::Engine
5
+ # config.autoload_paths += Dir["#{config.root}/lib/"]
6
+ # config.autoload_paths += Dir["#{config.root}/lib/pages_core/**/"]
7
+ # config.eager_load_paths += Dir["#{config.root}/lib/pages_core/**/"]
8
+
5
9
  initializer :active_job do |_config|
6
- ActiveJob::Base.queue_adapter = :delayed_job
10
+ ActiveJob::Base.queue_adapter = if Rails.env.test?
11
+ :test
12
+ else
13
+ :delayed_job
14
+ end
7
15
  end
8
16
 
9
17
  initializer :append_migrations do |app|
@@ -21,7 +29,21 @@ module PagesCore
21
29
  pages/admin.css
22
30
  pages/admin/print.css
23
31
  pages/errors.css
32
+ pages/*.gif
33
+ pages/*.png
34
+ pages/*.jpg
24
35
  )
25
36
  end
37
+
38
+ initializer :handle_exceptions do |app|
39
+ app.config.exceptions_app = app.routes
40
+ end
41
+
42
+ # React configuration
43
+ initializer :react do |app|
44
+ app.config.react.jsx_transform_options = {
45
+ harmony: true
46
+ }
47
+ end
26
48
  end
27
49
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
 
3
- load "pages_core/extensions/hash_extensions.rb"
4
- load "pages_core/extensions/string_extensions.rb"
3
+ require "pages_core/extensions/hash_extensions"
4
+ require "pages_core/extensions/string_extensions"
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ class FileEmbedder
5
+ include ActionView::Helpers::AssetTagHelper
6
+
7
+ attr_reader :files
8
+
9
+ def initialize(files)
10
+ @files = Array(files)
11
+ end
12
+
13
+ def to_html
14
+ embed_files(files.map { |f| embed_file(f) })
15
+ end
16
+
17
+ def embed_files(embedded_files)
18
+ embedded_files.join(", ")
19
+ end
20
+
21
+ def embed_file(file)
22
+ content_tag(
23
+ :a,
24
+ file.name,
25
+ class: "file",
26
+ href: file_path(file)
27
+ )
28
+ end
29
+
30
+ private
31
+
32
+ def file_path(file)
33
+ Rails.application.routes.url_helpers.page_file_path(
34
+ file.locale,
35
+ file.page,
36
+ file
37
+ )
38
+ end
39
+ end
40
+ end