pages_core 3.6.2 → 3.7.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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/Rakefile +3 -1
  4. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +1 -1
  5. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +5 -5
  6. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +10 -5
  7. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +10 -5
  8. data/app/assets/javascripts/pages/admin/components/page_tree.jsx +9 -9
  9. data/app/assets/javascripts/pages/admin/components/page_tree_node.jsx +11 -11
  10. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +5 -4
  11. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +54 -21
  12. data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -3
  13. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +1 -1
  14. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +3 -3
  15. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +1 -1
  16. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +28 -28
  17. data/app/assets/javascripts/pages/admin/lib/tree.jsx +9 -9
  18. data/app/assets/javascripts/pages/login_form.jsx +8 -8
  19. data/app/assets/stylesheets/pages/admin/components/forms.scss +20 -0
  20. data/app/assets/stylesheets/pages/errors.css +2 -0
  21. data/app/controller_dummies/admin/admin_controller.rb +2 -0
  22. data/app/controller_dummies/application_controller.rb +2 -0
  23. data/app/controller_dummies/attachments_controller.rb +2 -0
  24. data/app/controller_dummies/frontend_controller.rb +2 -0
  25. data/app/controller_dummies/images_controller.rb +2 -0
  26. data/app/controller_dummies/page_files_controller.rb +2 -0
  27. data/app/controller_dummies/pages_controller.rb +2 -0
  28. data/app/controller_dummies/sitemaps_controller.rb +2 -0
  29. data/app/controllers/admin/attachments_controller.rb +4 -2
  30. data/app/controllers/admin/categories_controller.rb +2 -0
  31. data/app/controllers/admin/images_controller.rb +10 -5
  32. data/app/controllers/admin/invites_controller.rb +4 -1
  33. data/app/controllers/admin/pages_controller.rb +7 -19
  34. data/app/controllers/admin/password_resets_controller.rb +9 -5
  35. data/app/controllers/admin/users_controller.rb +10 -4
  36. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +13 -11
  37. data/app/controllers/concerns/pages_core/admin/persistent_params.rb +75 -0
  38. data/app/controllers/concerns/pages_core/authentication.rb +4 -1
  39. data/app/controllers/concerns/pages_core/error_renderer.rb +3 -0
  40. data/app/controllers/concerns/pages_core/error_reporting.rb +36 -0
  41. data/app/controllers/concerns/pages_core/policies_helper.rb +4 -1
  42. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +3 -0
  43. data/app/controllers/concerns/pages_core/process_titler.rb +2 -0
  44. data/app/controllers/concerns/pages_core/rss_controller.rb +2 -0
  45. data/app/controllers/concerns/pages_core/static_cache_controller.rb +48 -0
  46. data/app/controllers/errors_controller.rb +5 -53
  47. data/app/controllers/pages_core/admin_controller.rb +7 -67
  48. data/app/controllers/pages_core/attachments_controller.rb +10 -6
  49. data/app/controllers/pages_core/base_controller.rb +11 -17
  50. data/app/controllers/pages_core/frontend/page_files_controller.rb +6 -2
  51. data/app/controllers/pages_core/frontend/pages_controller.rb +9 -15
  52. data/app/controllers/pages_core/frontend_controller.rb +3 -0
  53. data/app/controllers/pages_core/images_controller.rb +3 -1
  54. data/app/controllers/pages_core/sitemaps_controller.rb +11 -5
  55. data/app/controllers/sessions_controller.rb +2 -0
  56. data/app/formatters/pages_core/html_formatter.rb +13 -63
  57. data/app/formatters/pages_core/image_embedder.rb +79 -0
  58. data/app/formatters/pages_core/link_renderer.rb +2 -0
  59. data/app/helpers/admin/admin_helper.rb +2 -0
  60. data/app/helpers/admin/menu_helper.rb +6 -4
  61. data/app/helpers/admin/pages_helper.rb +4 -57
  62. data/app/helpers/application_helper.rb +2 -0
  63. data/app/helpers/frontend_helper.rb +2 -0
  64. data/app/helpers/pages_core/admin/admin_helper.rb +22 -106
  65. data/app/helpers/pages_core/admin/content_tabs_helper.rb +28 -0
  66. data/app/helpers/pages_core/admin/date_range_helper.rb +55 -0
  67. data/app/helpers/pages_core/admin/form_builder.rb +8 -0
  68. data/app/helpers/pages_core/admin/image_uploads_helper.rb +48 -0
  69. data/app/helpers/pages_core/admin/labelled_field_helper.rb +12 -9
  70. data/app/helpers/pages_core/admin/page_blocks_helper.rb +66 -0
  71. data/app/helpers/pages_core/admin/page_json_helper.rb +23 -0
  72. data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
  73. data/app/helpers/pages_core/application_helper.rb +3 -0
  74. data/app/helpers/pages_core/attachments_helper.rb +31 -27
  75. data/app/helpers/pages_core/form_builder.rb +17 -13
  76. data/app/helpers/pages_core/frontend_helper.rb +3 -3
  77. data/app/helpers/pages_core/head_tags_helper.rb +7 -2
  78. data/app/helpers/pages_core/images_helper.rb +3 -0
  79. data/app/helpers/pages_core/meta_tags_helper.rb +3 -1
  80. data/app/helpers/pages_core/open_graph_tags_helper.rb +7 -5
  81. data/app/helpers/pages_core/page_path_helper.rb +24 -3
  82. data/app/jobs/pages_core/autopublish_job.rb +3 -1
  83. data/app/jobs/pages_core/sweep_cache_job.rb +4 -2
  84. data/app/mailers/admin_mailer.rb +4 -14
  85. data/app/models/attachment.rb +10 -8
  86. data/app/models/autopublisher.rb +3 -0
  87. data/app/models/category.rb +3 -1
  88. data/app/models/concerns/pages_core/has_roles.rb +2 -0
  89. data/app/models/concerns/pages_core/humanizable_param.rb +9 -6
  90. data/app/models/concerns/pages_core/page_model/attachments.rb +2 -0
  91. data/app/models/concerns/pages_core/page_model/autopublishable.rb +2 -0
  92. data/app/models/concerns/pages_core/page_model/dated_page.rb +11 -11
  93. data/app/models/concerns/pages_core/page_model/images.rb +5 -1
  94. data/app/models/concerns/pages_core/page_model/localizable.rb +2 -0
  95. data/app/models/concerns/pages_core/page_model/pathable.rb +26 -25
  96. data/app/models/concerns/pages_core/page_model/redirectable.rb +3 -1
  97. data/app/models/concerns/pages_core/page_model/sortable.rb +6 -5
  98. data/app/models/concerns/pages_core/page_model/status.rb +2 -0
  99. data/app/models/concerns/pages_core/page_model/templateable.rb +7 -2
  100. data/app/models/concerns/pages_core/page_model/tree.rb +27 -20
  101. data/app/models/concerns/pages_core/sweepable.rb +4 -2
  102. data/app/models/concerns/pages_core/taggable.rb +8 -2
  103. data/app/models/image.rb +14 -1
  104. data/app/models/invite.rb +3 -1
  105. data/app/models/invite_role.rb +5 -3
  106. data/app/models/page.rb +4 -3
  107. data/app/models/page_builder.rb +2 -0
  108. data/app/models/page_category.rb +3 -1
  109. data/app/models/page_exporter.rb +22 -9
  110. data/app/models/page_file.rb +3 -1
  111. data/app/models/page_image.rb +3 -1
  112. data/app/models/page_path.rb +13 -5
  113. data/app/models/password_reset_token.rb +3 -1
  114. data/app/models/role.rb +8 -5
  115. data/app/models/tag.rb +8 -6
  116. data/app/models/tagging.rb +4 -2
  117. data/app/models/user.rb +7 -4
  118. data/app/policies/invite_policy.rb +2 -0
  119. data/app/policies/page_file_policy.rb +2 -0
  120. data/app/policies/page_image_policy.rb +2 -0
  121. data/app/policies/page_policy.rb +2 -0
  122. data/app/policies/policy.rb +2 -0
  123. data/app/policies/user_policy.rb +2 -0
  124. data/app/serializers/admin/attachment_serializer.rb +4 -2
  125. data/app/serializers/admin/image_serializer.rb +4 -2
  126. data/app/serializers/admin/page_file_serializer.rb +2 -0
  127. data/app/serializers/admin/page_image_serializer.rb +2 -0
  128. data/app/serializers/page_export_serializer.rb +2 -0
  129. data/app/serializers/page_file_export_serializer.rb +2 -0
  130. data/app/serializers/page_image_export_serializer.rb +2 -0
  131. data/app/serializers/page_image_serializer.rb +2 -0
  132. data/app/serializers/page_serializer.rb +2 -0
  133. data/app/services/pages_core/create_user_service.rb +5 -2
  134. data/app/services/pages_core/destroy_invite_service.rb +25 -0
  135. data/app/services/pages_core/invite_service.rb +2 -0
  136. data/app/views/admin/images/show.json.jbuilder +2 -0
  137. data/app/views/admin/pages/news.html.erb +1 -1
  138. data/app/views/errors/500.html.erb +2 -20
  139. data/app/views/errors/_generic_help.html.erb +1 -1
  140. data/app/views/feeds/pages.rss.builder +2 -0
  141. data/app/views/sitemaps/show.xml.builder +2 -0
  142. data/config/routes.rb +5 -5
  143. data/db/migrate/20111219033112_create_pages_tables.rb +192 -271
  144. data/lib/pages_core.rb +10 -0
  145. data/lib/pages_core/admin_menu_item.rb +3 -0
  146. data/lib/pages_core/archive_finder.rb +12 -16
  147. data/lib/pages_core/attachment_embedder.rb +4 -6
  148. data/lib/pages_core/cache_sweeper.rb +10 -108
  149. data/lib/pages_core/configuration.rb +2 -0
  150. data/lib/pages_core/configuration/base.rb +5 -0
  151. data/lib/pages_core/configuration/pages.rb +4 -2
  152. data/lib/pages_core/digest_verifier.rb +5 -5
  153. data/lib/pages_core/engine.rb +52 -0
  154. data/lib/pages_core/extensions.rb +2 -0
  155. data/lib/pages_core/extensions/string_extensions.rb +3 -1
  156. data/lib/pages_core/page_path_constraint.rb +2 -0
  157. data/lib/pages_core/pages_plugin.rb +3 -1
  158. data/lib/pages_core/plugin.rb +4 -52
  159. data/lib/pages_core/pub_sub.rb +2 -0
  160. data/lib/pages_core/static_cache.rb +26 -0
  161. data/lib/pages_core/static_cache/null_handler.rb +17 -0
  162. data/lib/pages_core/static_cache/page_cache_handler.rb +56 -0
  163. data/lib/pages_core/static_cache/varnish_handler.rb +55 -0
  164. data/lib/pages_core/templates.rb +5 -3
  165. data/lib/pages_core/templates/block_configuration.rb +3 -0
  166. data/lib/pages_core/templates/configuration.rb +5 -1
  167. data/lib/pages_core/templates/configuration_handler.rb +4 -2
  168. data/lib/pages_core/templates/configuration_proxy.rb +2 -0
  169. data/lib/pages_core/templates/controller_actions.rb +2 -0
  170. data/lib/pages_core/templates/template_configuration.rb +18 -13
  171. data/lib/pages_core/version.rb +3 -1
  172. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +2 -0
  173. data/lib/rails/generators/pages_core/install/install_generator.rb +3 -7
  174. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +2 -0
  175. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +2 -0
  176. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +2 -0
  177. data/lib/rails/generators/pages_core/install/templates/delayed_job +1 -0
  178. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +17 -0
  179. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +2 -0
  180. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +2 -0
  181. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +12 -1
  182. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -0
  183. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +2 -0
  184. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +2 -6
  185. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +18 -14
  186. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +3 -8
  187. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +2 -0
  188. data/lib/rails/generators/pages_core/rspec/templates/page_templates_spec.rb +26 -0
  189. data/lib/rails/generators/pages_core/rspec/templates/rails_helper.rb +91 -0
  190. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +89 -36
  191. data/lib/tasks/pages.rake +3 -2
  192. data/lib/tasks/pages/cache.rake +8 -5
  193. data/lib/tasks/pages/export.rake +3 -1
  194. data/lib/tasks/pages/page_paths.rake +2 -0
  195. data/template.rb +2 -0
  196. metadata +127 -77
  197. data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -26
  198. data/app/views/admin_mailer/error_report.html.erb +0 -70
  199. data/app/views/errors/500_critical.html.erb +0 -7
  200. data/app/views/errors/report.html.erb +0 -4
  201. data/config/removed_migrations.yml +0 -60
  202. data/db/migrate/20120627033112_rename_textbits.rb +0 -17
  203. data/db/migrate/20121010055412_drop_removed_tables.rb +0 -81
  204. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +0 -9
  205. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +0 -9
  206. data/db/migrate/20130303160632_remove_imagesets.rb +0 -22
  207. data/db/migrate/20130303161732_remove_sms_subscribers.rb +0 -14
  208. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -10
  209. data/db/migrate/20140203183900_create_roles.rb +0 -66
  210. data/db/migrate/20140414150500_change_locale_names.rb +0 -11
  211. data/db/migrate/20140604142100_remove_openid_url.rb +0 -9
  212. data/db/migrate/20140920231700_convert_images_to_dis.rb +0 -81
  213. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +0 -50
  214. data/db/migrate/20141004003100_create_password_reset_tokens.rb +0 -10
  215. data/db/migrate/20141006181300_remove_user_cruft.rb +0 -11
  216. data/db/migrate/20141007173000_create_invites.rb +0 -16
  217. data/db/migrate/20150204130800_update_delayed_job_table.rb +0 -9
  218. data/db/migrate/20150401131300_localize_images.rb +0 -38
  219. data/db/migrate/20150520174300_add_meta_image_to_page.rb +0 -5
  220. data/db/migrate/20150904164200_add_pinned_to_tags.rb +0 -5
  221. data/db/migrate/20151002174800_create_page_paths.rb +0 -10
  222. data/db/migrate/20151021103400_drop_binaries_table.rb +0 -7
  223. data/db/migrate/20151204151000_remove_page_content_order.rb +0 -5
  224. data/db/migrate/20160330220900_rename_pages_categories.rb +0 -6
  225. data/db/migrate/20160405202700_change_localization_limit.rb +0 -9
  226. data/db/migrate/20170716040500_remove_page_comments.rb +0 -23
  227. data/db/migrate/20170716213400_remove_sessions.rb +0 -15
  228. data/db/migrate/20180207134000_add_dates_to_pages.rb +0 -11
  229. data/db/migrate/20190211154800_create_attachments.rb +0 -73
  230. data/db/migrate/20190318115000_fix_page_file_ids.rb +0 -34
  231. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -6
  232. data/lib/tasks/pages/update.rake +0 -17
data/lib/pages_core.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Ruby Standard Library
2
4
  require "digest/sha1"
3
5
  require "fileutils"
@@ -23,13 +25,21 @@ require "country_select"
23
25
  require "delayed_job"
24
26
  require "dis"
25
27
  require "dynamic_image"
28
+ require "healthcheck"
26
29
  require "localizable_model"
30
+ require "lograge"
31
+ require "nokogiri"
27
32
  require "json"
33
+ require "progress_bar"
28
34
  require "rails_i18n"
29
35
  require "RedCloth"
30
36
  require "sass-rails"
37
+ require "typhoeus"
31
38
  require "will_paginate"
32
39
 
40
+ # Must be loaded so that PagesCore::LinkRender can resolve the constant.
41
+ require "will_paginate/view_helpers/action_view"
42
+
33
43
  # Assets
34
44
  require "font-awesome-rails"
35
45
  require "jquery-ui-rails"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class AdminMenuItem
3
5
  attr_reader :label, :path, :group, :options
@@ -5,6 +7,7 @@ module PagesCore
5
7
  class << self
6
8
  def items
7
9
  return [] unless @menu_items
10
+
8
11
  @menu_items.map { |_, v| v }
9
12
  end
10
13
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class ArchiveFinder
3
5
  def initialize(relation, options = {})
@@ -9,6 +11,12 @@ module PagesCore
9
11
  filter_by_time(range_for_year(year))
10
12
  end
11
13
 
14
+ def by_year_and_maybe_month(year, month = nil)
15
+ return by_year(year) unless month
16
+
17
+ by_year_and_month(year, month)
18
+ end
19
+
12
20
  def by_year_and_month(year, month)
13
21
  filter_by_time(range_for_year_and_month(year, month))
14
22
  end
@@ -62,25 +70,17 @@ module PagesCore
62
70
  end
63
71
 
64
72
  def month_part
65
- if mysql?
66
- "MONTH(#{timestamp_attribute})"
67
- else
68
- "date_part('month', #{timestamp_attribute})::integer"
69
- end
70
- end
71
-
72
- def mysql?
73
- ActiveRecord::Base.connection.adapter_name.downcase.starts_with?("mysql")
73
+ "date_part('month', #{timestamp_attribute})::integer"
74
74
  end
75
75
 
76
76
  def range_for_year(year)
77
- start_time = Time.new(year.to_i, 1, 1)
77
+ start_time = Time.zone.local(year.to_i, 1, 1)
78
78
  end_time = start_time.end_of_year
79
79
  (start_time.in_time_zone)..(end_time.in_time_zone)
80
80
  end
81
81
 
82
82
  def range_for_year_and_month(year, month)
83
- start_time = Time.new(year.to_i, month, 1)
83
+ start_time = Time.zone.local(year.to_i, month, 1)
84
84
  end_time = start_time.end_of_month
85
85
  (start_time.in_time_zone)..(end_time.in_time_zone)
86
86
  end
@@ -98,11 +98,7 @@ module PagesCore
98
98
  end
99
99
 
100
100
  def year_part
101
- if mysql?
102
- "YEAR(#{timestamp_attribute})"
103
- else
104
- "date_part('year', #{timestamp_attribute})"
105
- end
101
+ "date_part('year', #{timestamp_attribute})"
106
102
  end
107
103
  end
108
104
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class AttachmentEmbedder
3
5
  include ActionView::Helpers::AssetTagHelper
@@ -17,12 +19,8 @@ module PagesCore
17
19
  end
18
20
 
19
21
  def embed_attachment(attachment)
20
- content_tag(
21
- :a,
22
- attachment.name,
23
- class: "file",
24
- href: attachment_path(attachment)
25
- )
22
+ tag.a(attachment.name, class: "file",
23
+ href: attachment_path(attachment))
26
24
  end
27
25
 
28
26
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class CacheSweeper
3
5
  class << self
@@ -6,125 +8,25 @@ module PagesCore
6
8
  def disable(&_block)
7
9
  old_value = enabled
8
10
  self.enabled = false
9
- yield
11
+ yield if block_given?
10
12
  self.enabled = old_value
11
13
  end
12
14
 
13
15
  def once(&block)
14
16
  disable(&block)
15
- PagesCore::SweepCacheJob.perform_later
17
+ PagesCore::StaticCache.handler.sweep!
16
18
  end
17
19
 
18
- # Returns the configuration. Accepts a block, ie:
19
- #
20
- # PagesCore::CacheSweeper.config do |c|
21
- # c.patterns += [/^\/arkiv(.*)$/, /^\/tests(.*)$/]
22
- # end
23
20
  def config
24
- @configuration ||= default_config
25
- yield @configuration if block_given?
26
- @configuration
27
- end
28
-
29
- # Purge the entire pages cache
30
- def purge!
31
- cache_dir = config.cache_path
32
- FileUtils.rm_rf(Dir.glob("#{cache_dir}/*")) if File.exist?(cache_dir)
33
- end
34
-
35
- # Sweep all cached pages
36
- def sweep!
37
- return [] unless enabled
38
- cache_dirs.flat_map { |d| sweep_dir(d) }
39
- end
40
-
41
- private
42
-
43
- def cache_dirs
44
- if PagesCore.config(:domain_based_cache)
45
- Dir.entries(config.cache_path)
46
- .select { |d| visible_dir?(d) }
47
- .map { |d| File.join(config.cache_path, d).to_s }
48
- else
49
- [config.cache_path.to_s]
50
- end
51
- end
52
-
53
- # Returns the default configuration.
54
- def default_config
55
- OpenStruct.new(cache_path: ActionController::Base.page_cache_directory,
56
- patterns: [%r{^/index\.[\w]+$},
57
- %r{^/sitemap\.[\w]+$},
58
- %r{^/pages/[\w]{2,3}[/\.](.*)$},
59
- %r{^/[\w]{2,3}/(.*)$}])
60
- end
61
-
62
- def visible_dir?(dir)
63
- dir !~ /^\./ && File.directory?(File.join(config.cache_path, dir))
64
- end
65
-
66
- def sweep_dir(cache_dir)
67
- PagesCore::CacheSweeper.new(cache_dir).sweep!
21
+ ActiveSupport::Deprecation.warn(
22
+ "PagesCore::CacheSweeper.config is no longer used."
23
+ )
24
+ configuration = OpenStruct.new(patterns: [])
25
+ yield configuration if block_given?
26
+ configuration
68
27
  end
69
28
  end
70
29
 
71
- attr_reader :cache_dir
72
-
73
30
  self.enabled ||= true
74
-
75
- def initialize(cache_dir)
76
- @cache_dir = cache_dir
77
- end
78
-
79
- def sweep!
80
- return [] unless File.exist?(cache_dir)
81
- swept_files = []
82
-
83
- Find.find(cache_dir + "/") do |path|
84
- Find.prune if skip_path?(path) || !File.exist?(path)
85
-
86
- if sweep_file?(path)
87
- swept_files << path
88
- FileUtils.rm_rf(path)
89
- end
90
- end
91
- swept_files
92
- end
93
-
94
- private
95
-
96
- def locales
97
- return [I18n.default_locale.to_s] unless PagesCore.config.locales
98
-
99
- ([I18n.default_locale.to_s] +
100
- PagesCore.config.locales.keys.map(&:to_s)).uniq
101
- end
102
-
103
- def page_path?(relative)
104
- return false unless relative =~ /\.html$/
105
- page_paths.each do |p|
106
- return true if relative.start_with?(p)
107
- end
108
- false
109
- end
110
-
111
- def page_paths
112
- @page_paths ||= PagePath.all.flat_map do |p|
113
- ["/#{p.path}"] + locales.map { |l| "/#{l}/#{p.path}" }
114
- end
115
- end
116
-
117
- def pattern_match?(path)
118
- PagesCore::CacheSweeper.config.patterns.select { |p| p =~ path }.any?
119
- end
120
-
121
- def skip_path?(path)
122
- path =~ Regexp.new("^#{cache_dir}/dynamic_image[s]?")
123
- end
124
-
125
- def sweep_file?(path)
126
- relative = path.gsub(Regexp.new("^#{cache_dir}"), "")
127
- pattern_match?(relative) || page_path?(relative)
128
- end
129
31
  end
130
32
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "pages_core/configuration/base"
2
4
  require "pages_core/configuration/pages"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Configuration
3
5
  class Base
@@ -25,6 +27,7 @@ module PagesCore
25
27
 
26
28
  def get(key)
27
29
  raise InvalidConfigurationKey unless setting?(key)
30
+
28
31
  if configuration.key?(key)
29
32
  configuration[key]
30
33
  else
@@ -34,6 +37,7 @@ module PagesCore
34
37
 
35
38
  def set(key, value)
36
39
  raise InvalidConfigurationKey unless setting?(key)
40
+
37
41
  value = parse_value(key, value)
38
42
  unless valid_type?(key, value)
39
43
  raise(
@@ -60,6 +64,7 @@ module PagesCore
60
64
 
61
65
  def valid_type?(key, value)
62
66
  return true if value.nil?
67
+
63
68
  if type_for(key) == :boolean
64
69
  value.is_a?(TrueClass) || value.is_a?(FalseClass)
65
70
  else
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "pages_core/attachment_embedder"
4
+ require "pages_core/static_cache"
2
5
 
3
6
  module PagesCore
4
7
  module Configuration
@@ -8,13 +11,12 @@ module PagesCore
8
11
  setting :localizations, :boolean, false
9
12
  setting :locales, :hash
10
13
  setting :text_filter, :symbol, :textile
11
- setting :page_cache, :boolean, true
12
- setting :domain_based_cache, :boolean, false
13
14
  setting :rss_fulltext, :boolean, true
14
15
  setting :image_fallback_url, :string
15
16
  setting :default_author, :string
16
17
  setting :error_404_layout, :string
17
18
  setting :attachment_embedder, :object, PagesCore::AttachmentEmbedder
19
+ setting :static_cache_handler, :object
18
20
  end
19
21
  end
20
22
  end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module PagesCore
4
4
  # = Digest Verifier
@@ -42,13 +42,13 @@ module PagesCore
42
42
 
43
43
  private
44
44
 
45
- def secure_compare(a, b)
46
- return false unless a.bytesize == b.bytesize
45
+ def secure_compare(value, other)
46
+ return false unless value.bytesize == other.bytesize
47
47
 
48
- l = a.unpack "C#{a.bytesize}"
48
+ l = value.unpack "C#{value.bytesize}"
49
49
 
50
50
  res = 0
51
- b.each_byte { |byte| res |= byte ^ l.shift }
51
+ other.each_byte { |byte| res |= byte ^ l.shift }
52
52
  res.zero?
53
53
  end
54
54
 
@@ -1,9 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class Engine < Rails::Engine
3
5
  # config.autoload_paths += Dir["#{config.root}/lib/"]
4
6
  # config.autoload_paths += Dir["#{config.root}/lib/pages_core/**/"]
5
7
  # config.eager_load_paths += Dir["#{config.root}/lib/pages_core/**/"]
6
8
 
9
+ initializer :factory_bot_definitions do |app|
10
+ path = File.expand_path("../../spec/factories", __dir__)
11
+
12
+ if defined?(FactoryBotRails)
13
+ app.config.factory_bot.definition_file_paths << path
14
+ FactoryBot.definition_file_paths =
15
+ Rails.application.config.factory_bot.definition_file_paths
16
+ end
17
+ end
18
+
7
19
  initializer :append_migrations do |app|
8
20
  unless app.root.to_s.match root.to_s
9
21
  config.paths["db/migrate"].expanded.each do |expanded_path|
@@ -18,6 +30,8 @@ module PagesCore
18
30
  pages/admin.js
19
31
  pages/admin.css
20
32
  pages/errors.css
33
+ pages/favicon.gif
34
+ pages/admin/icon.png
21
35
  pages/*.gif
22
36
  pages/*.png
23
37
  pages/*.jpg
@@ -30,6 +44,44 @@ module PagesCore
30
44
 
31
45
  initializer :handle_exceptions do |app|
32
46
  app.config.exceptions_app = app.routes
47
+ ActionDispatch::ExceptionWrapper.rescue_responses.merge!(
48
+ "PagesCore::NotAuthorized" => :forbidden
49
+ )
50
+ end
51
+
52
+ initializer :healthcheck do |_app|
53
+ Healthcheck.configure do |config|
54
+ config.success = 200
55
+ config.error = 503
56
+ config.verbose = true
57
+ config.route = "/healthcheck"
58
+ config.method = :get
59
+
60
+ # -- Checks --
61
+ config.add_check :database, lambda {
62
+ ActiveRecord::Base.connection.execute("select 1")
63
+ }
64
+ # config.add_check :migrations, lambda {
65
+ # ActiveRecord::Migration.check_pending!
66
+ # }
67
+ # config.add_check :cache, -> { Rails.cache.read("some_key") }
68
+ end
69
+ end
70
+
71
+ initializer :lograge do |app|
72
+ app.config.lograge.enabled = true if ENV["ENABLE_LOGRAGE"]
73
+ app.config.lograge.formatter = Lograge::Formatters::Json.new
74
+ app.config.lograge.ignore_actions =
75
+ ["Healthcheck::HealthchecksController#check"]
76
+
77
+ app.config.lograge.custom_options = lambda do |event|
78
+ exclude_params = %w[controller action format id]
79
+ { remote_ip: event.payload[:remote_ip],
80
+ user_id: event.payload[:user_id],
81
+ user_email: event.payload[:user_email],
82
+ params: event.payload[:params]
83
+ .except(*exclude_params) }
84
+ end
33
85
  end
34
86
 
35
87
  # React configuration
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "pages_core/extensions/string_extensions"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Extensions
3
5
  module StringExtensions
@@ -12,4 +14,4 @@ module PagesCore
12
14
  end
13
15
  end
14
16
 
15
- String.send(:include, PagesCore::Extensions::StringExtensions)
17
+ String.include PagesCore::Extensions::StringExtensions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class PagePathConstraint
3
5
  def matches?(request)