roda 3.30.0 → 3.31.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40d384d8a60174df9dcfdb645c5bf607232c44012827659d06691561666d2a74
4
- data.tar.gz: 7f8cfedfb18a5125be0cbc7bb77cd60b45f2f869717ae163c9779be3bc054264
3
+ metadata.gz: 2d6d28c0f8b5197ab3d2a74726150921a435ccdcd8f18c6eb2c9bbe4d1cb2a14
4
+ data.tar.gz: f1464284c0cb20638bc7575769271c6ea39642ff3b1842fad33b92759db915cd
5
5
  SHA512:
6
- metadata.gz: d5619d3e9ac99a426662057ba932ae8477d251e8252710f9fce7b33ffb5ccaec45673c3b933906d71e45ec1b4be6444467d5d7ad3be04df6123b66e19432ea4f
7
- data.tar.gz: 0da11db1409e19bf6a11b5c2f9e88da573b9e00175de4bf753da1fab2d4877a1ef84013a5194d349237fbc362205efccbc03fd0b56ba800fc6e903583baf9cf1
6
+ metadata.gz: 4fca0abe3d0072e0a3e7201a089fd708610933ce4d461496bb0c13cbf7d84d2d10010c4007c460953972070d782742dba4d88799fd608f3df1ef7cca58cecef1
7
+ data.tar.gz: 189a647f809aa732baebc225ea313c59e543d0d0935c8008a85084694161753e0939a7cac4c1f9d010e03785ec792d49b6c3e5643925066e1cda12d0b7701237
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ = 3.31.0 (2020-04-15)
2
+
3
+ * Add :relative option to path method in path plugin, for generating a method returning relative paths (jeremyevans)
4
+
5
+ * Add relative_path plugin, for turning absolute paths to paths relative to the current request (jeremyevans)
6
+
1
7
  = 3.30.0 (2020-03-13)
2
8
 
3
9
  * Support :relative_paths assets plugin option to use relative paths for the assets (jeremyevans)
@@ -0,0 +1,11 @@
1
+ = New Features
2
+
3
+ * A relative_paths plugin has been added, adding a relative_path
4
+ method that will take an absolute path and make it relative to the
5
+ current request by prepending an appropriate prefix. This is
6
+ helpful when using Roda as a static site generator to generate a
7
+ site that can be hosted at any subpath or directly from the
8
+ filesystem.
9
+
10
+ * In the path plugin, the path method now accepts a :relative
11
+ option for generating relative paths instead of absolute paths.
@@ -325,10 +325,14 @@ class Roda
325
325
 
326
326
  # Load the render, caching, and h plugins, since the assets plugin
327
327
  # depends on them.
328
- def self.load_dependencies(app, _opts = nil)
328
+ def self.load_dependencies(app, opts = OPTS)
329
329
  app.plugin :render
330
330
  app.plugin :caching
331
331
  app.plugin :h
332
+
333
+ if opts[:relative_paths]
334
+ app.plugin :relative_path
335
+ end
332
336
  end
333
337
 
334
338
  # Setup the options for the plugin. See the Assets module RDoc
@@ -647,10 +651,9 @@ class Roda
647
651
  end
648
652
  end
649
653
 
650
- if relative_paths && (slash_count = request.path.count('/')) >= 1
651
- relative_prefix = "../" * (slash_count - 1)
654
+ if relative_paths
652
655
  paths.map! do |path|
653
- "#{relative_prefix}#{path.slice(1,100000000)}"
656
+ "#{relative_prefix}#{path}"
654
657
  end
655
658
  end
656
659
 
@@ -55,6 +55,8 @@ class Roda
55
55
  # :add_script_name :: Prefix the path generated with SCRIPT_NAME. This defaults to the app's
56
56
  # :add_script_name option.
57
57
  # :name :: Provide a different name for the method, instead of using <tt>*_path</tt>.
58
+ # :relative :: Generate paths relative to the current request instead of absolute paths by prepending
59
+ # an appropriate prefix. This implies :add_script_name.
58
60
  # :url :: Create a url method in addition to the path method, which will prefix the string generated
59
61
  # with the appropriate scheme, host, and port. If true, creates a <tt>*_url</tt>
60
62
  # method. If a Symbol or String, uses the value as the url method name.
@@ -121,16 +123,31 @@ class Roda
121
123
 
122
124
  meth = opts[:name] || "#{name}_path"
123
125
  url = opts[:url]
126
+ url_only = opts[:url_only]
127
+ relative = opts[:relative]
124
128
  add_script_name = opts.fetch(:add_script_name, self.opts[:add_script_name])
125
129
 
126
- if add_script_name || url || opts[:url_only]
130
+ if relative
131
+ if (url || url_only)
132
+ raise RodaError, "cannot provide :url or :url_only option if using :relative option"
133
+ end
134
+ add_script_name = true
135
+ plugin :relative_path
136
+ end
137
+
138
+ if add_script_name || url || url_only || relative
127
139
  _meth = "_#{meth}"
128
140
  define_method(_meth, &block)
129
141
  private _meth
130
142
  end
131
143
 
132
- unless opts[:url_only]
133
- if add_script_name
144
+ unless url_only
145
+ if relative
146
+ define_method(meth) do |*a, &blk|
147
+ # Allow calling private _method to get path
148
+ relative_path(request.script_name.to_s + send(_meth, *a, &blk))
149
+ end
150
+ elsif add_script_name
134
151
  define_method(meth) do |*a, &blk|
135
152
  # Allow calling private _method to get path
136
153
  request.script_name.to_s + send(_meth, *a, &blk)
@@ -140,7 +157,7 @@ class Roda
140
157
  end
141
158
  end
142
159
 
143
- if url || opts[:url_only]
160
+ if url || url_only
144
161
  url_meth = if url.is_a?(String) || url.is_a?(Symbol)
145
162
  url
146
163
  else
@@ -0,0 +1,73 @@
1
+ # frozen-string-literal: true
2
+
3
+ #
4
+ class Roda
5
+ module RodaPlugins
6
+ # The relative_path plugin adds a relative_path method that accepts
7
+ # an absolute path and returns a path relative to the current request
8
+ # by adding an appropriate prefix:
9
+ #
10
+ # plugin :relative_path
11
+ # route do |r|
12
+ # relative_path("/foo")
13
+ # end
14
+ #
15
+ # # GET /
16
+ # "./foo"
17
+ #
18
+ # # GET /bar
19
+ # "./foo"
20
+ #
21
+ # # GET /bar/
22
+ # "../foo"
23
+ #
24
+ # # GET /bar/baz/quux
25
+ # "../../foo"
26
+ #
27
+ # It also offers a relative_prefix method that returns a string that can
28
+ # be prepended to an absolute path. This can be more efficient if you
29
+ # need to convert multiple paths.
30
+ #
31
+ # This plugin is mostly designed for applications using Roda as a static
32
+ # site generator, where the generated site can be hosted at any subpath.
33
+ module RelativePath
34
+ module InstanceMethods
35
+ # Return a relative path for the absolute path based on the current path
36
+ # of the request by adding the appropriate prefix.
37
+ def relative_path(absolute_path)
38
+ relative_prefix + absolute_path
39
+ end
40
+
41
+ # Return a relative prefix to append to an absolute path to a relative path
42
+ # based on the current path of the request.
43
+ def relative_prefix
44
+ env = @_request.env
45
+ script_name = env["SCRIPT_NAME"]
46
+ path_info = env["PATH_INFO"]
47
+
48
+ # Check path begins with slash. All valid paths should, but in case this
49
+ # request is bad, just skip using a relative prefix.
50
+ case script_name.getbyte(0)
51
+ when nil # SCRIPT_NAME empty
52
+ unless path_info.getbyte(0) == 47 # PATH_INFO starts with /
53
+ return ''
54
+ end
55
+ when 47 # SCRIPT_NAME starts with /
56
+ # nothing
57
+ else
58
+ return ''
59
+ end
60
+
61
+ slash_count = script_name.count('/') + path_info.count('/')
62
+ if slash_count > 1
63
+ ("../" * (slash_count - 2)) << ".."
64
+ else
65
+ "."
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ register_plugin(:relative_path, RelativePath)
72
+ end
73
+ end
@@ -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 = 30
7
+ RodaMinorVersion = 31
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.30.0
4
+ version: 3.31.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: 2020-03-13 00:00:00.000000000 Z
11
+ date: 2020-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -206,6 +206,7 @@ extra_rdoc_files:
206
206
  - doc/release_notes/3.28.0.txt
207
207
  - doc/release_notes/3.29.0.txt
208
208
  - doc/release_notes/3.30.0.txt
209
+ - doc/release_notes/3.31.0.txt
209
210
  files:
210
211
  - CHANGELOG
211
212
  - MIT-LICENSE
@@ -237,6 +238,7 @@ files:
237
238
  - doc/release_notes/3.29.0.txt
238
239
  - doc/release_notes/3.3.0.txt
239
240
  - doc/release_notes/3.30.0.txt
241
+ - doc/release_notes/3.31.0.txt
240
242
  - doc/release_notes/3.4.0.txt
241
243
  - doc/release_notes/3.5.0.txt
242
244
  - doc/release_notes/3.6.0.txt
@@ -316,6 +318,7 @@ files:
316
318
  - lib/roda/plugins/placeholder_string_matchers.rb
317
319
  - lib/roda/plugins/precompile_templates.rb
318
320
  - lib/roda/plugins/public.rb
321
+ - lib/roda/plugins/relative_path.rb
319
322
  - lib/roda/plugins/render.rb
320
323
  - lib/roda/plugins/render_each.rb
321
324
  - lib/roda/plugins/render_locals.rb