bridgetown-core 2.0.0.beta2 → 2.0.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/bridgetown-core.gemspec +43 -42
  4. data/lib/bridgetown-core/cache.rb +3 -19
  5. data/lib/bridgetown-core/cleaner.rb +17 -19
  6. data/lib/bridgetown-core/collection.rb +6 -5
  7. data/lib/bridgetown-core/commands/base.rb +7 -0
  8. data/lib/bridgetown-core/commands/build.rb +35 -22
  9. data/lib/bridgetown-core/commands/concerns/actions.rb +4 -0
  10. data/lib/bridgetown-core/commands/console.rb +0 -1
  11. data/lib/bridgetown-core/commands/esbuild/esbuild.config.js +7 -6
  12. data/lib/bridgetown-core/commands/esbuild/esbuild.defaults.js.erb +14 -13
  13. data/lib/bridgetown-core/commands/esbuild/migrate-from-webpack.rb +1 -1
  14. data/lib/bridgetown-core/commands/esbuild/update.rb +17 -3
  15. data/lib/bridgetown-core/commands/esbuild.rb +1 -1
  16. data/lib/bridgetown-core/commands/start.rb +12 -2
  17. data/lib/bridgetown-core/component.rb +1 -1
  18. data/lib/bridgetown-core/concerns/intuitive_expectations.rb +67 -0
  19. data/lib/bridgetown-core/concerns/layout_placeable.rb +1 -1
  20. data/lib/bridgetown-core/concerns/publishable.rb +2 -0
  21. data/lib/bridgetown-core/concerns/site/content.rb +4 -1
  22. data/lib/bridgetown-core/concerns/site/extensible.rb +6 -1
  23. data/lib/bridgetown-core/concerns/site/fast_refreshable.rb +33 -18
  24. data/lib/bridgetown-core/concerns/site/localizable.rb +2 -0
  25. data/lib/bridgetown-core/concerns/site/processable.rb +2 -0
  26. data/lib/bridgetown-core/concerns/site/renderable.rb +3 -0
  27. data/lib/bridgetown-core/concerns/site/ssr.rb +1 -2
  28. data/lib/bridgetown-core/concerns/site/writable.rb +1 -0
  29. data/lib/bridgetown-core/concerns/viewable.rb +46 -0
  30. data/lib/bridgetown-core/configuration.rb +29 -23
  31. data/lib/bridgetown-core/configurations/gh-pages/gh-pages.yml +5 -5
  32. data/lib/bridgetown-core/configurations/minitesting.rb +24 -64
  33. data/lib/bridgetown-core/converter.rb +2 -7
  34. data/lib/bridgetown-core/converters/erb_templates.rb +11 -7
  35. data/lib/bridgetown-core/converters/identity.rb +3 -11
  36. data/lib/bridgetown-core/converters/liquid_templates.rb +3 -5
  37. data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +1 -1
  38. data/lib/bridgetown-core/converters/markdown.rb +11 -14
  39. data/lib/bridgetown-core/converters/serbea_templates.rb +10 -8
  40. data/lib/bridgetown-core/drops/drop.rb +29 -42
  41. data/lib/bridgetown-core/drops/resource_drop.rb +3 -12
  42. data/lib/bridgetown-core/errors.rb +2 -8
  43. data/lib/bridgetown-core/filters/condition_helpers.rb +6 -9
  44. data/lib/bridgetown-core/filters/date_filters.rb +22 -35
  45. data/lib/bridgetown-core/filters/grouping_filters.rb +11 -11
  46. data/lib/bridgetown-core/filters.rb +53 -72
  47. data/lib/bridgetown-core/front_matter/defaults.rb +14 -19
  48. data/lib/bridgetown-core/generated_page.rb +6 -6
  49. data/lib/bridgetown-core/generators/prototype_generator.rb +0 -2
  50. data/lib/bridgetown-core/helpers.rb +2 -2
  51. data/lib/bridgetown-core/hooks.rb +0 -1
  52. data/lib/bridgetown-core/layout.rb +3 -4
  53. data/lib/bridgetown-core/liquid_extensions.rb +3 -5
  54. data/lib/bridgetown-core/log_adapter.rb +37 -56
  55. data/lib/bridgetown-core/plugin_manager.rb +7 -3
  56. data/lib/bridgetown-core/rack/boot.rb +7 -57
  57. data/lib/bridgetown-core/rack/default_config.ru +14 -0
  58. data/lib/bridgetown-core/rack/loader_hooks.rb +83 -0
  59. data/lib/bridgetown-core/rack/logger.rb +0 -2
  60. data/lib/bridgetown-core/rack/routes.rb +3 -2
  61. data/lib/bridgetown-core/resource/base.rb +8 -8
  62. data/lib/bridgetown-core/resource/permalink_processor.rb +1 -1
  63. data/lib/bridgetown-core/resource/relations.rb +3 -1
  64. data/lib/bridgetown-core/ruby_template_view.rb +0 -1
  65. data/lib/bridgetown-core/static_file.rb +15 -20
  66. data/lib/bridgetown-core/tags/class_map.rb +1 -1
  67. data/lib/bridgetown-core/tags/post_url.rb +2 -32
  68. data/lib/bridgetown-core/utils/initializers.rb +2 -2
  69. data/lib/bridgetown-core/utils/require_gems.rb +1 -3
  70. data/lib/bridgetown-core/utils.rb +41 -44
  71. data/lib/bridgetown-core/watcher.rb +2 -3
  72. data/lib/bridgetown-core.rb +29 -10
  73. data/lib/roda/plugins/bridgetown_server.rb +13 -25
  74. data/lib/roda/plugins/bridgetown_ssr.rb +21 -3
  75. data/lib/roda/plugins/flashier.rb +57 -0
  76. data/lib/roda/plugins/generic_index.html +127 -0
  77. data/lib/roda/plugins/ssg.rb +3 -2
  78. data/lib/site_template/config/initializers.rb +2 -0
  79. data/lib/site_template/package.json.erb +1 -0
  80. data/lib/site_template/postcss.config.js.erb +1 -1
  81. metadata +26 -7
  82. data/lib/bridgetown-core/commands/doctor.rb +0 -147
@@ -11,23 +11,19 @@ module Bridgetown
11
11
  error: ::Logger::ERROR,
12
12
  }.freeze
13
13
 
14
- # Public: Create a new instance of a log writer
14
+ # Create a new instance of a log writer
15
15
  #
16
- # writer - Logger compatible instance
17
- # log_level - (optional, symbol) the log level
18
- #
19
- # Returns nothing
16
+ # @param writer [Logger] compatible instance
17
+ # @param log_level [Symbol] the log level (`debug` | `info` | `warn` | `error`)
20
18
  def initialize(writer, level = :info)
21
19
  @messages = []
22
20
  @writer = writer
23
21
  self.log_level = level
24
22
  end
25
23
 
26
- # Public: Set the log level on the writer
27
- #
28
- # level - (symbol) the log level
24
+ # Set the log level on the writer
29
25
  #
30
- # Returns nothing
26
+ # @param log_level [Symbol] the log level (`debug` | `info` | `warn` | `error`)
31
27
  def log_level=(level)
32
28
  writer.level = level if level.is_a?(Integer) && level.between?(0, 3)
33
29
  writer.level = LOG_LEVELS[level] ||
@@ -45,63 +41,52 @@ module Bridgetown
45
41
  debug "Logging at level:", LOG_LEVELS.key(writer.level).to_s
46
42
  end
47
43
 
48
- # Public: Print a debug message
49
- #
50
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
51
- # message - the message detail
44
+ # Print a debug message
52
45
  #
53
- # Returns nothing
46
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
47
+ # @param message [String] the message detail
54
48
  def debug(topic, message = nil, &)
55
49
  write(:debug, topic, message, &)
56
50
  end
57
51
 
58
- # Public: Print a message
52
+ # Print an informational message
59
53
  #
60
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
61
- # message - the message detail
62
- #
63
- # Returns nothing
54
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
55
+ # @param message [String] the message detail
64
56
  def info(topic, message = nil, &)
65
57
  write(:info, topic, message, &)
66
58
  end
67
59
 
68
- # Public: Print a message
69
- #
70
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
71
- # message - the message detail
60
+ # Print a warning message
72
61
  #
73
- # Returns nothing
62
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
63
+ # @param message [String] the message detail
74
64
  def warn(topic, message = nil, &)
75
65
  write(:warn, topic, message, &)
76
66
  end
77
67
 
78
- # Public: Print an error message
79
- #
80
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
81
- # message - the message detail
68
+ # Print an error message
82
69
  #
83
- # Returns nothing
70
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
71
+ # @param message [String] the message detail
84
72
  def error(topic, message = nil, &)
85
73
  write(:error, topic, message, &)
86
74
  end
87
75
 
88
- # Public: Print an error message and immediately abort the process
76
+ # Print an error message and immediately abort the process
89
77
  #
90
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
91
- # message - the message detail (can be omitted)
92
- #
93
- # Returns nothing
78
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
79
+ # @param message [String] the message detail
94
80
  def abort_with(topic, message = nil, &)
95
81
  error(topic, message, &)
96
82
  abort
97
83
  end
98
84
 
99
- # Internal: Build a topic method
100
- #
101
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
102
- # message - the message detail
85
+ # Build a topic method
103
86
  #
104
- # Returns the formatted message
87
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
88
+ # @param message [String] the message detail
89
+ # @return [String] the formatted message
105
90
  def message(topic, message = nil)
106
91
  raise ArgumentError, "block or message, not both" if block_given? && message
107
92
 
@@ -113,34 +98,30 @@ module Bridgetown
113
98
  out
114
99
  end
115
100
 
116
- # Internal: Format the topic
117
- #
118
- # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
119
- # colon -
101
+ # Format the topic
120
102
  #
121
- # Returns the formatted topic statement
103
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
104
+ # @param colon [Boolean]
105
+ # @return [String] formatted topic statement
122
106
  def formatted_topic(topic, colon = false) # rubocop:disable Style/OptionalBooleanParameter
123
107
  "#{topic}#{colon ? ": " : " "}".rjust(20)
124
108
  end
125
109
 
126
- # Internal: Check if the message should be written given the log level.
110
+ # Check if the message should be written given the log level
127
111
  #
128
- # level_of_message - the Symbol level of message, one of :debug, :info, :warn, :error
129
- #
130
- # Returns whether the message should be written.
112
+ # @param level_of_message [Symbol] the message level (`debug` | `info` | `warn` | `error`)
113
+ # @return [Boolean] whether the message should be written to the log
131
114
  def write_message?(level_of_message)
132
115
  LOG_LEVELS.fetch(level) <= LOG_LEVELS.fetch(level_of_message)
133
116
  end
134
117
 
135
- # Internal: Log a message.
136
- #
137
- # level_of_message - the Symbol level of message, one of :debug, :info, :warn, :error
138
- # topic - the String topic or full message
139
- # message - the String message (optional)
140
- # block - a block containing the message (optional)
118
+ # Log a message. If a block is provided containing the message, use that instead.
141
119
  #
142
- # Returns false if the message was not written, otherwise returns the value of calling
143
- # the appropriate writer method, e.g. writer.info.
120
+ # @param level_of_message [Symbol] the message level (`debug` | `info` | `warn` | `error`)
121
+ # @param topic [String] e.g. "Configuration file", "Deprecation", etc.
122
+ # @param message [String] the message detail
123
+ # @return [BasicObject] false if the message was not written, otherwise returns the value of
124
+ # calling the appropriate writer method, e.g. writer.info.
144
125
  def write(level_of_message, topic, message = nil, &)
145
126
  return false unless write_message?(level_of_message)
146
127
 
@@ -81,12 +81,12 @@ module Bridgetown
81
81
  end
82
82
 
83
83
  def self.package_manager
84
- @package_manager ||= if File.exist?("package-lock.json")
85
- "npm"
86
- elsif File.exist?("yarn.lock")
84
+ @package_manager ||= if File.exist?("yarn.lock")
87
85
  "yarn"
88
86
  elsif File.exist?("pnpm-lock.yaml")
89
87
  "pnpm"
88
+ elsif File.exist?("package.json")
89
+ "npm"
90
90
  else
91
91
  ""
92
92
  end
@@ -96,6 +96,10 @@ module Bridgetown
96
96
  package_manager == "npm" ? "install" : "add"
97
97
  end
98
98
 
99
+ def self.package_manager_uninstall_command
100
+ package_manager == "npm" ? "uninstall" : "remove"
101
+ end
102
+
99
103
  # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
100
104
 
101
105
  # Iterates through loaded gems and finds npm-add gemspec metadata.
@@ -3,14 +3,16 @@
3
3
  require "zeitwerk"
4
4
  require "roda"
5
5
  require "json"
6
+ require "bridgetown"
6
7
 
7
- Bridgetown::Current.preloaded_configuration ||= Bridgetown.configuration
8
-
8
+ require_relative "loader_hooks"
9
9
  require_relative "logger"
10
10
  require_relative "routes"
11
11
 
12
12
  module Bridgetown
13
13
  module Rack
14
+ Bridgetown.begin!(with_config: :initializers)
15
+
14
16
  class << self
15
17
  # @return [Bridgetown::Utils::LoadersManager]
16
18
  attr_accessor :loaders_manager
@@ -23,61 +25,9 @@ module Bridgetown
23
25
  self.loaders_manager =
24
26
  Bridgetown::Utils::LoadersManager.new(Bridgetown::Current.preloaded_configuration)
25
27
  Bridgetown::Current.preloaded_configuration.run_initializers! context: :server
26
- autoload_server_folder
27
- rescue Roda::RodaError => e
28
- if e.message.include?("sessions plugin :secret option")
29
- raise Bridgetown::Errors::InvalidConfigurationError,
30
- "The Roda sessions plugin can't find a valid secret. Run `bin/bridgetown secret' " \
31
- "and put the key in a ENV var you can use to configure the session in the Roda app"
32
- end
33
-
34
- raise e
35
- end
36
-
37
- # @param root [String] root of Bridgetown site, defaults to config value
38
- def self.autoload_server_folder( # rubocop:todo Metrics
39
- root: Bridgetown::Current.preloaded_configuration.root_dir
40
- )
41
- server_folder = File.join(root, "server")
42
-
43
- Bridgetown::Hooks.register_one(
44
- :loader, :post_setup, reloadable: false
45
- ) do |loader, load_path|
46
- next unless load_path == server_folder
47
-
48
- loader.eager_load
49
- loader.do_not_eager_load(File.join(server_folder, "roda_app.rb"))
50
-
51
- unless ENV["BRIDGETOWN_ENV"] == "production"
52
- Listen.to(server_folder) do |modified, added, removed|
53
- c = modified + added + removed
54
- n = c.length
55
-
56
- Bridgetown.logger.info(
57
- "Reloading…",
58
- "#{n} file#{"s" if n > 1} changed at #{Time.now.strftime("%Y-%m-%d %H:%M:%S")}"
59
- )
60
- c.each do |path|
61
- Bridgetown.logger.info "", "- #{path["#{File.dirname(server_folder)}/".length..]}"
62
- end
63
-
64
- loader.reload
65
- loader.eager_load
66
- rescue SyntaxError => e
67
- Bridgetown::Errors.print_build_error(e)
68
- end.start
69
- end
70
- end
71
-
72
- Bridgetown::Hooks.register_one(
73
- :loader, :post_reload, reloadable: false
74
- ) do |loader, load_path|
75
- next unless load_path == server_folder
76
-
77
- loader.eager_load
78
- end
79
-
80
- loaders_manager.setup_loaders([server_folder])
28
+ LoaderHooks.autoload_server_folder(
29
+ File.join(Bridgetown::Current.preloaded_configuration.root_dir, "server")
30
+ )
81
31
  end
82
32
  end
83
33
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bridgetown-core/rack/boot"
4
+
5
+ Bridgetown::Rack.boot
6
+
7
+ unless defined?(RodaApp)
8
+ class RodaApp < Roda
9
+ plugin :bridgetown_server
10
+ route(&:bridgetown)
11
+ end
12
+ end
13
+
14
+ run RodaApp.freeze.app
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ module Rack
5
+ module LoaderHooks
6
+ # Sets up a Zeitwerk loader for the Roda routes in the server folder. Called by the server
7
+ # boot process when Rack starts up
8
+ #
9
+ # @param server_folder [String] typically `server` within the site root
10
+ def self.autoload_server_folder(server_folder)
11
+ reload_file_path = Bridgetown.live_reload_path
12
+
13
+ register_hooks server_folder, reload_file_path
14
+
15
+ Bridgetown::Rack.loaders_manager.setup_loaders([server_folder])
16
+ end
17
+
18
+ # Registers a `post_setup` and `post_reload` hook for the Zeitwerk loader in order to handle
19
+ # eager loading and, in development, the live reload watcher
20
+ #
21
+ # @param server_folder [String]
22
+ # @param reload_file_path [String] path to the special live reload txt file
23
+ def self.register_hooks(server_folder, reload_file_path) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
24
+ Bridgetown::Hooks.register_one(
25
+ :loader, :post_setup, reloadable: false
26
+ ) do |loader, load_path|
27
+ next unless load_path == server_folder
28
+
29
+ loader.eager_load
30
+ subclass_names = Roda.subclasses.map(&:name)
31
+ subclass_paths = Set.new
32
+
33
+ loader.all_expected_cpaths.each do |cpath, cname|
34
+ if subclass_names.include?(cname) && cpath.start_with?(server_folder)
35
+ subclass_paths << cpath
36
+ loader.do_not_eager_load cpath
37
+ end
38
+ end
39
+
40
+ unless ENV["BRIDGETOWN_ENV"] == "production"
41
+ setup_autoload_listener loader, server_folder, subclass_paths
42
+ end
43
+ end
44
+
45
+ Bridgetown::Hooks.register_one(
46
+ :loader, :post_reload, reloadable: false
47
+ ) do |loader, load_path|
48
+ next unless load_path == server_folder
49
+
50
+ loader.eager_load
51
+ Bridgetown.touch_live_reload_file(reload_file_path)
52
+ end
53
+ end
54
+
55
+ # Creates a listener to detect file changes within the server folder and notify Zeitwerk
56
+ #
57
+ # @param loader [Zeitwerk::Loader]
58
+ # @param server_loader [String]
59
+ # @param subclass_paths [Array<string>]
60
+ def self.setup_autoload_listener(loader, server_folder, subclass_paths)
61
+ Listen.to(server_folder) do |modified, added, removed|
62
+ c = modified + added + removed
63
+ n = c.length
64
+
65
+ unless n == 1 && subclass_paths.include?(c.first)
66
+ Bridgetown.logger.info(
67
+ "Reloading…",
68
+ "#{n} file#{"s" if n > 1} changed at #{Time.now.strftime("%Y-%m-%d %H:%M:%S")}"
69
+ )
70
+ c.each do |path|
71
+ Bridgetown.logger.info "", "- #{path["#{File.dirname(server_folder)}/".length..]}"
72
+ end
73
+ end
74
+
75
+ loader.reload
76
+ Bridgetown::Hooks.trigger :loader, :post_reload, loader, server_folder
77
+ rescue SyntaxError => e
78
+ Bridgetown::Errors.print_build_error(e)
79
+ end.start
80
+ end
81
+ end
82
+ end
83
+ end
@@ -7,8 +7,6 @@ module Bridgetown
7
7
  module Rack
8
8
  class Logger < Bridgetown::LogWriter
9
9
  def self.message_with_prefix(msg)
10
- # return if msg.include?("/_bridgetown/live_reload")
11
-
12
10
  "\e[35m[Server]\e[0m #{msg}"
13
11
  end
14
12
 
@@ -101,13 +101,14 @@ module Bridgetown
101
101
  Bridgetown::Rack::Routes.sorted_subclasses&.each do |klass|
102
102
  klass.merge roda_app
103
103
  end
104
+
105
+ nil # required for proper 404 handling
104
106
  end
105
107
 
106
108
  # @param app [Roda]
107
109
  def setup_live_reload(app) # rubocop:disable Metrics
108
110
  sleep_interval = 0.5
109
- file_to_check = File.join(Bridgetown::Current.preloaded_configuration.destination,
110
- "index.html")
111
+ file_to_check = Bridgetown.live_reload_path
111
112
  errors_file = Bridgetown.build_errors_path
112
113
 
113
114
  app.request.get "_bridgetown/live_reload" do
@@ -106,11 +106,7 @@ module Bridgetown
106
106
  #
107
107
  # @param new_data [HashWithDotAccess::Hash]
108
108
  def data=(new_data)
109
- if site.config.fast_refresh && write?
110
- # TODO: investigate if this would be better:
111
- # @data.value = front_matter_defaults
112
- mark_for_fast_refresh!
113
- end
109
+ mark_for_fast_refresh! if site.config.fast_refresh && write?
114
110
 
115
111
  Signalize.batch do
116
112
  @content_signal.value += 1
@@ -221,12 +217,12 @@ module Bridgetown
221
217
 
222
218
  # @return [String]
223
219
  def absolute_url
224
- format_url destination&.absolute_url
220
+ @absolute_url ||= format_url(destination&.absolute_url)
225
221
  end
226
222
 
227
223
  # @return [String]
228
224
  def relative_url
229
- format_url destination&.relative_url
225
+ @relative_url ||= format_url(destination&.relative_url)
230
226
  end
231
227
 
232
228
  # @return [String]
@@ -365,7 +361,11 @@ module Bridgetown
365
361
  past_values = @data.peek.select do |key|
366
362
  key == "categories" || key == "tags" || site.taxonomy_types.keys.any?(key)
367
363
  end
368
- model.attributes = model.origin.read
364
+ origin_data = model.origin.read
365
+ correct_locale = origin_data["locale"] || origin_data[:locale] || data.locale
366
+ model.attributes = origin_data
367
+ model.attributes.locale = correct_locale
368
+ @relative_url = @absolute_url = nil # wipe memoizations
369
369
  read!
370
370
  tax_diff = past_values.any? { |k, v| @data.peek[k] != v }
371
371
 
@@ -120,7 +120,7 @@ module Bridgetown
120
120
  end
121
121
 
122
122
  # @param resource [Bridgetown::Resource::Base]
123
- register_placeholder :name, ->(resource) do
123
+ register_placeholder :name, ->(resource) do # rubocop:disable Style/SymbolProc
124
124
  resource.basename_without_ext
125
125
  end
126
126
 
@@ -20,7 +20,9 @@ module Bridgetown
20
20
 
21
21
  # @return [HashWithDotAccess::Hash]
22
22
  def relation_schema
23
- resource.collection.metadata.relations
23
+ @relation_schema ||= resource.collection.metadata.relations&.transform_values do |value|
24
+ value.is_a?(Array) ? value.map(&:to_s) : value.to_s
25
+ end
24
26
  end
25
27
 
26
28
  # @return [Array<String>]
@@ -131,7 +131,6 @@ module Bridgetown
131
131
  def _partial_path(partial_name, ext)
132
132
  partial_name = partial_name.split("/").tap { _1.last.prepend("_") }.join("/")
133
133
 
134
- # TODO: see if there's a workaround for this to speed up performance
135
134
  site.in_source_dir(site.config[:partials_dir], "#{partial_name}.#{ext}")
136
135
  end
137
136
  end
@@ -48,11 +48,10 @@ module Bridgetown
48
48
  @path ||= File.join(*[@base, @dir, @name].compact)
49
49
  end
50
50
 
51
- # Obtain destination path.
51
+ # Obtain destination path
52
52
  #
53
- # dest - The String path to the destination dir.
54
- #
55
- # Returns destination file path.
53
+ # @param dest [String] path to the destination dir
54
+ # @return [String]
56
55
  def destination(dest)
57
56
  dest = site.in_dest_dir(dest)
58
57
  dest_url = url
@@ -76,22 +75,21 @@ module Bridgetown
76
75
 
77
76
  alias_method :date, :modified_time
78
77
 
79
- # Returns last modification time for this file.
78
+ # @return [Integer] last modification time for this file
80
79
  def mtime
81
80
  modified_time.to_i
82
81
  end
83
82
 
84
83
  # Is source path modified?
85
84
  #
86
- # Returns true if modified since last write.
85
+ # @return [Boolean] true if modified since last write
87
86
  def modified?
88
87
  self.class.mtimes[path] != mtime
89
88
  end
90
89
 
91
90
  # Whether to write the file to the filesystem
92
91
  #
93
- # Returns true unless the defaults for the destination path from
94
- # bridgetown.config.yml contain `published: false`.
92
+ # @return [Boolean] true unless the defaults for the destination path contain `published: false`
95
93
  def write?
96
94
  publishable = defaults.fetch("published", true)
97
95
  return publishable unless @collection
@@ -99,11 +97,10 @@ module Bridgetown
99
97
  publishable && @collection.write?
100
98
  end
101
99
 
102
- # Write the static file to the destination directory (if modified).
103
- #
104
- # dest - The String path to the destination dir.
100
+ # Write the static file to the destination directory (if modified)
105
101
  #
106
- # Returns false if the file was not modified since last time (no-op).
102
+ # @param dest [String] path to the destination dir
103
+ # @return [Boolean] false if the file was not modified since last time (no-op)
107
104
  def write(dest)
108
105
  dest_path = destination(dest)
109
106
  return false if File.exist?(dest_path) && !modified?
@@ -152,12 +149,12 @@ module Bridgetown
152
149
  #
153
150
  # NOTE: `String#gsub!` removes all trailing periods (in comparison to `String#chomp!`)
154
151
  #
155
- # Examples:
152
+ # @example
156
153
  # When `relative_path` is "_methods/site/my-cool-avatar...png":
157
154
  # cleaned_relative_path
158
155
  # # => "/site/my-cool-avatar"
159
156
  #
160
- # Returns the cleaned relative path of the static file.
157
+ # @return [String] cleaned relative path of the static file
161
158
  def cleaned_relative_path
162
159
  @cleaned_relative_path ||= begin
163
160
  cleaned = relative_path[0..-extname.length - 1]
@@ -169,7 +166,7 @@ module Bridgetown
169
166
 
170
167
  # Applies a similar URL-building technique as resources that takes
171
168
  # the collection's URL template into account. The default URL template can
172
- # be overriden in the collection's configuration in bridgetown.config.yml.
169
+ # be overriden in the collection's configuration
173
170
  def url
174
171
  @url ||= begin
175
172
  newly_processed = false
@@ -183,19 +180,17 @@ module Bridgetown
183
180
  end
184
181
  end
185
182
 
186
- # Returns the type of the collection if present, nil otherwise.
183
+ # @return [Symbol, nil] type of the collection if present
187
184
  def type
188
185
  @type ||= @collection&.label&.to_sym
189
186
  end
190
187
 
191
- # Returns the front matter defaults defined for the file's URL and/or type
192
- # as defined in bridgetown.config.yml.
188
+ # @return [Hash] front matter defaults defined for the file's URL and/or type
193
189
  def defaults
194
190
  @defaults ||= site.frontmatter_defaults.all url, type
195
191
  end
196
192
 
197
- # Returns a debug string on inspecting the static file.
198
- # Includes only the relative path of the object.
193
+ # @return [String] includes only the relative path of the object
199
194
  def inspect
200
195
  "#<#{self.class} @relative_path=#{relative_path.inspect}>"
201
196
  end
@@ -23,7 +23,7 @@ module Bridgetown
23
23
  class ClassMap < Liquid::Tag
24
24
  # @see https://api.rubyonrails.org/classes/ActiveModel/Type/Boolean.html
25
25
  FALSE_VALUES = [
26
- nil, "nil", "NIL", false, 0, "0", :"0", "f", :f, "F", :F, "false",
26
+ nil, "nil", "NIL", 0, "0", :"0", "f", :f, "F", :F, "false",
27
27
  false, "FALSE", :FALSE,
28
28
  ].to_set.freeze
29
29
 
@@ -12,7 +12,7 @@ module Bridgetown
12
12
 
13
13
  all, @path, @date, @slug = *name.sub(%r!^/!, "").match(MATCHER)
14
14
  unless all
15
- raise Bridgetown::Errors::InvalidPostNameError,
15
+ raise Bridgetown::Errors::FatalException,
16
16
  "'#{name}' does not contain valid date and/or title."
17
17
  end
18
18
 
@@ -31,24 +31,6 @@ module Bridgetown
31
31
  def ==(other)
32
32
  other.relative_path.to_s.match(@name_regex)
33
33
  end
34
-
35
- def deprecated_equality(other)
36
- slug == post_slug(other) &&
37
- post_date.year == other.date.year &&
38
- post_date.month == other.date.month &&
39
- post_date.day == other.date.day
40
- end
41
-
42
- private
43
-
44
- # Construct the directory-aware post slug for a Bridgetown::Post
45
- #
46
- # other - the Bridgetown::Post
47
- #
48
- # Returns the post slug with the subdirectory (relative to _posts)
49
- def post_slug(other)
50
- other.data.slug
51
- end
52
34
  end
53
35
 
54
36
  class PostUrl < Liquid::Tag
@@ -75,19 +57,7 @@ module Bridgetown
75
57
  site.collections.posts.resources.each do |document|
76
58
  return relative_url(document) if @post == document
77
59
 
78
- # New matching method did not match, fall back to old method
79
- # with deprecation warning if this matches
80
- next unless @post.deprecated_equality document
81
-
82
- Bridgetown::Deprecator.deprecation_message(
83
- "A call to " \
84
- "'{% post_url #{@post.name} %}' did not match " \
85
- "a post using the new matching method of checking name " \
86
- "(path-date-slug) equality. Please make sure that you " \
87
- "change this tag to match the post's name exactly."
88
- )
89
-
90
- return relative_url(document)
60
+ next
91
61
  end
92
62
 
93
63
  raise Bridgetown::Errors::PostURLError, <<~MSG
@@ -4,9 +4,9 @@ Bridgetown.initializer :dotenv do |config|
4
4
  Bridgetown.load_dotenv root: config.root_dir
5
5
  end
6
6
 
7
- Bridgetown.initializer :ssr do |config, setup: nil|
7
+ Bridgetown.initializer :ssr do |config, setup: nil, **options|
8
8
  config.roda do |app|
9
- app.plugin(:bridgetown_ssr, &setup)
9
+ app.plugin(:bridgetown_ssr, options, &setup)
10
10
  end
11
11
  end
12
12
 
@@ -4,13 +4,11 @@ module Bridgetown
4
4
  module Utils
5
5
  module RequireGems
6
6
  class << self
7
- #
8
7
  # Require a gem or gems. If it's not present, show a very nice error
9
8
  # message that explains everything and is much more helpful than the
10
9
  # normal LoadError.
11
10
  #
12
- # names - a string gem name or array of gem names
13
- #
11
+ # @param names [String, Array<String>] gem name or array of gem names
14
12
  def require_with_graceful_fail(names)
15
13
  Array(names).each do |name|
16
14
  Bridgetown.logger.debug "Requiring:", name.to_s