adsf 1.4.7 → 1.5.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: cd19b64a645ae62ffcc22dcf97cf5cb98d4ce756583755631646e03e369740a4
4
- data.tar.gz: aa88b49a59830d4298cf5b634258010d6b1d0757a4192de2a1fae156c81bf0af
3
+ metadata.gz: ed9bf6e0feaf4c359961448ad08440e789abdd038f0ec6df25ca94ce95692968
4
+ data.tar.gz: 6e32f017cf662136d6473ec9dafbefc83499cacaf0ead96b16a6dd4d12af3374
5
5
  SHA512:
6
- metadata.gz: c82f31a29d08c8d30e349e2e37188343516ae8dfe924aa96f027f55bb22553a6c521d40335bc20668e1190abcc8e662aeb0f920e0eca247e6d9cf2b6f3ee8f45
7
- data.tar.gz: 4ad549207aecfff4ac26468c63e5ec58a8971f8fd7b3db6179cf4c1783f266e16cfaaa4f2cc491bbe5b03e2f79c91befa251f07a224715aef8b2db3c2071e3a5
6
+ metadata.gz: 1126dbb61b6a3e326faa194afc2d2a314ffbacdcccb9ff77f01e1e8fcc28aa3af5f381476fbed1235fcc40bc2c53e8145d96be2f1cb837ae52cdc7dfeb493fb8
7
+ data.tar.gz: 2383433bbb5d8b86851ae3d4d2143a18a88e3e5ef38bd6afdbf30462e9c8210f5cfa972281b127bf3e257e05d44f3d6ea7a75f5a40daf72aa3706474daddb395
data/NEWS.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Release notes for adsf
2
2
 
3
+ ## 1.5.0 (2024-01-08)
4
+
5
+ Features:
6
+
7
+ * Add `-x`/`--auto-extensions` option (#33) [Paul Cantrell]
8
+
9
+ Enhancements:
10
+
11
+ * Add `-V`/`--version` CLI option (#35)
12
+
13
+ ## 1.4.8 (2023-10-14)
14
+
15
+ Fixes:
16
+
17
+ * Fixed deprecation warning for `Rack::File` (#30, #32)
18
+
3
19
  ## 1.4.7 (2023-03-18)
4
20
 
5
21
  Fixes:
data/README.md CHANGED
@@ -29,13 +29,36 @@ To use `adsf --live-reload`, please install the separate `adsf-live` gem. (The l
29
29
 
30
30
  ## Using adsf programmatically
31
31
 
32
+ ### Server
33
+
34
+ `Adsf::Server` runs a web server programmatically. For example:
35
+
36
+ ```ruby
37
+ server = Adsf::Server.new(root: 'public')
38
+
39
+ %w[INT TERM].each do |s|
40
+ Signal.trap(s) { server.stop }
41
+ end
42
+
43
+ server.run
44
+ ```
45
+
46
+ It takes the following options:
47
+
48
+ - `root` (required): the path to the web root
49
+ - `index_filenames` (optional; defaults to `['index.html']`): (see below)
50
+ - `auto_extensions` (optional; defaults to `[]`; can be a string or an array of strings): If present, the server will automatically append the given extensions when searching for files. For example, `auto_extensions: ".html"` would cause a request for `/foo` to serve `/foo.html` if there is no file or directory named `/foo`.
51
+ - `host` (optional; defaults to `'127.0.0.1'`): the address of the network interface to listen on
52
+ - `port` (optional; defaults to `3000`): the port to listen on
53
+ - `handler` (optional): the Rack handler to use
54
+
32
55
  ### IndexFileFinder
33
56
 
34
- The `Adsf::Rack::IndexFileFinder` middleware makes Rack load an index file (e.g. `index.html`) when requesting a directory. For example, the following runs a web server with the 'public' directory as its web root:
57
+ If you are assembling your own Rack configuration, you can use adsf’s `Adsf::Rack::IndexFileFinder` middleware to make Rack load an index file (e.g. `index.html`) when requesting a directory. For example, the following runs a web server with the 'public' directory as its web root:
35
58
 
36
59
  ```ruby
37
60
  use Adsf::Rack::IndexFileFinder, root: 'public'
38
- run Rack::File.new('public')
61
+ run Rack::Files.new('public')
39
62
  ```
40
63
 
41
64
  It takes the following options:
@@ -48,12 +71,12 @@ It takes the following options:
48
71
  use Adsf::Rack::IndexFileFinder,
49
72
  root: 'public',
50
73
  index_filenames: %w[index.html index.xhtml]
51
- run Rack::File.new('public')
74
+ run Rack::Files.new('public')
52
75
  ```
53
76
 
54
77
  **Why not use `Rack::Static`?** Rack comes with `Rack::Static`, whose purpose is similar to, but not the same as, `Adsf::Rack::IndexFileFinder`. In particular:
55
78
 
56
- - `Adsf::Rack::IndexFileFinder` does not serve files, unlike `Rack::Static`. `IndexFileFinder` only rewrites the incoming request and passes it on (usually to `Rack::File`).
79
+ - `Adsf::Rack::IndexFileFinder` does not serve files, unlike `Rack::Static`. `IndexFileFinder` only rewrites the incoming request and passes it on (usually to `Rack::Files`).
57
80
 
58
81
  - `Adsf::Rack::IndexFileFinder` supports multiple index files, while `Rack::Static` only supports one (you could have multiple `Rack::Static` middlewares, one for each index filenames, though).
59
82
 
@@ -61,31 +84,10 @@ It takes the following options:
61
84
 
62
85
  - When requesting a directory without specifying the trailing slash, `Adsf::Rack::IndexFileFinder` will redirect to the URL with a trailing slash, unlike `Rack::Static`. This mimics the behavior of typical HTTP servers. For example, when requesting `/foo`, when a `foo` directory exists and it contains `index.html`, `IndexFileFinder` will redirect to `/foo/`.
63
86
 
64
- ### Server
65
-
66
- `Adsf::Server` runs a web server programmatically. For example:
67
-
68
- ```ruby
69
- server = Adsf::Server.new(root: 'public')
70
-
71
- %w[INT TERM].each do |s|
72
- Signal.trap(s) { server.stop }
73
- end
74
-
75
- server.run
76
- ```
77
-
78
- It takes the following options:
79
-
80
- - `root` (required): the path to the web root
81
- - `index_filenames` (optional; defaults to `['index.html']`): (see above)
82
- - `host` (optional; defaults to `'127.0.0.1'`): the address of the network interface to listen on
83
- - `port` (optional; defaults to `3000`): the port ot listen on
84
- - `handler` (optional): the Rack handler to use
85
-
86
87
  ## Contributors
87
88
 
88
89
  - Ed Brannin
89
90
  - Larissa Reis
90
91
  - Mark Meves
91
92
  - Vipul Amler
93
+ - Paul Cantrell
data/bin/adsf CHANGED
@@ -25,10 +25,19 @@ OptionParser.new do |opts|
25
25
  exit
26
26
  end
27
27
 
28
+ opts.on('-V', '--version', 'Show version') do |_o|
29
+ puts "adsf version #{Adsf::VERSION} © 2009–… Denis Defreyne."
30
+ exit
31
+ end
32
+
28
33
  opts.on('-i', '--index-filenames [index-filenames]', 'Specify index filenames (comma-separated)') do |o|
29
34
  options[:index_filenames] = o.split(',')
30
35
  end
31
36
 
37
+ opts.on('-x', '--auto-extensions [extensions]', 'Specify suffixes to automatically apply to requests (comma-separated, including dot)') do |o|
38
+ options[:auto_extensions] = o.split(',')
39
+ end
40
+
32
41
  opts.on('-p', '--port [port]', Integer, 'Specify the port number to use') do |o|
33
42
  options[:port] = o
34
43
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Adsf::Rack
4
+ class AutoFileExtensions
5
+ def initialize(app, root:, extensions:)
6
+ @app = app
7
+ @root = root
8
+ # Search list starts with '' so that we first look for file as requested
9
+ @search_suffixes = [''] + Array(extensions).map { |ext| ".#{ext}" }
10
+ end
11
+
12
+ def call(env)
13
+ path_info = ::Rack::Utils.unescape(env['PATH_INFO'])
14
+ path = ::File.join(@root, path_info)
15
+
16
+ new_env = env
17
+ @search_suffixes.each do |suffix|
18
+ new_path = path + suffix
19
+ next unless ::File.exist?(new_path)
20
+
21
+ new_env = env.dup # only dup if needed
22
+ new_env['PATH_INFO'] += suffix
23
+ break
24
+ end
25
+
26
+ @app.call(new_env)
27
+ end
28
+ end
29
+ end
data/lib/adsf/rack.rb CHANGED
@@ -8,3 +8,4 @@ end
8
8
  require 'adsf/rack/index_file_finder'
9
9
  require 'adsf/rack/caching'
10
10
  require 'adsf/rack/cors'
11
+ require 'adsf/rack/auto_file_extensions'
data/lib/adsf/server.rb CHANGED
@@ -2,10 +2,19 @@
2
2
 
3
3
  module Adsf
4
4
  class Server
5
- def initialize(root:, live: false, index_filenames: ['index.html'], host: '127.0.0.1', port: 3000, handler: nil)
5
+ def initialize(
6
+ root:,
7
+ live: false,
8
+ host: '127.0.0.1',
9
+ port: 3000,
10
+ index_filenames: ['index.html'],
11
+ auto_extensions: [],
12
+ handler: nil
13
+ )
6
14
  @root = root
7
15
  @live = live
8
16
  @index_filenames = index_filenames
17
+ @auto_extensions = auto_extensions
9
18
  @host = host
10
19
  @port = port
11
20
  @handler = handler
@@ -15,7 +24,11 @@ module Adsf
15
24
 
16
25
  def run
17
26
  handler = build_handler
18
- app = build_app(root: @root, index_filenames: @index_filenames)
27
+ app = build_app(
28
+ root: @root,
29
+ index_filenames: @index_filenames,
30
+ auto_extensions: @auto_extensions,
31
+ )
19
32
  start_watcher if @live
20
33
 
21
34
  url = "http://#{@host}:#{@port}/"
@@ -47,7 +60,7 @@ module Adsf
47
60
  server.stop
48
61
  end
49
62
 
50
- def build_app(root:, index_filenames:)
63
+ def build_app(root:, index_filenames:, auto_extensions:)
51
64
  is_live = @live
52
65
 
53
66
  ::Rack::Builder.new do
@@ -60,13 +73,16 @@ module Adsf
60
73
  use Adsf::Rack::IndexFileFinder,
61
74
  root: root,
62
75
  index_filenames: index_filenames
76
+ use Adsf::Rack::AutoFileExtensions,
77
+ root: root,
78
+ extensions: auto_extensions
63
79
 
64
80
  if is_live
65
81
  require 'adsf/live'
66
82
  use ::Rack::LiveReload, no_swf: true, source: :vendored
67
83
  end
68
84
 
69
- run ::Rack::File.new(root)
85
+ run ::Rack::Files.new(root)
70
86
  end.to_app
71
87
  end
72
88
 
data/lib/adsf/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Adsf
4
- VERSION = '1.4.7'
4
+ VERSION = '1.5.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adsf
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.7
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Defreyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-18 00:00:00.000000000 Z
11
+ date: 2024-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -56,6 +56,7 @@ files:
56
56
  - bin/adsf
57
57
  - lib/adsf.rb
58
58
  - lib/adsf/rack.rb
59
+ - lib/adsf/rack/auto_file_extensions.rb
59
60
  - lib/adsf/rack/caching.rb
60
61
  - lib/adsf/rack/cors.rb
61
62
  - lib/adsf/rack/index_file_finder.rb
@@ -81,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
82
  - !ruby/object:Gem::Version
82
83
  version: '0'
83
84
  requirements: []
84
- rubygems_version: 3.4.8
85
+ rubygems_version: 3.5.4
85
86
  signing_key:
86
87
  specification_version: 4
87
88
  summary: a tiny static file server