rackstaticapp 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b75d295d744a5d99244465bf09f844411d6454aee410078f250b1189fb07859e
4
+ data.tar.gz: 43a72ce12e72f8de8d009dafce6d28dfa34924ede1ef95cf01282c4d653d7b18
5
+ SHA512:
6
+ metadata.gz: 723187e70cddd2b1ecf20e60fed9662a09d9c67f765500aa1e9bb50db7b1c3db9bfa9eae277943fef39130b22c27f65a673a38dd070c14768fdc7bb4dd73c037
7
+ data.tar.gz: b1b5e00ea182da1211d6934fffe5683f627c833983a18f955248ee5c7d771270fc19973e9095047c257eca3332241d86e68e27f81acf51508a4c3aa2a499e366
@@ -0,0 +1,58 @@
1
+ name: Release
2
+ on:
3
+ push:
4
+ branches:
5
+ - "master" # main only
6
+
7
+ permissions:
8
+ contents: write
9
+ pull-requests: write
10
+
11
+ jobs:
12
+ release:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: GoogleCloudPlatform/release-please-action@v2
16
+ id: release
17
+ with:
18
+ release-type: ruby
19
+ package-name: rackstaticapp
20
+ bump-minor-pre-major: true
21
+ bump-patch-for-minor-pre-major: true
22
+ version-file: "lib/rackstaticapp/version.rb"
23
+
24
+ # Checkout code if release was created
25
+ - uses: actions/checkout@v2
26
+ if: ${{ steps.release.outputs.release_created }}
27
+
28
+ # Setup ruby if a release was created
29
+ - uses: ruby/setup-ruby@v1
30
+ with:
31
+ bundler-cache: true
32
+ if: ${{ steps.release.outputs.release_created }}
33
+ - name: Run tests
34
+ run: |
35
+ bundle exec rake test
36
+ if: ${{ steps.release.outputs.release_created }}
37
+
38
+ # Publish
39
+ - name: publish gem
40
+ run: |
41
+ mkdir -p $HOME/.gem
42
+ touch $HOME/.gem/credentials
43
+ chmod 0600 $HOME/.gem/credentials
44
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
45
+ bundle exec rake build
46
+ gem push pkg/*.gem
47
+ env:
48
+ # Make sure to update the secret name
49
+ # if yours isn't named RUBYGEMS_AUTH_TOKEN
50
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
51
+ if: ${{ steps.release.outputs.release_created }}
52
+
53
+ - name: Upload Release Artifact
54
+ if: ${{ steps.release.outputs.release_created }}
55
+ env:
56
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
57
+ run:
58
+ gh release upload ${{ steps.release.outputs.tag_name }} pkg/*.gem
@@ -0,0 +1,18 @@
1
+ name: Run tests
2
+ on:
3
+ push:
4
+ branches:
5
+ - "**" # matches every branch
6
+
7
+ jobs:
8
+ run-tests:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - name: Set up Ruby
13
+ uses: ruby/setup-ruby@v1
14
+ with:
15
+ bundler-cache: true
16
+ - name: Run tests
17
+ run: |
18
+ bundle exec rake test
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.2.2
data/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (2023-09-10)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * Integrated PR [#6](https://www.github.com/iphoting/RackStaticApp/issues/6) from upstream Vienna repo. ([5e560b0](https://www.github.com/iphoting/RackStaticApp/commit/5e560b02fddf9c5e3b57b98c1cbd2c2c1db8cfa3))
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'yard'
3
+
4
+ task :default => :test
5
+
6
+ desc 'Run tests'
7
+ task :test do
8
+ Dir.chdir 'spec'
9
+ system 'ruby -I ../lib spec.rb'
10
+ end
11
+
12
+ YARD::Rake::YardocTask.new do |t|
13
+ t.files = ['lib/**/*.rb']
14
+ t.options = ['--markup=markdown']
15
+ end
@@ -0,0 +1,3 @@
1
+ module RackStaticApp
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,98 @@
1
+ require 'rackstaticapp/version'
2
+ require 'rack'
3
+ require 'vienna'
4
+
5
+ ##
6
+ # Zero-configuration convenience wrapper around `RackStaticApp::Application`, which inherits from `Vienna::Application`.
7
+ # Add this to your `config.ru`:
8
+ #
9
+ # require 'rackstaticapp'
10
+ # run RackStaticApp
11
+ #
12
+ # Your static site in `public` will be served.
13
+ #
14
+
15
+ module RackStaticApp
16
+
17
+ class << self
18
+ def call(env)
19
+ Application.new.call(env)
20
+ end
21
+ end
22
+
23
+ ##
24
+ # `RackStaticApp::Static` is just a wrapper for `Rack::Static` with
25
+ # sane and opinionated options.
26
+ #
27
+ # It serves all files under the given `root` and doesn't passes on requests
28
+ # for files that don't exist.
29
+ #
30
+ # Examples
31
+ #
32
+ # use RackStaticApp::Static, 'public'
33
+ #
34
+
35
+ class Static < Vienna::Static
36
+ def initialize(app, root)
37
+ super
38
+ end
39
+
40
+ def urls
41
+ [""]
42
+ end
43
+
44
+ def root
45
+ super
46
+ end
47
+
48
+ def index
49
+ super
50
+ end
51
+
52
+ def header_rules
53
+ super
54
+ end
55
+
56
+ def options
57
+ {urls: urls, root: root, index: index, header_rules: header_rules, cascade: true}
58
+ end
59
+ end
60
+
61
+ ##
62
+ # `RackStaticApp::NotFound` is a default endpoint not unlike `Rack::NotFound`.
63
+ # Initialize it with the path to a 404 page and its contents will be served.
64
+ # The difference is that if a 404 page doesn't exist, a default response,
65
+ # 'Not Found' will be served.
66
+ #
67
+ # Examples
68
+ #
69
+ # run RackStaticApp::NotFound.new('public/404.html')
70
+ #
71
+ # run RackStaticApp::NotFound.new # Always return 'Not Found'
72
+ #
73
+
74
+ class NotFound < Vienna::NotFound
75
+ end
76
+
77
+ ##
78
+ # `RackStaticApp::Application` serves all files under the given root directory
79
+ # using `RackStaticApp::Static`. If a file/path doen't exist, `RackStaticApp::NotFound`
80
+ # is run, which always returns a status of `404` and the contents of
81
+ # `404.html` or `'Not Found'` if one does not exist.
82
+ #
83
+ # Examples
84
+ #
85
+ # run RackStaticApp::Application.new('_site')
86
+ #
87
+ # run RackStaticApp::Application.new # The root defaults to 'public'
88
+ #
89
+
90
+ class Application < Vienna::Application
91
+ def initialize(root = 'public')
92
+ @app = Rack::Builder.new do
93
+ use Static, root
94
+ run NotFound.new("#{root}/404.html")
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'rackstaticapp/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rackstaticapp"
7
+ s.version = RackStaticApp::VERSION
8
+ s.summary = "An update to the Vienna, a tiny zero-config rack app to serve static files"
9
+ s.description = "A tiny zero-config Rack App to serve static files"
10
+ s.authors = ["Ronald Ip", "Mikael Konutgan"]
11
+ s.email = "myself@iphoting.com"
12
+ s.homepage =
13
+ "https://rubygems.org/gems/rackstaticapp"
14
+ s.license = "MIT"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.executables = s.files.grep(/^bin\//) { |f| File.basename(f) }
18
+ s.test_files = s.files.grep(/^(test|spec|features)\//)
19
+ s.require_paths = ['lib']
20
+
21
+ s.add_runtime_dependency 'rack', '~> 2.0'
22
+ s.add_runtime_dependency 'vienna', '~> 0.4.0'
23
+
24
+ s.add_development_dependency 'bundler', '~> 2.0'
25
+ s.add_development_dependency 'rake', '~> 12.0'
26
+ s.add_development_dependency 'minitest', '~> 5.0'
27
+ s.add_development_dependency 'yard', '~> 0.9'
28
+ end
@@ -0,0 +1 @@
1
+ 404
@@ -0,0 +1 @@
1
+ about
@@ -0,0 +1 @@
1
+ style
@@ -0,0 +1 @@
1
+ image
@@ -0,0 +1 @@
1
+ index
data/spec/spec.rb ADDED
@@ -0,0 +1,64 @@
1
+ require 'minitest/autorun'
2
+ require 'rack/mock'
3
+ require 'rackstaticapp'
4
+
5
+ describe RackStaticApp do
6
+ before do
7
+ app = Rack::Builder.new do
8
+ use Rack::Lint
9
+ run RackStaticApp
10
+ end
11
+
12
+ @request = Rack::MockRequest.new(app)
13
+ end
14
+
15
+ describe 'when requesting the root directory' do
16
+ before do
17
+ @res = @request.get('/')
18
+ end
19
+
20
+ it 'should serve the index path' do
21
+ _(@res.body.chomp).must_equal 'index'
22
+ end
23
+
24
+ it 'should return a valid status code, that is 200: OK or 304: Not Modified' do
25
+ _([200, 304]).must_include @res.status
26
+ end
27
+ end
28
+
29
+ describe 'when requesting the path of a subdirectory of the root directory' do
30
+ before do
31
+ @paths = {
32
+ '/css/style.css' => 'style',
33
+ '/images/image.svg' => 'image',
34
+ '/about.html' => 'about'
35
+ }
36
+ end
37
+
38
+ it 'should serve the contents of the paths' do
39
+ @paths.each do |path, body|
40
+ _(@request.get(path).body.chomp).must_equal body
41
+ end
42
+ end
43
+
44
+ it 'should cache all responses for a an hour' do
45
+ @paths.each do |path, body|
46
+ _(@request.get(path).headers['Cache-Control']).must_equal 'public, max-age=3600'
47
+ end
48
+ end
49
+ end
50
+
51
+ describe 'when requesting a path that does not exist' do
52
+ before do
53
+ @res = @request.get('/path')
54
+ end
55
+
56
+ it 'should serve the contents of `404.html` if the file exists' do
57
+ _(@res.body.chomp).must_equal '404'
58
+ end
59
+
60
+ it 'should return the status code 404: Not Found' do
61
+ _(@res.status).must_equal 404
62
+ end
63
+ end
64
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rackstaticapp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ronald Ip
8
+ - Mikael Konutgan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2023-09-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '2.0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '2.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: vienna
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 0.4.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 0.4.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '2.0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '2.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '12.0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '12.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: minitest
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '5.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '5.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: yard
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '0.9'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '0.9'
98
+ description: A tiny zero-config Rack App to serve static files
99
+ email: myself@iphoting.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".github/workflows/release.yml"
105
+ - ".github/workflows/test.yml"
106
+ - ".gitignore"
107
+ - ".ruby-version"
108
+ - CHANGELOG.md
109
+ - Gemfile
110
+ - Rakefile
111
+ - lib/rackstaticapp.rb
112
+ - lib/rackstaticapp/version.rb
113
+ - rackstaticapp.gemspec
114
+ - spec/public/404.html
115
+ - spec/public/about.html
116
+ - spec/public/css/style.css
117
+ - spec/public/images/image.svg
118
+ - spec/public/index.html
119
+ - spec/spec.rb
120
+ homepage: https://rubygems.org/gems/rackstaticapp
121
+ licenses:
122
+ - MIT
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubygems_version: 3.4.10
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: An update to the Vienna, a tiny zero-config rack app to serve static files
143
+ test_files:
144
+ - spec/public/404.html
145
+ - spec/public/about.html
146
+ - spec/public/css/style.css
147
+ - spec/public/images/image.svg
148
+ - spec/public/index.html
149
+ - spec/spec.rb