roda 3.75.0 → 3.76.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4ebdbc5b5707ba21044b5f4c83445ff8fca6a3925488c72a5176cc662c2ad15b
4
- data.tar.gz: ac528e50bfe1e778b5b4d32d16d12e117e87dc55b2f7cad1170b682e2f979586
3
+ metadata.gz: 1f4eee948a9994645560f635fd228d2f46f3f466da782a476d7046b2b0b9f026
4
+ data.tar.gz: 4abb6bed043b264c59e17b1120771822a26292f24037a283c08003168c72e602
5
5
  SHA512:
6
- metadata.gz: b7d13975d6c7705f1d7b184f27430320e1dfd5fea96e532f119f86b4c09fdb5c7e460107033d8d099c6ef8da354a514289981163d74cdb293b89074299a57eda
7
- data.tar.gz: d16c1b3a2edd401a73b104bf9458fcb865e441f4de649dcfcb8144eb3102abcd6abee741ecbbbf1cad3b13d8efca7260d7785b7e5a2505f29541ad001de9b1e4
6
+ metadata.gz: 112d90a74ed25ae0bb608a2e89d2f6fa757912287feb3a68d312ef4b8fd317bdb8f04eb76f529090d14a92c322d869ededa831f8db5d20bce8a66cd973a71584
7
+ data.tar.gz: 22ddb0a055b5849c6dcd3ec93426e495198434cf1e9cf9adbae1c22ece9b788c0ea7332122b9ad525954e2b946b0eef873de3b0466fe5b844407dec6c9844c84
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ = 3.76.0 (2024-01-12)
2
+
3
+ * Support :filter plugin option in error_mail and error_email for filtering parameters, environment variables, and session values (jeremyevans) (#346)
4
+
5
+ * Set temporary name on Ruby 3.3 in middleware plugin for middleware class created (janko) (#344)
6
+
7
+ * Add break plugin, for using break inside a routing block to return from the block and keep routing (jeremyevans)
8
+
1
9
  = 3.75.0 (2023-12-14)
2
10
 
3
11
  * Add cookie_flags plugin, for overriding, warning, or raising for incorrect cookie flags (jeremyevans)
@@ -0,0 +1,18 @@
1
+ = New Features
2
+
3
+ * A break plugin has been added, allowing you to use break from
4
+ inside a routing block and continue routing after the block. This
5
+ offers the same feature as the pass plugin, but using the standard
6
+ break keyword instead of the r.pass method.
7
+
8
+ * The error_mail and error_email features now both accept a :filter
9
+ plugin option. The value should respond to call with two arguments.
10
+ The first arguments is the key, and the second is the value, and
11
+ should return a truthy value if the value should be filtered. This
12
+ will be used for filtering parameter values, ENV values, and session
13
+ values in the generated emails.
14
+
15
+ = Other Improvements
16
+
17
+ * On Ruby 3.3+, the middleware plugin sets a temporary class name for
18
+ the created middleware, based on the class name of the Roda app.
@@ -0,0 +1,43 @@
1
+ # frozen-string-literal: true
2
+
3
+ #
4
+ class Roda
5
+ module RodaPlugins
6
+ # The break plugin supports calling break inside a match block, to
7
+ # return from the block and continue in the routing tree, restoring
8
+ # the remaining path so that future matchers operating on the path
9
+ # operate as expected.
10
+ #
11
+ # plugin :break
12
+ #
13
+ # route do |r|
14
+ # r.on "foo", :bar do |bar|
15
+ # break if bar == 'baz'
16
+ # "/foo/#{bar} (not baz)"
17
+ # end
18
+ #
19
+ # r.on "foo/baz" do
20
+ # "/foo/baz"
21
+ # end
22
+ # end
23
+ #
24
+ # This provides the same basic feature as the pass plugin, but
25
+ # uses Ruby's standard control flow primative instead of a
26
+ # separate method.
27
+ module Break
28
+ module RequestMethods
29
+ private
30
+
31
+ # Handle break inside match blocks, restoring remaining path.
32
+ def if_match(_)
33
+ rp = @remaining_path
34
+ super
35
+ ensure
36
+ @remaining_path = rp
37
+ end
38
+ end
39
+ end
40
+
41
+ register_plugin(:break, Break)
42
+ end
43
+ end
@@ -21,6 +21,9 @@ class Roda
21
21
  #
22
22
  # Options:
23
23
  #
24
+ # :filter :: Callable called with the key and value for each parameter, environment
25
+ # variable, and session value. If it returns true, the value of the
26
+ # parameter is filtered in the email.
24
27
  # :from :: The From address to use in the email (required)
25
28
  # :headers :: A hash of additional headers to use in the email (default: empty hash)
26
29
  # :host :: The SMTP server to use to send the email (default: localhost)
@@ -38,6 +41,7 @@ class Roda
38
41
  # use an error reporting service instead of this plugin.
39
42
  module ErrorEmail
40
43
  DEFAULTS = {
44
+ :filter=>lambda{|k,v| false},
41
45
  :headers=>OPTS,
42
46
  :host=>'localhost',
43
47
  # :nocov:
@@ -52,7 +56,12 @@ class Roda
52
56
  {'From'=>h[:from], 'To'=>h[:to], 'Subject'=>"#{h[:prefix]}#{subject}"}
53
57
  end,
54
58
  :body=>lambda do |s, e|
55
- format = lambda{|h| h.map{|k, v| "#{k.inspect} => #{v.inspect}"}.sort.join("\n")}
59
+ filter = s.opts[:error_email][:filter]
60
+ format = lambda do |h|
61
+ h = h.map{|k, v| "#{k.inspect} => #{filter.call(k, v) ? 'FILTERED' : v.inspect}"}
62
+ h.sort!
63
+ h.join("\n")
64
+ end
56
65
 
57
66
  begin
58
67
  params = s.request.params
@@ -21,6 +21,9 @@ class Roda
21
21
  #
22
22
  # Options:
23
23
  #
24
+ # :filter :: Callable called with the key and value for each parameter, environment
25
+ # variable, and session value. If it returns true, the value of the
26
+ # parameter is filtered in the email.
24
27
  # :from :: The From address to use in the email (required)
25
28
  # :headers :: A hash of additional headers to use in the email (default: empty hash)
26
29
  # :prefix :: A prefix to use in the email's subject line (default: no prefix)
@@ -36,9 +39,12 @@ class Roda
36
39
  # for low traffic web applications. For high traffic web applications,
37
40
  # use an error reporting service instead of this plugin.
38
41
  module ErrorMail
42
+ DEFAULT_FILTER = lambda{|k,v| false}
43
+ private_constant :DEFAULT_FILTER
44
+
39
45
  # Set default opts for plugin. See ErrorEmail module RDoc for options.
40
46
  def self.configure(app, opts=OPTS)
41
- app.opts[:error_mail] = email_opts = (app.opts[:error_mail] || OPTS).merge(opts).freeze
47
+ app.opts[:error_mail] = email_opts = (app.opts[:error_mail] || {:filter=>DEFAULT_FILTER}).merge(opts).freeze
42
48
  unless email_opts[:to] && email_opts[:from]
43
49
  raise RodaError, "must provide :to and :from options to error_mail plugin"
44
50
  end
@@ -68,8 +74,13 @@ class Roda
68
74
  e.to_s
69
75
  end
70
76
  subject = "#{email_opts[:prefix]}#{subject}"
77
+ filter = email_opts[:filter]
71
78
 
72
- format = lambda{|h| h.map{|k, v| "#{k.inspect} => #{v.inspect}"}.sort.join("\n")}
79
+ format = lambda do |h|
80
+ h = h.map{|k, v| "#{k.inspect} => #{filter.call(k, v) ? 'FILTERED' : v.inspect}"}
81
+ h.sort!
82
+ h.join("\n")
83
+ end
73
84
 
74
85
  begin
75
86
  params = request.params
@@ -134,6 +134,9 @@ class Roda
134
134
  # and store +app+ as the next middleware to call.
135
135
  def initialize(mid, app, *args, &block)
136
136
  @mid = Class.new(mid)
137
+ # :nocov:
138
+ @mid.set_temporary_name("#{mid.name}(middleware)") if mid.name && RUBY_VERSION >= "3.3"
139
+ # :nocov:
137
140
  if @mid.opts[:middleware_next_if_not_found]
138
141
  @mid.plugin(:not_found, &NEXT_PROC)
139
142
  end
data/lib/roda/version.rb CHANGED
@@ -4,7 +4,7 @@ class Roda
4
4
  RodaMajorVersion = 3
5
5
 
6
6
  # The minor version of Roda, updated for new feature releases of Roda.
7
- RodaMinorVersion = 75
7
+ RodaMinorVersion = 76
8
8
 
9
9
  # The patch version of Roda, updated only for bug fixes from the last
10
10
  # feature release.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roda
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.75.0
4
+ version: 3.76.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-14 00:00:00.000000000 Z
11
+ date: 2024-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -249,6 +249,7 @@ extra_rdoc_files:
249
249
  - doc/release_notes/3.73.0.txt
250
250
  - doc/release_notes/3.74.0.txt
251
251
  - doc/release_notes/3.75.0.txt
252
+ - doc/release_notes/3.76.0.txt
252
253
  - doc/release_notes/3.8.0.txt
253
254
  - doc/release_notes/3.9.0.txt
254
255
  files:
@@ -331,6 +332,7 @@ files:
331
332
  - doc/release_notes/3.73.0.txt
332
333
  - doc/release_notes/3.74.0.txt
333
334
  - doc/release_notes/3.75.0.txt
335
+ - doc/release_notes/3.76.0.txt
334
336
  - doc/release_notes/3.8.0.txt
335
337
  - doc/release_notes/3.9.0.txt
336
338
  - lib/roda.rb
@@ -351,6 +353,7 @@ files:
351
353
  - lib/roda/plugins/autoload_named_routes.rb
352
354
  - lib/roda/plugins/backtracking_array.rb
353
355
  - lib/roda/plugins/branch_locals.rb
356
+ - lib/roda/plugins/break.rb
354
357
  - lib/roda/plugins/caching.rb
355
358
  - lib/roda/plugins/capture_erb.rb
356
359
  - lib/roda/plugins/chunked.rb
@@ -494,7 +497,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
494
497
  - !ruby/object:Gem::Version
495
498
  version: '0'
496
499
  requirements: []
497
- rubygems_version: 3.4.10
500
+ rubygems_version: 3.5.3
498
501
  signing_key:
499
502
  specification_version: 4
500
503
  summary: Routing tree web toolkit