rack-www 2.0.0 → 2.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 +4 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +58 -1
- data/Guardfile +11 -0
- data/Rakefile +3 -3
- data/lib/rack/www.rb +26 -14
- data/lib/{rack-www.rb → rack_www.rb} +0 -0
- data/rack-www.gemspec +11 -8
- data/test/helper.rb +5 -6
- data/test/predicate_test.rb +15 -8
- data/test/subdomain_test.rb +29 -16
- data/test/www_false_test.rb +18 -9
- data/test/www_true_test.rb +33 -21
- metadata +46 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67bab3314c14a6baf165bf7697f2640e290cd9f9
|
4
|
+
data.tar.gz: 39c53a98db554ad2a7d178d9c62aa0fdac9b5deb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b3c507ada98ad3a4489c21a791b660257cb67db00ade55983ca8fecb2d5e35c77042736ad8295e257a75790558d8b14c17d874e8dc2c09e4689431302d3c307
|
7
|
+
data.tar.gz: 429293155e765b0fda94c704577b80f00a990715fb3a50be42a68c444d65f563006b2e8695d45761386a9cf8b0e23a77b6f1cb5d0ffe2695be51c202b00e9402
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,22 +1,79 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rack-www (2.
|
4
|
+
rack-www (2.1.0)
|
5
5
|
rack (~> 1.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
+
ast (2.1.0)
|
11
|
+
astrolabe (1.3.1)
|
12
|
+
parser (~> 2.2)
|
13
|
+
coderay (1.1.0)
|
14
|
+
ffi (1.9.10)
|
15
|
+
formatador (0.2.5)
|
16
|
+
guard (2.13.0)
|
17
|
+
formatador (>= 0.2.4)
|
18
|
+
listen (>= 2.7, <= 4.0)
|
19
|
+
lumberjack (~> 1.0)
|
20
|
+
nenv (~> 0.1)
|
21
|
+
notiffany (~> 0.0)
|
22
|
+
pry (>= 0.9.12)
|
23
|
+
shellany (~> 0.0)
|
24
|
+
thor (>= 0.18.1)
|
25
|
+
guard-compat (1.2.1)
|
26
|
+
guard-minitest (2.4.4)
|
27
|
+
guard-compat (~> 1.2)
|
28
|
+
minitest (>= 3.0)
|
29
|
+
guard-rubocop (1.2.0)
|
30
|
+
guard (~> 2.0)
|
31
|
+
rubocop (~> 0.20)
|
32
|
+
listen (3.0.5)
|
33
|
+
rb-fsevent (>= 0.9.3)
|
34
|
+
rb-inotify (>= 0.9)
|
35
|
+
lumberjack (1.0.9)
|
36
|
+
method_source (0.8.2)
|
10
37
|
minitest (5.8.3)
|
38
|
+
nenv (0.2.0)
|
39
|
+
notiffany (0.0.8)
|
40
|
+
nenv (~> 0.1)
|
41
|
+
shellany (~> 0.0)
|
42
|
+
parser (2.2.3.0)
|
43
|
+
ast (>= 1.1, < 3.0)
|
44
|
+
powerpack (0.1.1)
|
45
|
+
pry (0.10.3)
|
46
|
+
coderay (~> 1.1.0)
|
47
|
+
method_source (~> 0.8.1)
|
48
|
+
slop (~> 3.4)
|
11
49
|
rack (1.6.4)
|
12
50
|
rack-test (0.6.3)
|
13
51
|
rack (>= 1.0)
|
52
|
+
rainbow (2.0.0)
|
14
53
|
rake (10.4.2)
|
54
|
+
rb-fsevent (0.9.6)
|
55
|
+
rb-inotify (0.9.5)
|
56
|
+
ffi (>= 0.5.0)
|
57
|
+
rubocop (0.35.1)
|
58
|
+
astrolabe (~> 1.3)
|
59
|
+
parser (>= 2.2.3.0, < 3.0)
|
60
|
+
powerpack (~> 0.1)
|
61
|
+
rainbow (>= 1.99.1, < 3.0)
|
62
|
+
ruby-progressbar (~> 1.7)
|
63
|
+
tins (<= 1.6.0)
|
64
|
+
ruby-progressbar (1.7.5)
|
65
|
+
shellany (0.0.1)
|
66
|
+
slop (3.6.0)
|
67
|
+
thor (0.19.1)
|
68
|
+
tins (1.6.0)
|
15
69
|
|
16
70
|
PLATFORMS
|
17
71
|
ruby
|
18
72
|
|
19
73
|
DEPENDENCIES
|
74
|
+
guard (~> 2.13)
|
75
|
+
guard-minitest (~> 2.4)
|
76
|
+
guard-rubocop (~> 1.2)
|
20
77
|
minitest (~> 5.8)
|
21
78
|
rack-test (~> 0.6)
|
22
79
|
rack-www!
|
data/Guardfile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
guard :minitest do
|
2
|
+
# with Minitest::Unit
|
3
|
+
watch(%r{^test/(.*)\/?test_(.*)\.rb$})
|
4
|
+
watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
|
5
|
+
watch(%r{^test/test_helper\.rb$}) { 'test' }
|
6
|
+
end
|
7
|
+
|
8
|
+
guard :rubocop do
|
9
|
+
watch(/.+\.rb$/)
|
10
|
+
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
|
11
|
+
end
|
data/Rakefile
CHANGED
data/lib/rack/www.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
require 'rack'
|
2
2
|
require 'rack/request'
|
3
|
+
require 'ipaddr'
|
3
4
|
|
4
5
|
module Rack
|
6
|
+
# Rack::WWW
|
5
7
|
class WWW
|
6
8
|
def initialize(app, options = {})
|
7
|
-
@options = {:
|
9
|
+
@options = { subdomain: 'www' }.merge(options)
|
8
10
|
@app = app
|
9
11
|
|
10
|
-
@redirect =
|
12
|
+
@redirect = !@options[:www].nil? ? @options[:www] : true
|
11
13
|
@message = @options[:message]
|
12
14
|
@subdomain = @options[:subdomain]
|
13
15
|
@predicate = @options[:predicate]
|
@@ -22,9 +24,10 @@ module Rack
|
|
22
24
|
end
|
23
25
|
|
24
26
|
private
|
27
|
+
|
25
28
|
def redirect(env)
|
26
29
|
url = prepare_url(env)
|
27
|
-
headers = {
|
30
|
+
headers = { 'Content-Type' => 'text/html', 'location' => url }
|
28
31
|
|
29
32
|
if @message.respond_to?(:each)
|
30
33
|
message = @message
|
@@ -35,7 +38,7 @@ module Rack
|
|
35
38
|
end
|
36
39
|
|
37
40
|
def redirect?(env)
|
38
|
-
predicate?(env) && change_subdomain?(env)
|
41
|
+
predicate?(env) && change_subdomain?(env) && !ip_request?(env)
|
39
42
|
end
|
40
43
|
|
41
44
|
def predicate?(env)
|
@@ -51,27 +54,36 @@ module Rack
|
|
51
54
|
!@redirect && already_subdomain?(env)
|
52
55
|
end
|
53
56
|
|
57
|
+
def ip_request?(env)
|
58
|
+
IPAddr.new(env['SERVER_NAME'].to_s
|
59
|
+
.gsub(/^(#{@subdomain}\.)/, '')
|
60
|
+
.gsub(/^(www\.)/, ''))
|
61
|
+
rescue IPAddr::InvalidAddressError
|
62
|
+
false
|
63
|
+
end
|
64
|
+
|
54
65
|
def already_subdomain?(env)
|
55
|
-
env[
|
66
|
+
env['HTTP_HOST'].to_s.downcase =~ /^(#{@subdomain}\.)/
|
56
67
|
end
|
57
68
|
|
58
69
|
def prepare_url(env)
|
59
|
-
scheme = env[
|
60
|
-
host = env
|
61
|
-
port = env['SERVER_PORT'] == '80' ? '' : ":#{env['SERVER_PORT']}"
|
62
|
-
path = env["PATH_INFO"]
|
63
|
-
|
64
|
-
unless env["QUERY_STRING"].empty?
|
65
|
-
query_string = "?" + env["QUERY_STRING"]
|
66
|
-
end
|
70
|
+
scheme = env['rack.url_scheme']
|
71
|
+
host, port, path, query_string = extract_host(env)
|
67
72
|
|
68
73
|
if @redirect == true
|
69
74
|
host = "://#{@subdomain}." + host
|
70
75
|
else
|
71
|
-
host =
|
76
|
+
host = '://' + host
|
72
77
|
end
|
73
78
|
|
74
79
|
"#{scheme}#{host}#{port}#{path}#{query_string}"
|
75
80
|
end
|
81
|
+
|
82
|
+
def extract_host(env)
|
83
|
+
[env['SERVER_NAME'].to_s.gsub(/^(#{@subdomain}\.|www\.)/, ''),
|
84
|
+
env['SERVER_PORT'] == '80' ? '' : ":#{env['SERVER_PORT']}",
|
85
|
+
env['PATH_INFO'],
|
86
|
+
env['QUERY_STRING'].empty? ? '' : '?' + env['QUERY_STRING'].to_s]
|
87
|
+
end
|
76
88
|
end
|
77
89
|
end
|
File without changes
|
data/rack-www.gemspec
CHANGED
@@ -1,21 +1,24 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'rack-www'
|
3
|
-
s.version = '2.
|
3
|
+
s.version = '2.1.0'
|
4
4
|
s.date = '2015-12-02'
|
5
|
-
s.homepage =
|
6
|
-
s.email =
|
7
|
-
s.summary =
|
8
|
-
s.description =
|
9
|
-
s.licenses = [
|
10
|
-
s.authors = [
|
5
|
+
s.homepage = 'https://github.com/stjhimy/rack-www'
|
6
|
+
s.email = 'stjhimy@gmail.com'
|
7
|
+
s.summary = 'Force redirects to a any given subdomain.'
|
8
|
+
s.description = 'Rack middleware to force subdomain redirects.'
|
9
|
+
s.licenses = ['MIT']
|
10
|
+
s.authors = ['Jhimy Fernandes Villar']
|
11
11
|
|
12
12
|
s.files = `git ls-files`.split("\n")
|
13
13
|
s.test_files = `git ls-files -- test/*`.split("\n")
|
14
|
-
s.require_paths = [
|
14
|
+
s.require_paths = ['lib']
|
15
15
|
s.required_ruby_version = '>= 1.9.3'
|
16
16
|
|
17
17
|
s.add_runtime_dependency 'rack', '~> 1.0'
|
18
18
|
s.add_development_dependency 'rake', '~> 10.4'
|
19
19
|
s.add_development_dependency 'rack-test', '~> 0.6'
|
20
20
|
s.add_development_dependency 'minitest', '~> 5.8'
|
21
|
+
s.add_development_dependency 'guard', '~> 2.13'
|
22
|
+
s.add_development_dependency 'guard-minitest', '~> 2.4'
|
23
|
+
s.add_development_dependency 'guard-rubocop', '~> 1.2'
|
21
24
|
end
|
data/test/helper.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'rack/www'
|
2
2
|
require 'minitest/autorun'
|
3
3
|
require 'rack/test'
|
4
4
|
|
@@ -6,11 +6,10 @@ class TestClass < MiniTest::Test
|
|
6
6
|
include Rack::Test::Methods
|
7
7
|
|
8
8
|
def default_app
|
9
|
-
lambda
|
10
|
-
headers = {'Content-Type' =>
|
11
|
-
headers['
|
12
|
-
|
13
|
-
}
|
9
|
+
lambda do |_env|
|
10
|
+
headers = { 'Content-Type' => 'text/html' }
|
11
|
+
[200, headers, ['default body']]
|
12
|
+
end
|
14
13
|
end
|
15
14
|
|
16
15
|
def app
|
data/test/predicate_test.rb
CHANGED
@@ -1,20 +1,27 @@
|
|
1
|
-
require
|
1
|
+
require 'helper'
|
2
2
|
|
3
3
|
class PredicateTest < TestClass
|
4
4
|
def test_predicate_false
|
5
|
-
self.app = Rack::WWW.new(default_app, :
|
6
|
-
|
5
|
+
self.app = Rack::WWW.new(default_app, predicate: ->(_env) { false })
|
6
|
+
example
|
7
7
|
assert_equal last_response.status, 200
|
8
8
|
end
|
9
9
|
|
10
10
|
def test_predicate_true
|
11
|
-
self.app = Rack::WWW.new(default_app, :
|
12
|
-
|
13
|
-
assert_equal
|
11
|
+
self.app = Rack::WWW.new(default_app, predicate: ->(_env) { true })
|
12
|
+
example
|
13
|
+
assert_equal 'http://www.example.com/', last_response.headers['Location']
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_ignore_www_when_ip_request
|
17
|
+
get 'http://111.111.111.111/'
|
18
|
+
assert_equal last_response.status, 200
|
19
|
+
assert_equal '', last_response.headers['Location'].to_s
|
14
20
|
end
|
15
21
|
|
16
22
|
private
|
17
|
-
|
18
|
-
|
23
|
+
|
24
|
+
def example
|
25
|
+
get 'http://example.com/'
|
19
26
|
end
|
20
27
|
end
|
data/test/subdomain_test.rb
CHANGED
@@ -1,43 +1,56 @@
|
|
1
|
-
require
|
1
|
+
require 'helper'
|
2
2
|
|
3
3
|
class SubdomainTest < TestClass
|
4
4
|
def setup
|
5
|
-
self.app = Rack::WWW.new(default_app, :
|
5
|
+
self.app = Rack::WWW.new(default_app, subdomain: 's')
|
6
6
|
end
|
7
7
|
|
8
8
|
def test_if_allow_custom_subdomain
|
9
9
|
get 'http://example.com'
|
10
|
-
assert_equal 'http://
|
10
|
+
assert_equal 'http://s.example.com/',
|
11
|
+
last_response.headers['Location']
|
11
12
|
end
|
12
13
|
|
13
14
|
def test_custom_subdomain_with_path
|
14
|
-
get
|
15
|
-
assert_equal
|
15
|
+
get 'http://example.com/path/1'
|
16
|
+
assert_equal 'http://s.example.com/path/1',
|
17
|
+
last_response.headers['Location']
|
16
18
|
end
|
17
19
|
|
18
20
|
def test_custom_subdomain_with_path_and_www
|
19
|
-
get
|
20
|
-
assert_equal
|
21
|
+
get 'http://www.example.com/path/1'
|
22
|
+
assert_equal 'http://s.example.com/path/1',
|
23
|
+
last_response.headers['Location']
|
21
24
|
end
|
22
25
|
|
23
26
|
def test_custom_subdomain_with_query
|
24
|
-
get
|
25
|
-
assert_equal
|
27
|
+
get 'http://example.com/path/1?test=true'
|
28
|
+
assert_equal 'http://s.example.com/path/1?test=true',
|
29
|
+
last_response.headers['Location']
|
26
30
|
end
|
27
31
|
|
28
32
|
def test_custom_subdomain_with_query_and_www
|
29
|
-
get
|
30
|
-
assert_equal
|
33
|
+
get 'http://www.example.com/path/1?test=true'
|
34
|
+
assert_equal 'http://s.example.com/path/1?test=true',
|
35
|
+
last_response.headers['Location']
|
31
36
|
end
|
32
37
|
|
33
38
|
def test_body_with_custom_subdomain_and_message
|
34
|
-
self.app = Rack::WWW.new(default_app,
|
35
|
-
|
36
|
-
|
39
|
+
self.app = Rack::WWW.new(default_app,
|
40
|
+
subdomain: 'secure',
|
41
|
+
message: 'redirecting now!')
|
42
|
+
get 'http://example.com/'
|
43
|
+
assert_equal last_response.body, 'redirecting now!'
|
37
44
|
end
|
38
45
|
|
39
46
|
def test_body_with_custom_subdomain_without_message
|
40
|
-
get
|
41
|
-
assert_equal last_response.body,
|
47
|
+
get 'http://example.com/'
|
48
|
+
assert_equal last_response.body, ''
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_ignore_www_when_ip_request
|
52
|
+
get 'http://111.111.111.111/'
|
53
|
+
assert_equal last_response.status, 200
|
54
|
+
assert_equal '', last_response.headers['Location'].to_s
|
42
55
|
end
|
43
56
|
end
|
data/test/www_false_test.rb
CHANGED
@@ -1,27 +1,36 @@
|
|
1
|
-
require
|
1
|
+
require 'helper'
|
2
2
|
|
3
3
|
class FalseWWW < TestClass
|
4
4
|
def setup
|
5
|
-
self.app = Rack::WWW.new(default_app, :
|
5
|
+
self.app = Rack::WWW.new(default_app, www: false)
|
6
6
|
end
|
7
7
|
|
8
8
|
def test_www_false
|
9
|
-
get
|
10
|
-
assert_equal
|
9
|
+
get 'http://www.example.com/'
|
10
|
+
assert_equal 'http://example.com/',
|
11
|
+
last_response.headers['Location']
|
11
12
|
end
|
12
13
|
|
13
14
|
def test_www_false_with_path
|
14
|
-
get
|
15
|
-
assert_equal
|
15
|
+
get 'http://www.example.com/path/1'
|
16
|
+
assert_equal 'http://example.com/path/1',
|
17
|
+
last_response.headers['Location']
|
16
18
|
end
|
17
19
|
|
18
20
|
def test_www_false_with_query
|
19
|
-
get
|
20
|
-
assert_equal
|
21
|
+
get 'http://www.example.com/path/1?param=test'
|
22
|
+
assert_equal 'http://example.com/path/1?param=test',
|
23
|
+
last_response.headers['Location']
|
21
24
|
end
|
22
25
|
|
23
26
|
def test_www_false_non_www
|
24
|
-
get
|
27
|
+
get 'http://example.com/'
|
25
28
|
assert last_response.ok?
|
26
29
|
end
|
30
|
+
|
31
|
+
def test_ignore_www_when_ip_request
|
32
|
+
get 'http://111.111.111.111/'
|
33
|
+
assert_equal last_response.status, 200
|
34
|
+
assert_equal '', last_response.headers['Location'].to_s
|
35
|
+
end
|
27
36
|
end
|
data/test/www_true_test.rb
CHANGED
@@ -1,58 +1,70 @@
|
|
1
|
-
require
|
1
|
+
require 'helper'
|
2
2
|
|
3
3
|
class TrueWWW < TestClass
|
4
4
|
def setup
|
5
|
-
self.app = Rack::WWW.new(default_app, :
|
5
|
+
self.app = Rack::WWW.new(default_app, www: true)
|
6
6
|
end
|
7
7
|
|
8
8
|
def test_response_200
|
9
|
-
get
|
9
|
+
get 'http://www.example.com'
|
10
10
|
assert_equal last_response.status, 200
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_response_301
|
14
|
-
get
|
14
|
+
get 'http://example.com'
|
15
15
|
assert_equal last_response.status, 301
|
16
16
|
end
|
17
17
|
|
18
18
|
def test_redirects
|
19
|
-
get
|
20
|
-
assert_equal
|
19
|
+
get 'http://example.com/'
|
20
|
+
assert_equal 'http://www.example.com/', last_response.headers['Location']
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_www_true
|
24
|
-
get
|
25
|
-
assert_equal
|
24
|
+
get 'http://example.com/'
|
25
|
+
assert_equal 'http://www.example.com/', last_response.headers['Location']
|
26
26
|
end
|
27
27
|
|
28
28
|
def test_www_true_with_path
|
29
|
-
get
|
30
|
-
assert_equal
|
29
|
+
get 'http://example.com/path/1'
|
30
|
+
assert_equal 'http://www.example.com/path/1',
|
31
|
+
last_response.headers['Location']
|
31
32
|
end
|
32
33
|
|
33
34
|
def test_www_true_with_query
|
34
|
-
get
|
35
|
-
assert_equal
|
35
|
+
get 'http://example.com/path/1?param=test'
|
36
|
+
assert_equal 'http://www.example.com/path/1?param=test',
|
37
|
+
last_response.headers['Location']
|
36
38
|
end
|
37
39
|
|
38
40
|
def test_body_with_message
|
39
|
-
self.app = Rack::WWW.new(default_app,
|
40
|
-
|
41
|
-
|
41
|
+
self.app = Rack::WWW.new(default_app,
|
42
|
+
www: true,
|
43
|
+
message: 'redirecting now!')
|
44
|
+
get 'http://example.com/'
|
45
|
+
assert_equal last_response.body, 'redirecting now!'
|
42
46
|
end
|
43
47
|
|
44
48
|
def test_body_without_message
|
45
|
-
get
|
46
|
-
assert_equal last_response.body,
|
49
|
+
get 'http://example.com/'
|
50
|
+
assert_equal last_response.body, ''
|
47
51
|
end
|
48
52
|
|
49
53
|
def test_server_port
|
50
|
-
get
|
51
|
-
assert_equal
|
54
|
+
get 'http://example.com:8080/'
|
55
|
+
assert_equal 'http://www.example.com:8080/',
|
56
|
+
last_response.headers['Location']
|
52
57
|
end
|
53
58
|
|
54
59
|
def test_server_port_80
|
55
|
-
get
|
56
|
-
assert_equal
|
60
|
+
get 'http://example.com:80/'
|
61
|
+
assert_equal 'http://www.example.com/',
|
62
|
+
last_response.headers['Location']
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_ignore_www_when_ip_request
|
66
|
+
get 'http://111.111.111.111/'
|
67
|
+
assert_equal last_response.status, 200
|
68
|
+
assert_equal '', last_response.headers['Location'].to_s
|
57
69
|
end
|
58
70
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-www
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jhimy Fernandes Villar
|
@@ -66,6 +66,48 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '5.8'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.13'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.13'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: guard-minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2.4'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.4'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: guard-rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.2'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.2'
|
69
111
|
description: Rack middleware to force subdomain redirects.
|
70
112
|
email: stjhimy@gmail.com
|
71
113
|
executables: []
|
@@ -78,11 +120,12 @@ files:
|
|
78
120
|
- CHANGELOG.md
|
79
121
|
- Gemfile
|
80
122
|
- Gemfile.lock
|
123
|
+
- Guardfile
|
81
124
|
- LICENSE
|
82
125
|
- README.md
|
83
126
|
- Rakefile
|
84
|
-
- lib/rack-www.rb
|
85
127
|
- lib/rack/www.rb
|
128
|
+
- lib/rack_www.rb
|
86
129
|
- rack-www.gemspec
|
87
130
|
- test/helper.rb
|
88
131
|
- test/predicate_test.rb
|
@@ -112,7 +155,7 @@ rubyforge_project:
|
|
112
155
|
rubygems_version: 2.4.5.1
|
113
156
|
signing_key:
|
114
157
|
specification_version: 4
|
115
|
-
summary:
|
158
|
+
summary: Force redirects to a any given subdomain.
|
116
159
|
test_files:
|
117
160
|
- test/helper.rb
|
118
161
|
- test/predicate_test.rb
|